2 L4DIR ?= $(PKGDIR)/../..
4 CXXFLAGS_amd64 += -mcmodel=medium
5 CFLAGS_amd64 += -mcmodel=medium
7 include $(L4DIR)/mk/Makeconf
9 SYSTEMS = x86 arm amd64 ppc32
10 TARGET = libuc_c.a libuc_c.so
12 LDFLAGS = -z combreloc -z relro --sort-common \
13 --sort-section alignment --warn-common \
16 LDFLAGS_libuc_c.so := -init __uClibc_init
19 SYSDEPS := libc/sysdeps/linux
20 VPATH_SRC_BASE = $(OBJ_DIR)
22 FILES_all := $(PKGDIR_ABS)/lib/uclibc/contrib_files_all.lst
23 FILES_x86 := $(PKGDIR_ABS)/lib/uclibc/contrib_files_x86.lst
24 FILES_arm := $(PKGDIR_ABS)/lib/uclibc/contrib_files_arm.lst
25 FILES_amd64 := $(PKGDIR_ABS)/lib/uclibc/contrib_files_amd64.lst
26 FILES_ppc32 := $(PKGDIR_ABS)/lib/uclibc/contrib_files_ppc32.lst
27 CONTRIB_DIR := $(PKGDIR_ABS)/lib/contrib/uclibc
28 PTHLIB_DIR := $(PKGDIR_ABS)/lib/libpthread
31 UCLIBC_ARCH_x86 := i386
32 UCLIBC_ARCH_arm := arm
33 UCLIBC_ARCH_amd64 := x86_64
34 UCLIBC_ARCH_ppc32 := powerpc
35 UCLIBC_ARCH := $(UCLIBC_ARCH_$(ARCH))
36 DIRS := libc/stdio libc/stdlib libc/stdlib/malloc libc/string \
37 libc/string/$(UCLIBC_ARCH) libc/string/generic \
38 libc/inet libc/misc libc/misc/assert libc/misc/ctype \
39 libc/misc/dirent libc/misc/error libc/misc/internals \
40 libc/misc/locale libc/misc/elf \
41 libc/misc/time libc/pwd_grp libc/unistd libc/termios \
42 libc/misc/wctype libc/misc/wchar libc/misc/fnmatch \
43 libc/misc/glob libc/misc/search libc libcrypt \
44 libc/signal $(SYSDEPS)/$(UCLIBC_ARCH) \
45 $(SYSDEPS)/common libm libm/$(UCLIBC_ARCH)
47 BOTH_SRC_CC := $(foreach arch,all $(ARCH),\
48 $(foreach dir,$(DIRS), \
49 $(addprefix ARCH-$(arch)/$(dir)/,\
50 $(notdir $(wildcard ../ARCH-$(arch)/$(dir)/*.cc)))))
51 BOTH_SRC_C := $(foreach arch,all $(ARCH),\
52 $(foreach dir,$(DIRS), \
53 $(addprefix ARCH-$(arch)/$(dir)/,\
54 $(notdir $(wildcard ../ARCH-$(arch)/$(dir)/*.c)))))
55 BOTH_SRC_S := $(foreach arch,all $(ARCH),\
56 $(foreach dir,$(DIRS), \
57 $(addprefix ARCH-$(arch)/$(dir)/,\
58 $(notdir $(wildcard ../ARCH-$(arch)/$(dir)/*.S)))))
60 # some files cannot be compiled alone but are included by
61 # other files and thus needs to be linked
62 BOTH_SRC_C := $(filter-out ARCH-all/libc/misc/fnmatch/fnmatch_loop.c ARCH-all/libc/pwd_grp/pwd_grp_internal.c ARCH-ppc32/libc/string/generic/_memcpy_fwd.c,$(BOTH_SRC_C))
64 STATICONLY_SRC_C := dl-core.c
66 SRC_C_libuc_c.a := $(BOTH_SRC_C)
67 SRC_C_libuc_c.so := $(filter-out $(addprefix %/,$(STATICONLY_SRC_C)), $(BOTH_SRC_C))
68 SRC_CC_libuc_c.a := $(BOTH_SRC_CC)
69 SRC_CC_libuc_c.so := $(BOTH_SRC_CC)
70 SRC_S_libuc_c.a := $(BOTH_SRC_S)
71 SRC_S_libuc_c.so := $(BOTH_SRC_S)
73 private_incdirs = $(SRC_DIR)/ARCH-$(ARCH)/include $(SRC_DIR)/ARCH-all/include \
74 $(OBJ_DIR)/ARCH-$(ARCH)/include $(OBJ_DIR)/ARCH-all/include \
75 $(OBJ_DIR)/ARCH-all/libc/string \
76 $(SRC_DIR)/../contrib/uclibc/libc/misc/internals \
77 $(if $(1),$(OBJ_BASE)/include/$(ARCH)/$(L4API)) \
78 $(OBJ_BASE)/include/$(ARCH) \
80 $(OBJ_BASE)/include/uclibc \
81 $(SRC_DIR)/../contrib/uclibc/libcrypt
83 PRIVATE_INCDIR = $(call private_incdirs)
84 LIBCINCDIR = $(addprefix -I,$(GCCINCDIR))
85 CPPFLAGS += -nostdinc -include \
86 $(OBJ_DIR)/ARCH-all/include/libc-symbols.h
87 CFLAGS += -fno-builtin
88 CFLAGS += -DUCLIBC_INTERNAL
89 # CFLAGS += -std=iso9899:199901
90 DEFINES = -DNDEBUG -D_LIBC -D__UCLIBC_CTOR_DTOR__
91 WARNINGS = -Wall -Wstrict-prototypes
93 CPPFLAGS_dl-iterate-phdr.c += -I$(SRC_DIR)/../contrib/uclibc/ldso/include \
94 -I$(SRC_DIR)/../contrib/uclibc/ldso/ldso/$(UCLIBC_ARCH)
95 CPPFLAGS_dl-core.c += -I$(SRC_DIR)/../contrib/uclibc/ldso/ldso/$(UCLIBC_ARCH) \
96 -I$(SRC_DIR)/../contrib/uclibc/ldso/include
97 CPPFLAGS_$(OBJ_DIR)/ARCH-all/libc/inet += -DRESOLVER="\"resolv.c\""
99 PRIVATE_INCDIR_ARCH-all/libc/string/wcslen.o = $(SRC_DIR)/../contrib/uclibc/libc/string
100 PRIVATE_INCDIR_ARCH-all/libc/string/wcslen.s.o = $(SRC_DIR)/../contrib/uclibc/libc/string
101 PRIVATE_INCDIR_ARCH-all/libc/string/wcsnlen.o = $(SRC_DIR)/../contrib/uclibc/libc/string
102 PRIVATE_INCDIR_ARCH-all/libc/string/wcsnlen.s.o = $(SRC_DIR)/../contrib/uclibc/libc/string
103 PRIVATE_INCDIR_ARCH-all/libc/string/wmemcpy.o = $(SRC_DIR)/../contrib/uclibc/libc/string
104 PRIVATE_INCDIR_ARCH-all/libc/string/wmemcpy.s.o = $(SRC_DIR)/../contrib/uclibc/libc/string
106 PRIVATE_INCDIR_ARCH-all/libc/misc/search/hcreate_r.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
107 PRIVATE_INCDIR_ARCH-all/libc/misc/search/hcreate_r.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
108 PRIVATE_INCDIR_ARCH-all/libc/misc/search/hdestroy_r.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
109 PRIVATE_INCDIR_ARCH-all/libc/misc/search/hdestroy_r.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
110 PRIVATE_INCDIR_ARCH-all/libc/misc/search/hsearch_r.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
111 PRIVATE_INCDIR_ARCH-all/libc/misc/search/hsearch_r.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
112 PRIVATE_INCDIR_ARCH-all/libc/misc/search/lfind.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
113 PRIVATE_INCDIR_ARCH-all/libc/misc/search/lfind.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
114 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tfind.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
115 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tfind.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
116 PRIVATE_INCDIR_ARCH-all/libc/misc/search/lsearch.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
117 PRIVATE_INCDIR_ARCH-all/libc/misc/search/lsearch.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
118 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tdestroy.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
119 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tdestroy.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
120 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tdelete.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
121 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tdelete.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
122 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tsearch.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
123 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tsearch.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
124 PRIVATE_INCDIR_ARCH-all/libc/misc/search/twalk.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
125 PRIVATE_INCDIR_ARCH-all/libc/misc/search/twalk.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
128 DEFINES += -DL4_THREAD_SAFE
129 LDFLAGS_r/libuc_c.so := $(LDFLAGS_libuc_c.so)
130 SRC_C_r/libuc_c.a := $(SRC_C_libuc_c.a)
131 SRC_C_r/libuc_c.so := $(SRC_C_libuc_c.so) libpthread/src/forward.c
132 SRC_CC_r/libuc_c.a := $(SRC_CC_libuc_c.a)
133 SRC_CC_r/libuc_c.so := $(SRC_CC_libuc_c.so)
134 SRC_S_r/libuc_c.a := $(SRC_S_libuc_c.a)
135 SRC_S_r/libuc_c.so := $(SRC_S_libuc_c.so)
136 PRIVATE_INCDIR = $(call private_incdirs,1)
137 vpath libpthread/src/forward.c $(PTHLIB_DIR)/..
138 PRIVATE_INCDIR_libpthread/src/forward.s.o += $(PTHLIB_DIR)/src/sysdeps/$(UCLIBC_ARCH_$(ARCH)) \
144 BUILD_ARCHS := all $(BUILD_ARCH)
146 .general.d: $(FILES_x86) $(FILE_arm) $(FILES_amd64) $(FILES_all)
150 INCDIRS = $(addsuffix /include,$(addprefix $(OBJ_DIR)/ARCH-,$(BUILD_ARCHS)))
151 INCDIRS_OBJ_m = $(addsuffix /Makefile,$(INCDIRS))
156 $(VERBOSE)install -d $(dir $@)
157 $(VERBOSE)echo 'PKGDIR ?= $(PKGDIR_ABS)' > $@
158 $(VERBOSE)echo 'L4DIR ?= $(L4DIR_ABS)' >> $@
159 $(VERBOSE)echo 'OBJ_BASE ?= $(OBJ_BASE)' >> $@
160 $(VERBOSE)echo 'OBJ_DIR ?= $(OBJ_DIR)' >> $@
161 $(VERBOSE)echo 'INSTALL_INC_PREFIX = $$(PKGNAME)' >> $@
162 $(VERBOSE)echo 'include $$(L4DIR)/mk/include.mk' >> $@
166 include:: $(addprefix $(OBJ_DIR)/ARCH-,$(addsuffix /links-done,$(BUILD_ARCHS))) $(INCDIRS_OBJ_m)
167 $(VERBOSE)for i in $(INCDIRS); do \
168 PWD=$$i $(MAKE) -C $$i all; \
172 $(VERBOSE)set -e; $(foreach d,$(INCDIRS), \
173 if [ -f $d/Makefile ]; then \
174 PWD=$(PWD)/$d $(MAKE) -C $d $@ $(MKFLAGS); \
177 # ok, we have a list of files to check in FILES
179 # check if it exists, yes? go on
180 # no? create an apropriate link with a relative path to the contrib dir
182 REBUILD_LINKS_CONTRIB = \
184 cat contrib_files_$${arch}.lst | while read file flags; \
186 path_file=`dirname $${file}`; \
187 path_ctrb=`dirname $(CONTRIB_DIR)/$${file}`; \
188 if [ -n "$${flags}" ]; then \
189 dest="$${path_file}/$${flags}.c"; \
193 if [ "$${path_file}" = "$(SYSDEPS)/i386/bits" -o \
194 "$${path_file}" = "$(SYSDEPS)/arm/bits" -o \
195 "$${path_file}" = "$(SYSDEPS)/x86_64/bits" -o \
196 "$${path_file}" = "$(SYSDEPS)/powerpc/bits" -o \
197 "$${path_file}" = "$(SYSDEPS)/common/bits" ]; then \
198 if [ \( ! -e ARCH-$${arch}/include/bits/`basename $${dest}` \) \
199 -a \( -e $(CONTRIB_DIR)/$${file} \) ]; then \
200 b=`basename $${file}`; \
201 from=$${path_ctrb}/$$b; \
202 to=$(OBJ_DIR)/ARCH-$${arch}/include/bits/$$b; \
204 elif [ "$${path_file}" = "$(SYSDEPS)/i386/sys" -o \
205 "$${path_file}" = "$(SYSDEPS)/arm/sys" -o \
206 "$${path_file}" = "$(SYSDEPS)/x86_64/sys" -o \
207 "$${path_file}" = "$(SYSDEPS)/powerpc/sys" -o \
208 "$${path_file}" = "$(SYSDEPS)/common/sys" ]; then \
209 if [ \( ! -e ARCH-$${arch}/include/sys/`basename $${dest}` \) \
210 -a \( -e $(CONTRIB_DIR)/$${file} \) ]; then \
211 b=`basename $${file}`; \
212 from=$${path_ctrb}/$$b; \
213 to=$(OBJ_DIR)/ARCH-$${arch}/include/sys/$$b; \
215 elif [ \( "$${path_file}" = "$(SYSDEPS)/i386" -o \
216 "$${path_file}" = "$(SYSDEPS)/arm" -o \
217 "$${path_file}" = "$(SYSDEPS)/x86_64" -o \
218 "$${path_file}" = "$(SYSDEPS)/powerpc" -o \
219 "$${path_file}" = "$(SYSDEPS)/common" \) \
220 -a $${file%.h} != $${file} ]; then \
221 if [ \( ! -e ARCH-$${arch}/include/`basename $${dest}` \) \
222 -a \( -e $(CONTRIB_DIR)/$${file} \) ]; then \
223 b=`basename $${file}`; \
224 from=$${path_ctrb}/$$b; \
225 to=$(OBJ_DIR)/ARCH-$${arch}/include/$$b; \
228 if [ -e $(CONTRIB_DIR)/$${file} ] ; then \
229 from=$${path_ctrb}/`basename $${file}`; \
230 to=$(OBJ_DIR)/ARCH-$${arch}/$${dest}; \
233 if [ -n "$$to" -a -n "$$from" -a ! -e "$$to" ]; then \
235 [ -d "$$d" ] || mkdir -p $$d; \
236 ln -s$(if $(VERBOSE),,v) "$$from" "$$to"; \
238 unset to; unset from; \
241 REBUILD_LINKS_SRC = \
243 find ARCH-$$arch -name \*.h -o -name \*.c -o -name \*.cc -o -name \*.S | \
246 to=$(OBJ_DIR)/$$file; \
247 d=$$(dirname $$to); \
248 [ -d "$$d" ] || mkdir -p $$d; \
249 if [ ! -e "$$to" ] ; then \
250 ln -s$(if $(VERBOSE),,v) "$(SRC_DIR)/$$file" "$$to"; \
255 $(OBJ_DIR)/ARCH-%/links-done: contrib_files_%.lst Makefile
256 @echo -n " ... Checking and fixing contrib file links, cleaning .o [$*]"
257 $(VERBOSE)if [ -d "$(OBJ_DIR)/ARCH-$*" ]; then \
258 find $(OBJ_DIR)/ARCH-$* -type l | xargs rm -f$(if $(VERBOSE),,v); \
260 $(VERBOSE)$(call REBUILD_LINKS_SRC,$*)
261 $(VERBOSE)$(call REBUILD_LINKS_CONTRIB,$*)
267 CONTRIB: $(addprefix $(OBJ_DIR)/ARCH-,$(addsuffix /links-done,$(BUILD_ARCHS)))
272 $(VERBOSE)find $(OBJ_DIR) -type l | xargs rm -f$(if $(VERBOSE),,v)
273 $(VERBOSE)$(RM) $(OBJ_DIR)/ARCH-*/links-done
274 $(VERBOSE)$(RM) $(OBJ_DIR)/ARCH-*/include/.general.d
277 $(SRC_CC_libuc_c.so:.cc=.s.o) $(SRC_C_libuc_c.so:.c=.s.o) : DEFINES += -DSHARED
278 $(SRC_CC_libuc_c.a:.cc=.o) $(SRC_C_libuc_c.a:.c=.o) : DEFINES += -DSTATIC
280 # some special defines
281 O_AND_SO_OBJS = $(SRC_CC_libuc_c.a:.cc=.o) $(SRC_CC_libuc_c.so:.cc=.s.o)
282 O_AND_SO_OBJS += $(SRC_C_libuc_c.a:.c=.o) $(SRC_C_libuc_c.so:.c=.s.o)
283 $(filter %__DO_UNLOCKED.o %__DO_UNLOCKED.s.o,$(O_AND_SO_OBJS)):\
284 DEFINES += -D__DO_UNLOCKED
285 $(filter %__DO_LARGEFILE.o %__DO_LARGEFILE.s.o,$(O_AND_SO_OBJS)):\
286 DEFINES += -D__DO_LARGEFILE
287 $(filter %__FN.o,$(SRC_C_libuc_c.a:.c=.o)):\
288 DEFINES += -DL_$(patsubst %__FN.o,%,$(notdir $@))
289 $(filter %__FN.s.o,$(SRC_C_libuc_c.a:.c=.s.o)):\
290 DEFINES += -DL_$(patsubst %__FN.s.o,%,$(notdir $@))
292 $(SRC_C_libm:.c=.o) $(SRC_C_libm:.c=.s.o):\
293 DEFINES += -D_IEEE_LIBM -D_ISOC99_SOURCE -D_SVID_SOURCE
295 $(filter %__FN.o,$(SRC_CC:.cc=.o)):\
296 DEFINES += -DL_$(patsubst %__FN.o,%,$(notdir $@))
297 $(filter %__FN.s.o,$(SRC_CC:.cc=.s.o)):\
298 DEFINES += -DL_$(patsubst %__FN.s.o,%,$(notdir $@))
300 $(SRC_CC_libm:.cc=.o) $(SRC_CC_libm:.cc=.s.o):\
301 DEFINES += -D_IEEE_LIBM -D_ISOC99_SOURCE -D_SVID_SOURCE
303 include $(L4DIR)/mk/lib.mk