2 L4DIR ?= $(PKGDIR)/../..
4 CXXFLAGS_amd64 += -mcmodel=medium
5 CFLAGS_amd64 += -mcmodel=medium
7 include $(L4DIR)/mk/Makeconf
9 SYSTEMS = $(SYSTEMS_PLAIN)
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 FILES_sparc := $(PKGDIR_ABS)/lib/uclibc/contrib_files_sparc.lst
28 CONTRIB_DIR := $(PKGDIR_ABS)/lib/contrib/uclibc
29 PTHLIB_DIR := $(PKGDIR_ABS)/lib/libpthread
32 UCLIBC_ARCH_x86 := i386
33 UCLIBC_ARCH_arm := arm
34 UCLIBC_ARCH_amd64 := x86_64
35 UCLIBC_ARCH_ppc32 := powerpc
36 UCLIBC_ARCH_sparc := sparc
37 UCLIBC_ARCH := $(UCLIBC_ARCH_$(ARCH))
38 DIRS := libc/stdio libc/stdlib libc/stdlib/malloc-standard libc/string \
39 libc/string/$(UCLIBC_ARCH) libc/string/generic \
40 libc/inet libc/misc libc/misc/assert libc/misc/ctype \
41 libc/misc/dirent libc/misc/error libc/misc/internals \
42 libc/misc/locale libc/misc/elf \
43 libc/misc/time libc/pwd_grp libc/unistd libc/termios \
44 libc/misc/wctype libc/misc/wchar libc/misc/fnmatch \
45 libc/misc/glob libc/misc/search libc libcrypt \
46 libc/signal $(SYSDEPS)/$(UCLIBC_ARCH) \
47 $(SYSDEPS)/common libm libm/$(UCLIBC_ARCH)
49 BOTH_SRC_CC := $(foreach arch,all $(ARCH),\
50 $(foreach dir,$(DIRS), \
51 $(addprefix ARCH-$(arch)/$(dir)/,\
52 $(notdir $(wildcard ../ARCH-$(arch)/$(dir)/*.cc)))))
53 BOTH_SRC_C := $(foreach arch,all $(ARCH),\
54 $(foreach dir,$(DIRS), \
55 $(addprefix ARCH-$(arch)/$(dir)/,\
56 $(notdir $(wildcard ../ARCH-$(arch)/$(dir)/*.c)))))
57 BOTH_SRC_S := $(foreach arch,all $(ARCH),\
58 $(foreach dir,$(DIRS), \
59 $(addprefix ARCH-$(arch)/$(dir)/,\
60 $(notdir $(wildcard ../ARCH-$(arch)/$(dir)/*.S)))))
62 # some files cannot be compiled alone but are included by
63 # other files and thus needs to be linked
64 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))
66 STATICONLY_SRC_C := dl-core.c
68 SRC_C_libuc_c.a := $(BOTH_SRC_C)
69 SRC_C_libuc_c.so := $(filter-out $(addprefix %/,$(STATICONLY_SRC_C)), $(BOTH_SRC_C))
70 SRC_CC_libuc_c.a := $(BOTH_SRC_CC)
71 SRC_CC_libuc_c.so := $(BOTH_SRC_CC)
72 SRC_S_libuc_c.a := $(BOTH_SRC_S)
73 SRC_S_libuc_c.so := $(BOTH_SRC_S)
75 private_incdirs = $(SRC_DIR)/ARCH-$(ARCH)/include $(SRC_DIR)/ARCH-all/include \
76 $(OBJ_DIR)/ARCH-$(ARCH)/include $(OBJ_DIR)/ARCH-all/include \
77 $(OBJ_DIR)/ARCH-all/libc/string \
78 $(SRC_DIR)/../contrib/uclibc/libc/misc/internals \
79 $(if $(1),$(OBJ_BASE)/include/$(ARCH)/$(L4API)) \
80 $(OBJ_BASE)/include/$(ARCH) \
82 $(OBJ_BASE)/include/uclibc \
83 $(SRC_DIR)/../contrib/uclibc/libcrypt
85 PRIVATE_INCDIR = $(call private_incdirs)
86 LIBCINCDIR = $(addprefix -I,$(GCCINCDIR))
87 CPPFLAGS += -nostdinc -include \
88 $(OBJ_DIR)/ARCH-all/include/libc-symbols.h
89 CFLAGS += -fno-builtin
90 CFLAGS += -DUCLIBC_INTERNAL
91 # CFLAGS += -std=iso9899:199901
92 DEFINES = -DNDEBUG -D_LIBC -D__UCLIBC_CTOR_DTOR__
93 WARNINGS = -Wall -Wstrict-prototypes
95 CPPFLAGS_dl-iterate-phdr.c += -I$(SRC_DIR)/../contrib/uclibc/ldso/include \
96 -I$(SRC_DIR)/../contrib/uclibc/ldso/ldso/$(UCLIBC_ARCH)
97 CPPFLAGS_dl-core.c += -I$(SRC_DIR)/../contrib/uclibc/ldso/ldso/$(UCLIBC_ARCH) \
98 -I$(SRC_DIR)/../contrib/uclibc/ldso/include
99 CPPFLAGS_$(OBJ_DIR)/ARCH-all/libc/inet += -DRESOLVER="\"resolv.c\""
101 PRIVATE_INCDIR_ARCH-all/libc/string/wcslen.o = $(SRC_DIR)/../contrib/uclibc/libc/string
102 PRIVATE_INCDIR_ARCH-all/libc/string/wcslen.s.o = $(SRC_DIR)/../contrib/uclibc/libc/string
103 PRIVATE_INCDIR_ARCH-all/libc/string/wcsnlen.o = $(SRC_DIR)/../contrib/uclibc/libc/string
104 PRIVATE_INCDIR_ARCH-all/libc/string/wcsnlen.s.o = $(SRC_DIR)/../contrib/uclibc/libc/string
105 PRIVATE_INCDIR_ARCH-all/libc/string/wmemcpy.o = $(SRC_DIR)/../contrib/uclibc/libc/string
106 PRIVATE_INCDIR_ARCH-all/libc/string/wmemcpy.s.o = $(SRC_DIR)/../contrib/uclibc/libc/string
108 PRIVATE_INCDIR_ARCH-all/libc/misc/search/hcreate_r.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
109 PRIVATE_INCDIR_ARCH-all/libc/misc/search/hcreate_r.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
110 PRIVATE_INCDIR_ARCH-all/libc/misc/search/hdestroy_r.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
111 PRIVATE_INCDIR_ARCH-all/libc/misc/search/hdestroy_r.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
112 PRIVATE_INCDIR_ARCH-all/libc/misc/search/hsearch_r.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
113 PRIVATE_INCDIR_ARCH-all/libc/misc/search/hsearch_r.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
114 PRIVATE_INCDIR_ARCH-all/libc/misc/search/lfind.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
115 PRIVATE_INCDIR_ARCH-all/libc/misc/search/lfind.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
116 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tfind.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
117 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tfind.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
118 PRIVATE_INCDIR_ARCH-all/libc/misc/search/lsearch.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
119 PRIVATE_INCDIR_ARCH-all/libc/misc/search/lsearch.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
120 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tdestroy.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
121 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tdestroy.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
122 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tdelete.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
123 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tdelete.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
124 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tsearch.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
125 PRIVATE_INCDIR_ARCH-all/libc/misc/search/tsearch.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
126 PRIVATE_INCDIR_ARCH-all/libc/misc/search/twalk.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
127 PRIVATE_INCDIR_ARCH-all/libc/misc/search/twalk.s.o = $(SRC_DIR)/../contrib/uclibc/libc/misc/search
130 DEFINES += -DL4_THREAD_SAFE
131 TARGET := r/libuc_c.a r/libuc_c.so
132 LDFLAGS_r/libuc_c.so := $(LDFLAGS_libuc_c.so)
133 SRC_C_r/libuc_c.a := $(SRC_C_libuc_c.a)
134 SRC_C_r/libuc_c.so := $(SRC_C_libuc_c.so) libpthread/src/forward.c
135 SRC_CC_r/libuc_c.a := $(SRC_CC_libuc_c.a)
136 SRC_CC_r/libuc_c.so := $(SRC_CC_libuc_c.so)
137 SRC_S_r/libuc_c.a := $(SRC_S_libuc_c.a)
138 SRC_S_r/libuc_c.so := $(SRC_S_libuc_c.so)
139 PRIVATE_INCDIR = $(call private_incdirs,1)
140 vpath libpthread/src/forward.c $(PTHLIB_DIR)/..
141 PRIVATE_INCDIR_libpthread/src/forward.s.o += $(PTHLIB_DIR)/src/sysdeps/$(UCLIBC_ARCH_$(ARCH)) \
147 BUILD_ARCHS := all $(BUILD_ARCH)
149 .general.d: $(FILES_x86) $(FILE_arm) $(FILES_amd64) $(FILES_all)
153 INCDIRS = $(addsuffix /include,$(addprefix $(OBJ_DIR)/ARCH-,$(BUILD_ARCHS)))
154 INCDIRS_OBJ_m = $(addsuffix /Makefile,$(INCDIRS))
159 $(VERBOSE)install -d $(dir $@)
160 $(VERBOSE)echo 'PKGDIR ?= $(PKGDIR_ABS)' > $@
161 $(VERBOSE)echo 'L4DIR ?= $(L4DIR_ABS)' >> $@
162 $(VERBOSE)echo 'OBJ_BASE ?= $(OBJ_BASE)' >> $@
163 $(VERBOSE)echo 'OBJ_DIR ?= $(OBJ_DIR)' >> $@
164 $(VERBOSE)echo 'INSTALL_INC_PREFIX = $$(PKGNAME)' >> $@
165 $(VERBOSE)echo 'include $$(L4DIR)/mk/include.mk' >> $@
169 include:: $(addprefix $(OBJ_DIR)/ARCH-,$(addsuffix /links-done,$(BUILD_ARCHS))) $(INCDIRS_OBJ_m)
170 $(VERBOSE)for i in $(INCDIRS); do \
171 PWD=$$i $(MAKE) -C $$i all; \
175 $(VERBOSE)set -e; $(foreach d,$(INCDIRS), \
176 if [ -f $d/Makefile ]; then \
177 PWD=$(PWD)/$d $(MAKE) -C $d $@ $(MKFLAGS); \
180 # ok, we have a list of files to check in FILES
182 # check if it exists, yes? go on
183 # no? create an apropriate link with a relative path to the contrib dir
185 REBUILD_LINKS_CONTRIB = \
187 cat contrib_files_$${arch}.lst | while read file flags; \
189 path_file=`dirname $${file}`; \
190 path_ctrb=`dirname $(CONTRIB_DIR)/$${file}`; \
191 if [ -n "$${flags}" ]; then \
192 dest="$${path_file}/$${flags}.c"; \
196 if [ "$${path_file}" = "$(SYSDEPS)/i386/bits" -o \
197 "$${path_file}" = "$(SYSDEPS)/arm/bits" -o \
198 "$${path_file}" = "$(SYSDEPS)/x86_64/bits" -o \
199 "$${path_file}" = "$(SYSDEPS)/powerpc/bits" -o \
200 "$${path_file}" = "$(SYSDEPS)/sparc/bits" -o \
201 "$${path_file}" = "$(SYSDEPS)/common/bits" ]; then \
202 if [ \( ! -e ARCH-$${arch}/include/bits/`basename $${dest}` \) \
203 -a \( -e $(CONTRIB_DIR)/$${file} \) ]; then \
204 b=`basename $${file}`; \
205 from=$${path_ctrb}/$$b; \
206 to=$(OBJ_DIR)/ARCH-$${arch}/include/bits/$$b; \
208 elif [ "$${path_file}" = "$(SYSDEPS)/i386/sys" -o \
209 "$${path_file}" = "$(SYSDEPS)/arm/sys" -o \
210 "$${path_file}" = "$(SYSDEPS)/x86_64/sys" -o \
211 "$${path_file}" = "$(SYSDEPS)/powerpc/sys" -o \
212 "$${path_file}" = "$(SYSDEPS)/sparc/sys" -o \
213 "$${path_file}" = "$(SYSDEPS)/common/sys" ]; then \
214 if [ \( ! -e ARCH-$${arch}/include/sys/`basename $${dest}` \) \
215 -a \( -e $(CONTRIB_DIR)/$${file} \) ]; then \
216 b=`basename $${file}`; \
217 from=$${path_ctrb}/$$b; \
218 to=$(OBJ_DIR)/ARCH-$${arch}/include/sys/$$b; \
220 elif [ \( "$${path_file}" = "$(SYSDEPS)/i386" -o \
221 "$${path_file}" = "$(SYSDEPS)/arm" -o \
222 "$${path_file}" = "$(SYSDEPS)/x86_64" -o \
223 "$${path_file}" = "$(SYSDEPS)/powerpc" -o \
224 "$${path_file}" = "$(SYSDEPS)/sparc" -o \
225 "$${path_file}" = "$(SYSDEPS)/common" \) \
226 -a $${file%.h} != $${file} ]; then \
227 if [ \( ! -e ARCH-$${arch}/include/`basename $${dest}` \) \
228 -a \( -e $(CONTRIB_DIR)/$${file} \) ]; then \
229 b=`basename $${file}`; \
230 from=$${path_ctrb}/$$b; \
231 to=$(OBJ_DIR)/ARCH-$${arch}/include/$$b; \
234 if [ -e $(CONTRIB_DIR)/$${file} ] ; then \
235 from=$${path_ctrb}/`basename $${file}`; \
236 to=$(OBJ_DIR)/ARCH-$${arch}/$${dest}; \
239 if [ -n "$$to" -a -n "$$from" -a ! -e "$$to" ]; then \
241 [ -d "$$d" ] || mkdir -p $$d; \
242 ln -s$(if $(VERBOSE),,v) "$$from" "$$to"; \
244 unset to; unset from; \
247 REBUILD_LINKS_SRC = \
249 find ARCH-$$arch -name \*.h -o -name \*.c -o -name \*.cc -o -name \*.S | \
252 to=$(OBJ_DIR)/$$file; \
253 d=$$(dirname $$to); \
254 [ -d "$$d" ] || mkdir -p $$d; \
255 if [ ! -e "$$to" ] ; then \
256 ln -s$(if $(VERBOSE),,v) "$(SRC_DIR)/$$file" "$$to"; \
261 $(OBJ_DIR)/ARCH-%/links-done: contrib_files_%.lst Makefile
262 @echo -n " ... Checking and fixing contrib file links, cleaning .o [$*]"
263 $(VERBOSE)if [ -d "$(OBJ_DIR)/ARCH-$*" ]; then \
264 find $(OBJ_DIR)/ARCH-$* -type l | xargs rm -f$(if $(VERBOSE),,v); \
266 $(VERBOSE)$(call REBUILD_LINKS_SRC,$*)
267 $(VERBOSE)$(call REBUILD_LINKS_CONTRIB,$*)
273 CONTRIB: $(addprefix $(OBJ_DIR)/ARCH-,$(addsuffix /links-done,$(BUILD_ARCHS)))
278 $(VERBOSE)find $(OBJ_DIR) -type l | xargs rm -f$(if $(VERBOSE),,v)
279 $(VERBOSE)$(RM) $(OBJ_DIR)/ARCH-*/links-done
280 $(VERBOSE)$(RM) $(OBJ_DIR)/ARCH-*/include/.general.d
283 $(SRC_CC_libuc_c.so:.cc=.s.o) $(SRC_C_libuc_c.so:.c=.s.o) : DEFINES += -DSHARED
284 $(SRC_CC_libuc_c.a:.cc=.o) $(SRC_C_libuc_c.a:.c=.o) : DEFINES += -DSTATIC
286 # some special defines
287 O_AND_SO_OBJS = $(SRC_CC_libuc_c.a:.cc=.o) $(SRC_CC_libuc_c.so:.cc=.s.o)
288 O_AND_SO_OBJS += $(SRC_C_libuc_c.a:.c=.o) $(SRC_C_libuc_c.so:.c=.s.o)
289 $(filter %__DO_UNLOCKED.o %__DO_UNLOCKED.s.o,$(O_AND_SO_OBJS)):\
290 DEFINES += -D__DO_UNLOCKED
291 $(filter %__DO_LARGEFILE.o %__DO_LARGEFILE.s.o,$(O_AND_SO_OBJS)):\
292 DEFINES += -D__DO_LARGEFILE
293 $(filter %__FN.o,$(SRC_C_libuc_c.a:.c=.o)):\
294 DEFINES += -DL_$(patsubst %__FN.o,%,$(notdir $@))
295 $(filter %__FN.s.o,$(SRC_C_libuc_c.a:.c=.s.o)):\
296 DEFINES += -DL_$(patsubst %__FN.s.o,%,$(notdir $@))
298 $(SRC_C_libm:.c=.o) $(SRC_C_libm:.c=.s.o):\
299 DEFINES += -D_IEEE_LIBM -D_ISOC99_SOURCE -D_SVID_SOURCE
301 $(filter %__FN.o,$(SRC_CC:.cc=.o)):\
302 DEFINES += -DL_$(patsubst %__FN.o,%,$(notdir $@))
303 $(filter %__FN.s.o,$(SRC_CC:.cc=.s.o)):\
304 DEFINES += -DL_$(patsubst %__FN.s.o,%,$(notdir $@))
306 $(SRC_CC_libm:.cc=.o) $(SRC_CC_libm:.cc=.s.o):\
307 DEFINES += -D_IEEE_LIBM -D_ISOC99_SOURCE -D_SVID_SOURCE
309 include $(L4DIR)/mk/lib.mk