1 # Rules.make for uClibc
3 # Copyright (C) 2000-2008 Erik Andersen <andersen@uclibc.org>
5 # Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
9 # FOO = bar -- recursively expanded variable. Value is remebered verbatim.
10 # If it contains references to other variables, these references
11 # are expanded whenever this variable is _substituted_.
12 # FOO := bar -- simply expanded variable. Right hand is expanded when
13 # the variable is _defined_. Therefore faster than =.
14 # FOO ?= bar -- set a value only if it is not already set
15 # (behaves as =, not :=).
16 # FOO += bar -- append; if FOO is not defined, acts like = (not :=).
19 # check for proper make version
20 ifneq ($(findstring x3.7
,x
$(MAKE_VERSION
)),)
21 $(error Your make is too old
$(MAKE_VERSION
). Go
get at least
3.80)
24 #-----------------------------------------------------------
25 # This file contains rules which are shared between multiple
26 # Makefiles. All normal configuration options live in the
27 # file named ".config". Don't mess with this file unless
28 # you know what you are doing.
31 #-----------------------------------------------------------
32 # If you are running a cross compiler, you will want to set
33 # 'CROSS' to something more interesting ... Target
34 # architecture is determined by asking the CC compiler what
35 # arch it compiles things for, so unless your compiler is
36 # broken, you should not need to specify TARGET_ARCH.
38 # Most people will set this stuff on the command line, i.e.
39 # make CROSS=arm-linux-
40 # will build uClibc for 'arm'.
49 OBJDUMP
= $(CROSS
)objdump
50 STRIPTOOL
= $(CROSS
)strip
59 STRIP_FLAGS ?
= -x
-R .note
-R .comment
61 ## unused? if yes, remove after 0.9.31
62 ## UNIFDEF := $(top_builddir)extra/scripts/unifdef
64 # Select the compiler needed to build binaries for your development system
66 BUILD_CFLAGS
= -Os
-Wall
68 #---------------------------------------------------------
69 # Nothing beyond this point should ever be touched by mere
70 # mortals. Unless you hang out with the gods, you should
71 # probably leave all this stuff alone.
74 qstrip
= $(strip $(subst ",,$(1)))
77 # Pull in the user's uClibc configuration
78 ifeq ($(filter $(noconfig_targets
),$(MAKECMDGOALS
)),)
79 -include $(top_builddir
).config
81 TARGET_ARCH
:=$(call qstrip
,$(TARGET_ARCH
))
82 ifeq ($(TARGET_ARCH
),)
83 ARCH ?
= $(shell uname
-m |
$(SED
) -e s
/i
.86/i386
/ \
84 -e s
/sun.
*/sparc
/ -e s
/sparc.
*/sparc
/ \
85 -e s
/arm.
*/arm
/ -e s
/sa110
/arm
/ \
87 -e s
/s390x
/s390
/ -e s
/parisc.
*/hppa
/ \
88 -e s
/ppc.
*/powerpc
/ -e s
/mips.
*/mips
/ \
89 -e s
/xtensa.
*/xtensa
/ )
95 # Make certain these contain a final "/", but no "//"s.
96 TARGET_SUBARCH
:=$(call qstrip
,$(shell grep
-s
'^TARGET_SUBARCH' $(top_builddir
)/.config |
$(SED
) -e
's/^TARGET_SUBARCH=//'))
97 TARGET_SUBARCH
:=$(call qstrip
,$(TARGET_SUBARCH
))
98 RUNTIME_PREFIX
:=$(strip $(subst //,/, $(subst ,/, $(call qstrip
,$(RUNTIME_PREFIX
)))))
99 DEVEL_PREFIX
:=$(strip $(subst //,/, $(subst ,/, $(call qstrip
,$(DEVEL_PREFIX
)))))
100 MULTILIB_DIR
:=$(strip $(subst //,/, $(subst ,/, $(call qstrip
,$(MULTILIB_DIR
)))))
101 KERNEL_HEADERS
:=$(strip $(subst //,/, $(subst ,/, $(call qstrip
,$(KERNEL_HEADERS
)))))
102 export RUNTIME_PREFIX DEVEL_PREFIX KERNEL_HEADERS MULTILIB_DIR
105 # Now config hard core
110 VERSION
:= $(MAJOR_VERSION
).
$(MINOR_VERSION
).
$(SUBLEVEL
)
111 ABI_VERSION
:= $(MAJOR_VERSION
)
112 ifneq ($(EXTRAVERSION
),)
113 VERSION
:= $(VERSION
)$(EXTRAVERSION
)
115 # Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc.
117 export MAJOR_VERSION MINOR_VERSION SUBLEVEL VERSION ABI_VERSION LC_ALL
120 SHARED_LIBNAME
:= $(LIBC
).so.
$(ABI_VERSION
)
122 ifneq ($(findstring $(TARGET_ARCH
) , hppa64 ia64 mips64 powerpc64 s390x sparc64 x86_64
),)
123 UCLIBC_LDSO_NAME
:= ld64-uClibc
124 ARCH_NATIVE_BIT
:= 64
126 UCLIBC_LDSO_NAME
:= ld-uClibc
127 ARCH_NATIVE_BIT
:= 32
129 UCLIBC_LDSO
:= $(UCLIBC_LDSO_NAME
).so.
$(ABI_VERSION
)
130 NONSHARED_LIBNAME
:= uclibc_nonshared.a
131 libc
:= $(top_builddir
)lib
/$(SHARED_LIBNAME
)
132 libc.depend
:= $(top_builddir
)lib
/$(SHARED_LIBNAME
:.
$(ABI_VERSION
)=)
133 libdl.depend
:= $(top_builddir
)lib
/libdl.so
134 libpthread.depend
:= $(top_builddir
)lib
/libpthread.so
135 interp
:= $(top_builddir
)lib
/interp.os
136 ldso
:= $(top_builddir
)lib
/$(UCLIBC_LDSO
)
137 headers_dep
:= $(top_builddir
)include/bits
/sysnum.h
138 sub_headers
:= $(headers_dep
)
140 #LIBS :=$(interp) -L$(top_builddir)lib -lc
141 LIBS
:= $(interp
) -L
$(top_builddir
)lib
$(libc
:.
$(ABI_VERSION
)=)
143 # Make sure DESTDIR and PREFIX can be used to install
144 # PREFIX is a uClibcism while DESTDIR is a common GNUism
149 ifneq ($(HAVE_SHARED
),y
)
159 CROSS
=$(call qstrip
,$(CROSS_COMPILER_PREFIX
))
162 # A nifty macro to make testing gcc features easier
164 if
$(CC
) $(1) -S
-o
/dev
/null
-xc
/dev
/null
> /dev
/null
2>&1; \
165 then echo
"$(1)"; else echo
"$(2)"; fi
)
167 if
$(CC
) -Wa
,$(1) -Wa
,-Z
-c
-o
/dev
/null
-xassembler
/dev
/null
> /dev
/null
2>&1; \
168 then echo
"-Wa,$(1)"; fi
)
170 if
$(LD
) $(1) -o
/dev
/null
-b binary
/dev
/null
> /dev
/null
2>&1; \
171 then echo
"$(1)"; fi
)
176 # Flags in OPTIMIZATION are used only for non-debug builds
179 # Use '-Os' optimization if available, else use -O2, allow Config to override
180 OPTIMIZATION
+=$(call check_gcc
,-Os
,-O2
)
181 # Use the gcc 3.4 -funit-at-a-time optimization when available
182 OPTIMIZATION
+=$(call check_gcc
,-funit-at-a-time
,)
183 # shrinks code by about 0.1%
184 OPTIMIZATION
+=$(call check_gcc
,-fmerge-all-constants
)
186 GCC_MAJOR_VER?
=$(shell $(CC
) -dumpversion | cut
-d .
-f
1)
187 #GCC_MINOR_VER?=$(shell $(CC) -dumpversion | cut -d . -f 2)
189 ifeq ($(GCC_MAJOR_VER
),4)
190 # shrinks code, results are from 4.0.2
192 OPTIMIZATION
+=$(call check_gcc
,-fno-tree-loop-optimize
,)
194 OPTIMIZATION
+=$(call check_gcc
,-fno-tree-dominator-opts
,)
196 OPTIMIZATION
+=$(call check_gcc
,-fno-strength-reduce
,)
200 # CPU_CFLAGS-y contain options which are not warnings,
201 # not include or library paths, and not optimizations.
203 # Why -funsigned-char: I hunted a bug related to incorrect
204 # sign extension of 'char' type for 10 hours straight. Not fun.
205 CPU_CFLAGS-y
:= -funsigned-char
-fno-builtin
207 CPU_CFLAGS-y
+= $(call check_gcc
,-fno-asm
,)
210 ifeq ($(UCLIBC_HAS_SOFT_FLOAT
),y
)
211 # If -msoft-float isn't supported, we want an error anyway.
212 # Hmm... might need to revisit this for arm since it has 2 different
213 # soft float encodings.
214 ifneq ($(TARGET_ARCH
),nios
)
215 ifneq ($(TARGET_ARCH
),nios2
)
216 ifneq ($(TARGET_ARCH
),sh
)
217 CPU_CFLAGS-y
+= -msoft-float
221 ifeq ($(TARGET_ARCH
),arm
)
222 # No longer needed with current toolchains, but leave it here for now.
223 # If anyone is actually still using gcc 2.95 (say), they can uncomment it.
224 # LDADD_LIBFLOAT=-lfloat
228 CPU_CFLAGS-y
+= $(call check_gcc
,-std
=gnu99
,)
230 CPU_CFLAGS-
$(UCLIBC_FORMAT_SHARED_FLAT
) += -mid-shared-library
231 CPU_CFLAGS-
$(UCLIBC_FORMAT_FLAT_SEP_DATA
) += -msep-data
233 CPU_LDFLAGS-
$(ARCH_LITTLE_ENDIAN
) += -Wl
,-EL
234 CPU_LDFLAGS-
$(ARCH_BIG_ENDIAN
) += -Wl
,-EB
237 PICFLAG-
$(UCLIBC_FORMAT_FDPIC_ELF
) := -mfdpic
238 PICFLAG
:= $(PICFLAG-y
)
241 # Some nice CPU specific optimizations
242 ifeq ($(TARGET_ARCH
),i386
)
243 OPTIMIZATION
+=$(call check_gcc
,-fomit-frame-pointer
,)
245 ifeq ($(CONFIG_386
)$(CONFIG_486
)$(CONFIG_586
)$(CONFIG_586MMX
),y
)
246 # Non-SSE capable processor.
247 # NB: this may make SSE insns segfault!
248 # -O1 -march=pentium3, -Os -msse etc are known to be affected.
249 # See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13685
250 # -m32 is needed if host is 64-bit
251 OPTIMIZATION
+=$(call check_gcc
,-m32
-mpreferred-stack-boundary
=2,)
253 OPTIMIZATION
+=$(call check_gcc
,-mpreferred-stack-boundary
=4,)
256 # Choice of alignment (please document why!)
257 # -falign-labels: in-line labels
258 # (reachable by normal code flow, aligning will insert nops
259 # which will be executed - may even make things slower)
260 # -falign-jumps: reachable only by a jump
261 # Generic: no alignment at all (smallest code)
262 GCC_FALIGN
=$(call check_gcc
,-falign-functions
=1 -falign-jumps
=1 -falign-labels
=1 -falign-loops
=1,-malign-jumps
=1 -malign-loops
=1)
263 ifeq ($(CONFIG_K7
),y
)
264 # Align functions to four bytes, use default for jumps and loops (why?)
265 GCC_FALIGN
=$(call check_gcc
,-falign-functions
=4 -falign-labels
=1,-malign-functions
=4)
267 ifeq ($(CONFIG_CRUSOE
),y
)
268 # Use compiler's default for functions, jumps and loops (why?)
269 GCC_FALIGN
=$(call check_gcc
,-falign-functions
=0 -falign-labels
=1,-malign-functions
=0)
271 ifeq ($(CONFIG_CYRIXIII
),y
)
272 # Use compiler's default for functions, jumps and loops (why?)
273 GCC_FALIGN
=$(call check_gcc
,-falign-functions
=0 -falign-labels
=1,-malign-functions
=0)
275 OPTIMIZATION
+=$(GCC_FALIGN
)
277 # Putting each function and data object into its own section
278 # allows for kbytes of less text if users link against static uclibc
279 # using ld --gc-sections.
280 # ld 2.18 can't do that (yet?) for shared libraries, so we itself
281 # do not use --gc-sections at shared lib link time.
282 # However, in combination with sections being sorted by alignment
283 # it does result in much reduced padding:
284 # text data bss dec hex
285 # 235319 1472 5992 242783 3b45f old.so
286 # 234104 1472 5980 241556 3af94 new.so
287 # Without -ffunction-sections, all functions will get aligned
288 # to 4 byte boundary by as/ld. This is arguably a bug in as.
289 # It specifies 4 byte align for .text even if not told to do so:
290 # Idx Name Size VMA LMA File off Algn
291 # 0 .text xxxxxxxx 00000000 00000000 xxxxxxxx 2**2 <===!
292 CPU_CFLAGS-y
+= $(call check_gcc
,-ffunction-sections
-fdata-sections
,)
293 ifneq ($(call check_ld
,--sort-common
),)
294 CPU_LDFLAGS-y
+= -Wl
,--sort-common
296 ifneq ($(call check_ld
,--sort-section alignment
),)
297 CPU_LDFLAGS-y
+= -Wl
,--sort-section
,alignment
302 CPU_CFLAGS-
$(CONFIG_386
)+=-march
=i386
303 CPU_CFLAGS-
$(CONFIG_486
)+=-march
=i486
304 CPU_CFLAGS-
$(CONFIG_ELAN
)+=-march
=i486
305 CPU_CFLAGS-
$(CONFIG_586
)+=-march
=i586
306 CPU_CFLAGS-
$(CONFIG_586MMX
)+=$(call check_gcc
,-march
=pentium-mmx
,-march
=i586
)
307 CPU_CFLAGS-
$(CONFIG_686
)+=-march
=i686
308 CPU_CFLAGS-
$(CONFIG_PENTIUMII
)+=$(call check_gcc
,-march
=pentium2
,-march
=i686
)
309 CPU_CFLAGS-
$(CONFIG_PENTIUMIII
)+=$(call check_gcc
,-march
=pentium3
,-march
=i686
)
310 CPU_CFLAGS-
$(CONFIG_PENTIUM4
)+=$(call check_gcc
,-march
=pentium4
,-march
=i686
)
311 CPU_CFLAGS-
$(CONFIG_K6
)+=$(call check_gcc
,-march
=k6
,-march
=i586
)
312 CPU_CFLAGS-
$(CONFIG_K7
)+=$(call check_gcc
,-march
=athlon
,-march
=i686
)
313 CPU_CFLAGS-
$(CONFIG_CRUSOE
)+=-march
=i686
314 CPU_CFLAGS-
$(CONFIG_WINCHIPC6
)+=$(call check_gcc
,-march
=winchip-c6
,-march
=i586
)
315 CPU_CFLAGS-
$(CONFIG_WINCHIP2
)+=$(call check_gcc
,-march
=winchip2
,-march
=i586
)
316 CPU_CFLAGS-
$(CONFIG_CYRIXIII
)+=$(call check_gcc
,-march
=c3
,-march
=i486
)
317 CPU_CFLAGS-
$(CONFIG_NEHEMIAH
)+=$(call check_gcc
,-march
=c3-2
,-march
=i686
)
320 ifeq ($(TARGET_ARCH
),sparc
)
321 CPU_CFLAGS-
$(CONFIG_SPARC_V7
)+=-mcpu
=v7
322 CPU_CFLAGS-
$(CONFIG_SPARC_V8
)+=-mcpu
=v8
323 CPU_CFLAGS-
$(CONFIG_SPARC_V9
)+=-mcpu
=v9
324 CPU_CFLAGS-
$(CONFIG_SPARC_V9B
)+=$(call check_gcc
,-mcpu
=v9b
,-mcpu
=ultrasparc
)
327 ifeq ($(TARGET_ARCH
),arm
)
328 OPTIMIZATION
+=-fstrict-aliasing
329 CPU_CFLAGS-
$(ARCH_LITTLE_ENDIAN
)+=-mlittle-endian
330 CPU_CFLAGS-
$(ARCH_BIG_ENDIAN
)+=-mbig-endian
331 CPU_CFLAGS-
$(CONFIG_GENERIC_ARM
)+=
332 CPU_CFLAGS-
$(CONFIG_ARM610
)+=-mtune
=arm610
-march
=armv3
333 CPU_CFLAGS-
$(CONFIG_ARM710
)+=-mtune
=arm710
-march
=armv3
334 CPU_CFLAGS-
$(CONFIG_ARM7TDMI
)+=-mtune
=arm7tdmi
-march
=armv4t
335 CPU_CFLAGS-
$(CONFIG_ARM720T
)+=-mtune
=arm7tdmi
-march
=armv4t
336 CPU_CFLAGS-
$(CONFIG_ARM920T
)+=-mtune
=arm9tdmi
-march
=armv4t
337 CPU_CFLAGS-
$(CONFIG_ARM922T
)+=-mtune
=arm9tdmi
-march
=armv4t
338 CPU_CFLAGS-
$(CONFIG_ARM926T
)+=-mtune
=arm9tdmi
-march
=armv5t
339 CPU_CFLAGS-
$(CONFIG_ARM10T
)+=-mtune
=arm10tdmi
-march
=armv5t
340 CPU_CFLAGS-
$(CONFIG_ARM1136JF_S
)+=-mtune
=arm1136jf-s
-march
=armv6
341 CPU_CFLAGS-
$(CONFIG_ARM1176JZ_S
)+=-mtune
=arm1176jz-s
-march
=armv6
342 CPU_CFLAGS-
$(CONFIG_ARM1176JZF_S
)+=-mtune
=arm1176jzf-s
-march
=armv6
343 CPU_CFLAGS-
$(CONFIG_ARM_SA110
)+=-mtune
=strongarm110
-march
=armv4
344 CPU_CFLAGS-
$(CONFIG_ARM_SA1100
)+=-mtune
=strongarm1100
-march
=armv4
345 CPU_CFLAGS-
$(CONFIG_ARM_XSCALE
)+=$(call check_gcc
,-mtune
=xscale
,-mtune
=strongarm110
)
346 CPU_CFLAGS-
$(CONFIG_ARM_XSCALE
)+=-march
=armv5te
-Wa
,-mcpu
=xscale
347 CPU_CFLAGS-
$(CONFIG_ARM_IWMMXT
)+=-march
=iwmmxt
-Wa
,-mcpu
=iwmmxt
-mabi
=iwmmxt
348 CPU_CFLAGS-
$(CONFIG_ARM_CORTEX_M3
)+=-mcpu
=cortex-m3
-mthumb
349 CPU_CFLAGS-
$(CONFIG_ARM_CORTEX_M1
)+=-mcpu
=cortex-m1
-mthumb
352 ifeq ($(TARGET_ARCH
),mips
)
353 OPTIMIZATION
+=-mno-split-addresses
354 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_1
)+=-mips1
355 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_2
)+=-mips2
-mtune
=mips2
356 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_3
)+=-mips3
-mtune
=mips3
357 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_4
)+=-mips4
-mtune
=mips4
358 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_MIPS32
)+=-mips32
-mtune
=mips32
359 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_MIPS32R2
)+=-march
=mips32r2
-mtune
=mips32r2
360 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_MIPS64
)+=-mips64
-mtune
=mips32
361 ifeq ($(strip $(ARCH_BIG_ENDIAN
)),y
)
362 CPU_LDFLAGS-
$(CONFIG_MIPS_N64_ABI
)+=-Wl
,-melf64btsmip
363 CPU_LDFLAGS-
$(CONFIG_MIPS_O32_ABI
)+=-Wl
,-melf32btsmip
365 ifeq ($(strip $(ARCH_LITTLE_ENDIAN
)),y
)
366 CPU_LDFLAGS-
$(CONFIG_MIPS_N64_ABI
)+=-Wl
,-melf64ltsmip
367 CPU_LDFLAGS-
$(CONFIG_MIPS_O32_ABI
)+=-Wl
,-melf32ltsmip
369 CPU_CFLAGS-
$(CONFIG_MIPS_N64_ABI
)+=-mabi
=64
370 CPU_CFLAGS-
$(CONFIG_MIPS_O32_ABI
)+=-mabi
=32
371 CPU_CFLAGS-
$(CONFIG_MIPS_N32_ABI
)+=-mabi
=n32
374 ifeq ($(TARGET_ARCH
),nios
)
375 OPTIMIZATION
+=-funaligned-struct-hack
376 CPU_LDFLAGS-y
+=-Wl
,-m32
377 CPU_CFLAGS-y
+=-Wl
,-m32
380 ifeq ($(TARGET_ARCH
),sh
)
381 OPTIMIZATION
+=-fstrict-aliasing
382 OPTIMIZATION
+= $(call check_gcc
,-mprefergot
,)
383 CPU_CFLAGS-
$(ARCH_LITTLE_ENDIAN
)+=-ml
384 CPU_CFLAGS-
$(ARCH_BIG_ENDIAN
)+=-mb
385 CPU_CFLAGS-
$(CONFIG_SH2
)+=-m2
386 CPU_CFLAGS-
$(CONFIG_SH3
)+=-m3
387 ifeq ($(UCLIBC_HAS_FPU
),y
)
388 CPU_CFLAGS-
$(CONFIG_SH2A
)+=-m2a
389 CPU_CFLAGS-
$(CONFIG_SH4
)+=-m4
391 CPU_CFLAGS-
$(CONFIG_SH2A
)+=-m2a-nofpu
392 CPU_CFLAGS-
$(CONFIG_SH4
)+=-m4-nofpu
396 ifeq ($(TARGET_ARCH
),sh64
)
397 OPTIMIZATION
+=-fstrict-aliasing
398 CPU_CFLAGS-
$(ARCH_LITTLE_ENDIAN
):=-ml
399 CPU_CFLAGS-
$(ARCH_BIG_ENDIAN
):=-mb
400 CPU_CFLAGS-
$(CONFIG_SH5
)+=-m5-32media
403 ifeq ($(TARGET_ARCH
),h8300
)
405 CPU_LDFLAGS-
$(CONFIG_H8300H
)+= -Wl
,-ms8300h
406 CPU_LDFLAGS-
$(CONFIG_H8S
) += -Wl
,-ms8300s
407 CPU_CFLAGS-
$(CONFIG_H8300H
) += -mh
-mint32
408 CPU_CFLAGS-
$(CONFIG_H8S
) += -ms
-mint32
411 ifeq ($(TARGET_ARCH
),i960
)
412 OPTIMIZATION
+=-mh
-mint32
#-fsigned-char
415 ifeq ($(TARGET_ARCH
),e1
)
416 OPTIMIZATION
+=-mgnu-param
419 ifeq ($(TARGET_ARCH
),cris
)
420 CPU_LDFLAGS-
$(CONFIG_CRIS
)+=-Wl
,-mcrislinux
421 CPU_LDFLAGS-
$(CONFIG_CRISV32
)+=-Wl
,-mcrislinux
422 CPU_CFLAGS-
$(CONFIG_CRIS
)+=-mlinux
427 ifeq ($(TARGET_ARCH
),m68k
)
428 # -fPIC is only supported for 68020 and above. It is not supported
429 # for 68000, 68010, or Coldfire.
434 ifeq ($(TARGET_ARCH
),powerpc
)
435 # PowerPC can hold 8192 entries in its GOT with -fpic which is more than
436 # enough. Therefore use -fpic which will reduce code size and generates
440 PPC_HAS_REL16
:=$(shell echo
-e
"\t.text\n\taddis 11,30,_GLOBAL_OFFSET_TABLE_-.@ha" |
$(CC
) -c
-x assembler
-o
/dev
/null
- 2> /dev
/null
&& echo
-n y || echo
-n n
)
441 CPU_CFLAGS-
$(PPC_HAS_REL16
)+= -DHAVE_ASM_PPC_REL16
442 CPU_CFLAGS-
$(CONFIG_E500
) += "-D__NO_MATH_INLINES"
446 ifeq ($(TARGET_ARCH
),bfin
)
448 ifeq ($(UCLIBC_FORMAT_FDPIC_ELF
),y
)
449 CPU_CFLAGS-y
:=-mfdpic
450 CPU_LDFLAGS-y
+= -Wl
,-melf32bfinfd
454 ifeq ($(UCLIBC_FORMAT_SHARED_FLAT
),y
)
455 PICFLAG
:= -mleaf-id-shared-library
459 ifeq ($(TARGET_ARCH
),frv
)
460 CPU_LDFLAGS-
$(CONFIG_FRV
)+=-Wl
,-melf32frvfd
461 # Using -pie causes the program to have an interpreter, which is
462 # forbidden, so we must make do with -shared. Unfortunately,
463 # -shared by itself would get us global function descriptors
464 # and calls through PLTs, dynamic resolution of symbols, etc,
465 # which would break as well, but -Bsymbolic comes to the rescue.
466 export LDPIEFLAG
:=-shared
-Wl
,-Bsymbolic
470 ifeq ($(strip $(TARGET_ARCH
)),avr32
)
471 CPU_CFLAGS-
$(CONFIG_AVR32_AP7
) += -march
=ap
472 CPU_CFLAGS-
$(CONFIG_LINKRELAX
) += -mrelax
473 CPU_LDFLAGS-
$(CONFIG_LINKRELAX
) += --relax
476 ifeq ($(TARGET_ARCH
),i960
)
480 ifeq ($(TARGET_ARCH
),microblaze
)
484 ifeq ($(TARGET_ARCH
),v850
)
488 # Keep the check_gcc from being needlessly executed
490 export PIEFLAG
:=$(call check_gcc
,$(PIEFLAG_NAME
),$(PICFLAG
))
492 # We need to keep track of both the CC PIE flag (above) as
493 # well as the LD PIE flag (below) because we can't rely on
494 # gcc passing -pie if we used -fPIE. We need to directly use -pie
495 # instead of -Wl,-pie as gcc picks up the wrong startfile/endfile
497 export LDPIEFLAG
:=$(shell $(LD
) --help
2>/dev
/null | grep
-q
-- -pie
&& echo
"-pie")
500 # Check for --as-needed support in linker
501 ifndef LD_FLAG_ASNEEDED
502 _LD_FLAG_ASNEEDED
:=$(shell $(LD
) --help
2>/dev
/null | grep
-- --as-needed
)
503 ifneq ($(_LD_FLAG_ASNEEDED
),)
504 export LD_FLAG_ASNEEDED
:=--as-needed
507 ifndef LD_FLAG_NO_ASNEEDED
508 ifdef LD_FLAG_ASNEEDED
509 export LD_FLAG_NO_ASNEEDED
:=--no-as-needed
512 ifndef CC_FLAG_ASNEEDED
513 ifdef LD_FLAG_ASNEEDED
514 export CC_FLAG_ASNEEDED
:=-Wl
,$(LD_FLAG_ASNEEDED
)
517 ifndef CC_FLAG_NO_ASNEEDED
518 ifdef LD_FLAG_NO_ASNEEDED
519 export CC_FLAG_NO_ASNEEDED
:=-Wl
,$(LD_FLAG_NO_ASNEEDED
)
522 link.asneeded
= $(if
$(and
$(CC_FLAG_ASNEEDED
),$(CC_FLAG_NO_ASNEEDED
)),$(CC_FLAG_ASNEEDED
) $(1) $(CC_FLAG_NO_ASNEEDED
))
524 # Check for AS_NEEDED support in linker script (binutils>=2.16.1 has it)
526 export ASNEEDED
:=$(shell $(LD
) --help
2>/dev
/null | grep
-q
-- --as-needed
&& echo
"AS_NEEDED ( $(UCLIBC_LDSO) )" || echo
"$(UCLIBC_LDSO)")
529 # Add a bunch of extra pedantic annoyingly strict checks
530 XWARNINGS
=$(call qstrip
,$(WARNINGS
)) -Wstrict-prototypes
-fno-strict-aliasing
531 ifeq ($(EXTRA_WARNINGS
),y
)
532 XWARNINGS
+=-Wnested-externs
-Wshadow
-Wmissing-noreturn
-Wmissing-format-attribute
-Wformat
=2
533 XWARNINGS
+=-Wmissing-prototypes
-Wmissing-declarations
534 XWARNINGS
+=-Wold-style-declaration
-Wold-style-definition
535 XWARNINGS
+=-Wnonnull
-Wundef
536 # Works only w/ gcc-3.4 and up, can't be checked for gcc-3.x w/ check_gcc()
537 #XWARNINGS+=-Wdeclaration-after-statement
539 CPU_CFLAGS
=$(call qstrip
,$(CPU_CFLAGS-y
))
541 SSP_DISABLE_FLAGS ?
= $(call check_gcc
,-fno-stack-protector
,)
542 ifeq ($(UCLIBC_BUILD_SSP
),y
)
543 SSP_CFLAGS
:= $(call check_gcc
,-fno-stack-protector-all
,)
544 SSP_CFLAGS
+= $(call check_gcc
,-fstack-protector
,)
545 SSP_ALL_CFLAGS ?
= $(call check_gcc
,-fstack-protector-all
,)
547 SSP_CFLAGS
:= $(SSP_DISABLE_FLAGS
)
550 NOSTDLIB_CFLAGS
:=$(call check_gcc
,-nostdlib
,)
552 # Collect all CFLAGS components
553 CFLAGS
:= -include $(top_srcdir
)include/libc-symbols.h \
554 $(XWARNINGS
) $(CPU_CFLAGS
) $(SSP_CFLAGS
) \
555 -nostdinc
-I
$(top_builddir
)include -I
$(top_srcdir
)include -I. \
556 -I
$(top_srcdir
)libc
/sysdeps
/linux \
557 -I
$(top_srcdir
)libc
/sysdeps
/linux
/$(TARGET_ARCH
)
558 ifneq ($(strip $(UCLIBC_EXTRA_CFLAGS
)),"")
559 CFLAGS
+= $(call qstrip
,$(UCLIBC_EXTRA_CFLAGS
))
562 # We need this to be checked within libc-symbols.h
563 ifneq ($(HAVE_SHARED
),y
)
567 LDFLAG_WARN_ONCE
:=$(if
$(call check_ld
,--warn-once
),-Wl
$(comma
)--warn-once
)
568 LDFLAG_SORT_COMMON
:=$(if
$(call check_ld
,--sort-common
),-Wl
$(comma
)--sort-common
)
569 LDFLAG_DISCARD_ALL
:=$(if
$(call check_ld
,--discard-all
),-Wl
$(comma
)--discard-all
)
570 LDFLAGS_NOSTRIP
:=$(CPU_LDFLAGS-y
) -shared \
571 -Wl
,--warn-common
$(LDFLAG_WARN_ONCE
) -Wl
,-z
,combreloc
572 # binutils-2.16.1 warns about ignored sections, 2.16.91.0.3 and newer are ok
573 #LDFLAGS_NOSTRIP+=$(call check_ld,--gc-sections)
575 ifeq ($(UCLIBC_BUILD_RELRO
),y
)
576 LDFLAGS_NOSTRIP
+=-Wl
,-z
,relro
579 ifeq ($(UCLIBC_BUILD_NOW
),y
)
580 LDFLAGS_NOSTRIP
+=-Wl
,-z
,now
583 ifeq ($(LDSO_GNU_HASH_SUPPORT
),y
)
584 # Be sure that binutils support it
585 LDFLAGS_GNUHASH
:=$(call check_ld
,--hash-style
=gnu
)
586 ifeq ($(LDFLAGS_GNUHASH
),)
587 ifneq ($(filter-out install_headers headers-y
,$(MAKECMDGOALS
)),)
588 $(error Your binutils do not support
--hash-style option
, while you want to use it
)
591 LDFLAGS_NOSTRIP
+= -Wl
,$(LDFLAGS_GNUHASH
)
595 LDFLAGS
:=$(LDFLAGS_NOSTRIP
) -Wl
,-z
,defs
597 CFLAGS
+= -O0
-g3
-DDEBUG
599 CFLAGS
+= $(OPTIMIZATION
)
604 STRIPTOOL
:= true
-Stripping_disabled
608 # we try to compile all sources at once into an object (IMA), but
609 # gcc-3.3.x does not support it
610 # gcc-3.4.x supports it, but does not need and support --combine. though fails on many sources
611 # gcc-4.0.x supports it, supports the --combine flag, but does not need it
612 # gcc-4.1(200506xx) supports it, but needs the --combine flag, else libs are useless
613 ifeq ($(GCC_MAJOR_VER
),3)
616 CFLAGS
+=$(call check_gcc
,--combine
,)
622 ifneq ($(strip $(UCLIBC_EXTRA_LDFLAGS
)),"")
623 LDFLAGS
+= $(call qstrip
,$(UCLIBC_EXTRA_LDFLAGS
))
626 ifeq ($(UCLIBC_HAS_THREADS
),y
)
627 ifeq ($(UCLIBC_HAS_THREADS_NATIVE
),y
)
630 ifeq ($(LINUXTHREADS_OLD
),y
)
631 PTNAME
:= linuxthreads.old
633 PTNAME
:= linuxthreads
636 PTDIR
:= libpthread
/$(PTNAME
)
637 # set up system dependencies include dirs (NOTE: order matters!)
638 ifeq ($(UCLIBC_HAS_THREADS_NATIVE
),y
)
639 PTINC
:= -I
$(top_builddir
)$(PTDIR
) \
640 -I
$(top_srcdir
)$(PTDIR
) \
641 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux
/$(TARGET_ARCH
)/$(TARGET_SUBARCH
) \
642 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux
/$(TARGET_ARCH
) \
643 -I
$(top_builddir
)$(PTDIR
)/sysdeps
/$(TARGET_ARCH
) \
644 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/$(TARGET_ARCH
) \
645 -I
$(top_builddir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux \
646 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux \
647 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/pthread \
648 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/pthread
/bits \
649 -I
$(top_srcdir
)ldso
/ldso
/$(TARGET_ARCH
) \
650 -I
$(top_srcdir
)ldso
/include
652 # Test for TLS if NPTL support was selected.
654 GCC_HAS_TLS
=$(shell \
655 echo
"extern __thread int foo;" |
$(CC
) -o
/dev
/null
-S
-xc
- 2>&1)
656 ifneq ($(GCC_HAS_TLS
),)
659 @echo
"#### Your compiler does not support TLS and you are trying to build uClibc";
660 @echo
"#### with NPTL support. Upgrade your binutils and gcc to versions which";
661 @echo
"#### support TLS for your architecture. Do not contact uClibc maintainers";
662 @echo
"#### about this problem.";
664 @echo
"#### Exiting...";
670 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux
/$(TARGET_ARCH
) \
671 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/$(TARGET_ARCH
) \
672 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux \
673 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/pthread \
674 -I
$(top_srcdir
)$(PTDIR
) \
675 -I
$(top_srcdir
)libpthread
682 CFLAGS
+= -I
$(top_srcdir
)libc
/sysdeps
/linux
/common
683 CFLAGS
+= -I
$(KERNEL_HEADERS
)
685 #CFLAGS += -iwithprefix include-fixed -iwithprefix include
686 CC_IPREFIX
:= $(shell $(CC
) --print-file-name
=include)
687 CC_INC
:= -isystem
$(dir $(CC_IPREFIX
))include-fixed
-isystem
$(CC_IPREFIX
)
690 ifneq ($(DOASSERTS
),y
)
694 ifeq ($(SYMBOL_PREFIX
),_
)
695 CFLAGS
+=-D__UCLIBC_UNDERSCORES__
698 # Keep the check_as from being needlessly executed
699 ifndef ASFLAGS_NOEXEC
700 ifeq ($(UCLIBC_BUILD_NOEXECSTACK
),y
)
701 export ASFLAGS_NOEXEC
:= $(call check_as
,--noexecstack
)
703 export ASFLAGS_NOEXEC
:=
706 ASFLAGS
= $(ASFLAGS_NOEXEC
)
708 LIBGCC_CFLAGS ?
= $(CFLAGS
) $(CPU_CFLAGS-y
)
709 LIBGCC
:=$(shell $(CC
) $(LIBGCC_CFLAGS
) -print-libgcc-file-name
)
710 LIBGCC_DIR
:=$(dir $(LIBGCC
))
712 # moved from libpthread/linuxthreads
713 ifeq ($(UCLIBC_CTOR_DTOR
),y
)
714 SHARED_START_FILES
:=$(top_builddir
)lib
/crti.o
$(LIBGCC_DIR
)crtbeginS.o
715 SHARED_END_FILES
:=$(LIBGCC_DIR
)crtendS.o
$(top_builddir
)lib
/crtn.o
718 LOCAL_INSTALL_PATH
:= install_dir