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 KERNEL_HEADERS
:=$(strip $(subst //,/, $(subst ,/, $(call qstrip
,$(KERNEL_HEADERS
)))))
101 export RUNTIME_PREFIX DEVEL_PREFIX KERNEL_HEADERS
104 # Now config hard core
109 VERSION
:= $(MAJOR_VERSION
).
$(MINOR_VERSION
).
$(SUBLEVEL
)
110 ifneq ($(EXTRAVERSION
),)
111 VERSION
:= $(VERSION
)$(EXTRAVERSION
)
113 # Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc.
115 export MAJOR_VERSION MINOR_VERSION SUBLEVEL VERSION LC_ALL
118 SHARED_MAJORNAME
:= $(LIBC
).so.
$(MAJOR_VERSION
)
119 ifneq ($(findstring $(TARGET_ARCH
) , hppa64 ia64 mips64 powerpc64 s390x sparc64 x86_64
),)
120 UCLIBC_LDSO_NAME
:= ld64-uClibc
121 ARCH_NATIVE_BIT
:= 64
123 UCLIBC_LDSO_NAME
:= ld-uClibc
124 ARCH_NATIVE_BIT
:= 32
126 UCLIBC_LDSO
:= $(UCLIBC_LDSO_NAME
).so.
$(MAJOR_VERSION
)
127 NONSHARED_LIBNAME
:= uclibc_nonshared.a
128 libc
:= $(top_builddir
)lib
/$(SHARED_MAJORNAME
)
129 libc.depend
:= $(top_builddir
)lib
/$(SHARED_MAJORNAME
:.
$(MAJOR_VERSION
)=)
130 interp
:= $(top_builddir
)lib
/interp.os
131 ldso
:= $(top_builddir
)lib
/$(UCLIBC_LDSO
)
132 headers_dep
:= $(top_builddir
)include/bits
/sysnum.h
133 sub_headers
:= $(headers_dep
)
135 #LIBS :=$(interp) -L$(top_builddir)lib -lc
136 LIBS
:= $(interp
) -L
$(top_builddir
)lib
$(libc
:.
$(MAJOR_VERSION
)=)
138 # Make sure DESTDIR and PREFIX can be used to install
139 # PREFIX is a uClibcism while DESTDIR is a common GNUism
144 ifneq ($(HAVE_SHARED
),y
)
154 CROSS
=$(call qstrip
,$(CROSS_COMPILER_PREFIX
))
157 # A nifty macro to make testing gcc features easier
159 if
$(CC
) $(1) -S
-o
/dev
/null
-xc
/dev
/null
> /dev
/null
2>&1; \
160 then echo
"$(1)"; else echo
"$(2)"; fi
)
162 if
$(CC
) -Wa
,$(1) -Wa
,-Z
-c
-o
/dev
/null
-xassembler
/dev
/null
> /dev
/null
2>&1; \
163 then echo
"-Wa,$(1)"; fi
)
165 if
$(LD
) $(1) -o
/dev
/null
-b binary
/dev
/null
> /dev
/null
2>&1; \
166 then echo
"$(1)"; fi
)
171 # Flags in OPTIMIZATION are used only for non-debug builds
174 # Use '-Os' optimization if available, else use -O2, allow Config to override
175 OPTIMIZATION
+=$(call check_gcc
,-Os
,-O2
)
176 # Use the gcc 3.4 -funit-at-a-time optimization when available
177 OPTIMIZATION
+=$(call check_gcc
,-funit-at-a-time
,)
178 # shrinks code by about 0.1%
179 OPTIMIZATION
+=$(call check_gcc
,-fmerge-all-constants
)
181 GCC_MAJOR_VER?
=$(shell $(CC
) -dumpversion | cut
-d .
-f
1)
182 #GCC_MINOR_VER?=$(shell $(CC) -dumpversion | cut -d . -f 2)
184 ifeq ($(GCC_MAJOR_VER
),4)
185 # shrinks code, results are from 4.0.2
187 OPTIMIZATION
+=$(call check_gcc
,-fno-tree-loop-optimize
,)
189 OPTIMIZATION
+=$(call check_gcc
,-fno-tree-dominator-opts
,)
191 OPTIMIZATION
+=$(call check_gcc
,-fno-strength-reduce
,)
195 # CPU_CFLAGS-y contain options which are not warnings,
196 # not include or library paths, and not optimizations.
198 # Why -funsigned-char: I hunted a bug related to incorrect
199 # sign extension of 'char' type for 10 hours straight. Not fun.
200 CPU_CFLAGS-y
:= -funsigned-char
-fno-builtin
202 CPU_CFLAGS-y
+= $(call check_gcc
,-fno-asm
,)
205 ifeq ($(UCLIBC_HAS_SOFT_FLOAT
),y
)
206 # If -msoft-float isn't supported, we want an error anyway.
207 # Hmm... might need to revisit this for arm since it has 2 different
208 # soft float encodings.
209 ifneq ($(TARGET_ARCH
),nios
)
210 ifneq ($(TARGET_ARCH
),nios2
)
211 ifneq ($(TARGET_ARCH
),sh
)
212 CPU_CFLAGS-y
+= -msoft-float
216 ifeq ($(TARGET_ARCH
),arm
)
217 # No longer needed with current toolchains, but leave it here for now.
218 # If anyone is actually still using gcc 2.95 (say), they can uncomment it.
219 # LDADD_LIBFLOAT=-lfloat
223 CPU_CFLAGS-y
+= $(call check_gcc
,-std
=gnu99
,)
225 CPU_CFLAGS-
$(UCLIBC_FORMAT_SHARED_FLAT
) += -mid-shared-library
226 CPU_CFLAGS-
$(UCLIBC_FORMAT_FLAT_SEP_DATA
) += -msep-data
228 CPU_LDFLAGS-
$(ARCH_LITTLE_ENDIAN
) += -Wl
,-EL
229 CPU_LDFLAGS-
$(ARCH_BIG_ENDIAN
) += -Wl
,-EB
232 PICFLAG-
$(UCLIBC_FORMAT_FDPIC_ELF
) := -mfdpic
233 PICFLAG
:= $(PICFLAG-y
)
236 # Some nice CPU specific optimizations
237 ifeq ($(TARGET_ARCH
),i386
)
238 OPTIMIZATION
+=$(call check_gcc
,-fomit-frame-pointer
,)
240 ifeq ($(CONFIG_386
)$(CONFIG_486
)$(CONFIG_586
)$(CONFIG_586MMX
),y
)
241 # Non-SSE capable processor.
242 # NB: this may make SSE insns segfault!
243 # -O1 -march=pentium3, -Os -msse etc are known to be affected.
244 # See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13685
245 # -m32 is needed if host is 64-bit
246 OPTIMIZATION
+=$(call check_gcc
,-m32
-mpreferred-stack-boundary
=2,)
248 OPTIMIZATION
+=$(call check_gcc
,-mpreferred-stack-boundary
=4,)
251 # Choice of alignment (please document why!)
252 # -falign-labels: in-line labels
253 # (reachable by normal code flow, aligning will insert nops
254 # which will be executed - may even make things slower)
255 # -falign-jumps: reachable only by a jump
256 # Generic: no alignment at all (smallest code)
257 GCC_FALIGN
=$(call check_gcc
,-falign-functions
=1 -falign-jumps
=1 -falign-labels
=1 -falign-loops
=1,-malign-jumps
=1 -malign-loops
=1)
258 ifeq ($(CONFIG_K7
),y
)
259 # Align functions to four bytes, use default for jumps and loops (why?)
260 GCC_FALIGN
=$(call check_gcc
,-falign-functions
=4 -falign-labels
=1,-malign-functions
=4)
262 ifeq ($(CONFIG_CRUSOE
),y
)
263 # Use compiler's default for functions, jumps and loops (why?)
264 GCC_FALIGN
=$(call check_gcc
,-falign-functions
=0 -falign-labels
=1,-malign-functions
=0)
266 ifeq ($(CONFIG_CYRIXIII
),y
)
267 # Use compiler's default for functions, jumps and loops (why?)
268 GCC_FALIGN
=$(call check_gcc
,-falign-functions
=0 -falign-labels
=1,-malign-functions
=0)
270 OPTIMIZATION
+=$(GCC_FALIGN
)
272 # Putting each function and data object into its own section
273 # allows for kbytes of less text if users link against static uclibc
274 # using ld --gc-sections.
275 # ld 2.18 can't do that (yet?) for shared libraries, so we itself
276 # do not use --gc-sections at shared lib link time.
277 # However, in combination with sections being sorted by alignment
278 # it does result in much reduced padding:
279 # text data bss dec hex
280 # 235319 1472 5992 242783 3b45f old.so
281 # 234104 1472 5980 241556 3af94 new.so
282 # Without -ffunction-sections, all functions will get aligned
283 # to 4 byte boundary by as/ld. This is arguably a bug in as.
284 # It specifies 4 byte align for .text even if not told to do so:
285 # Idx Name Size VMA LMA File off Algn
286 # 0 .text xxxxxxxx 00000000 00000000 xxxxxxxx 2**2 <===!
287 CPU_CFLAGS-y
+= $(call check_gcc
,-ffunction-sections
-fdata-sections
,)
288 ifneq ($(call check_ld
,--sort-common
),)
289 CPU_LDFLAGS-y
+= -Wl
,--sort-common
291 ifneq ($(call check_ld
,--sort-section alignment
),)
292 CPU_LDFLAGS-y
+= -Wl
,--sort-section
,alignment
297 CPU_CFLAGS-
$(CONFIG_386
)+=-march
=i386
298 CPU_CFLAGS-
$(CONFIG_486
)+=-march
=i486
299 CPU_CFLAGS-
$(CONFIG_ELAN
)+=-march
=i486
300 CPU_CFLAGS-
$(CONFIG_586
)+=-march
=i586
301 CPU_CFLAGS-
$(CONFIG_586MMX
)+=$(call check_gcc
,-march
=pentium-mmx
,-march
=i586
)
302 CPU_CFLAGS-
$(CONFIG_686
)+=-march
=i686
303 CPU_CFLAGS-
$(CONFIG_PENTIUMII
)+=$(call check_gcc
,-march
=pentium2
,-march
=i686
)
304 CPU_CFLAGS-
$(CONFIG_PENTIUMIII
)+=$(call check_gcc
,-march
=pentium3
,-march
=i686
)
305 CPU_CFLAGS-
$(CONFIG_PENTIUM4
)+=$(call check_gcc
,-march
=pentium4
,-march
=i686
)
306 CPU_CFLAGS-
$(CONFIG_K6
)+=$(call check_gcc
,-march
=k6
,-march
=i586
)
307 CPU_CFLAGS-
$(CONFIG_K7
)+=$(call check_gcc
,-march
=athlon
,-march
=i686
)
308 CPU_CFLAGS-
$(CONFIG_CRUSOE
)+=-march
=i686
309 CPU_CFLAGS-
$(CONFIG_WINCHIPC6
)+=$(call check_gcc
,-march
=winchip-c6
,-march
=i586
)
310 CPU_CFLAGS-
$(CONFIG_WINCHIP2
)+=$(call check_gcc
,-march
=winchip2
,-march
=i586
)
311 CPU_CFLAGS-
$(CONFIG_CYRIXIII
)+=$(call check_gcc
,-march
=c3
,-march
=i486
)
312 CPU_CFLAGS-
$(CONFIG_NEHEMIAH
)+=$(call check_gcc
,-march
=c3-2
,-march
=i686
)
315 ifeq ($(TARGET_ARCH
),sparc
)
316 CPU_CFLAGS-
$(CONFIG_SPARC_V7
)+=-mcpu
=v7
317 CPU_CFLAGS-
$(CONFIG_SPARC_V8
)+=-mcpu
=v8
318 CPU_CFLAGS-
$(CONFIG_SPARC_V9
)+=-mcpu
=v9
319 CPU_CFLAGS-
$(CONFIG_SPARC_V9B
)+=$(call check_gcc
,-mcpu
=v9b
,-mcpu
=ultrasparc
)
322 ifeq ($(TARGET_ARCH
),arm
)
323 OPTIMIZATION
+=-fstrict-aliasing
324 CPU_CFLAGS-
$(ARCH_LITTLE_ENDIAN
)+=-mlittle-endian
325 CPU_CFLAGS-
$(ARCH_BIG_ENDIAN
)+=-mbig-endian
326 CPU_CFLAGS-
$(CONFIG_GENERIC_ARM
)+=
327 CPU_CFLAGS-
$(CONFIG_ARM610
)+=-mtune
=arm610
-march
=armv3
328 CPU_CFLAGS-
$(CONFIG_ARM710
)+=-mtune
=arm710
-march
=armv3
329 CPU_CFLAGS-
$(CONFIG_ARM7TDMI
)+=-mtune
=arm7tdmi
-march
=armv4t
330 CPU_CFLAGS-
$(CONFIG_ARM720T
)+=-mtune
=arm7tdmi
-march
=armv4t
331 CPU_CFLAGS-
$(CONFIG_ARM920T
)+=-mtune
=arm9tdmi
-march
=armv4t
332 CPU_CFLAGS-
$(CONFIG_ARM922T
)+=-mtune
=arm9tdmi
-march
=armv4t
333 CPU_CFLAGS-
$(CONFIG_ARM926T
)+=-mtune
=arm9tdmi
-march
=armv5t
334 CPU_CFLAGS-
$(CONFIG_ARM10T
)+=-mtune
=arm10tdmi
-march
=armv5t
335 CPU_CFLAGS-
$(CONFIG_ARM1136JF_S
)+=-mtune
=arm1136jf-s
-march
=armv6
336 CPU_CFLAGS-
$(CONFIG_ARM1176JZ_S
)+=-mtune
=arm1176jz-s
-march
=armv6
337 CPU_CFLAGS-
$(CONFIG_ARM1176JZF_S
)+=-mtune
=arm1176jzf-s
-march
=armv6
338 CPU_CFLAGS-
$(CONFIG_ARM_SA110
)+=-mtune
=strongarm110
-march
=armv4
339 CPU_CFLAGS-
$(CONFIG_ARM_SA1100
)+=-mtune
=strongarm1100
-march
=armv4
340 CPU_CFLAGS-
$(CONFIG_ARM_XSCALE
)+=$(call check_gcc
,-mtune
=xscale
,-mtune
=strongarm110
)
341 CPU_CFLAGS-
$(CONFIG_ARM_XSCALE
)+=-march
=armv5te
-Wa
,-mcpu
=xscale
342 CPU_CFLAGS-
$(CONFIG_ARM_IWMMXT
)+=-march
=iwmmxt
-Wa
,-mcpu
=iwmmxt
-mabi
=iwmmxt
343 CPU_CFLAGS-
$(CONFIG_ARM_CORTEX_M3
)+=-mcpu
=cortex-m3
-mthumb
344 CPU_CFLAGS-
$(CONFIG_ARM_CORTEX_M1
)+=-mcpu
=cortex-m1
-mthumb
347 ifeq ($(TARGET_ARCH
),mips
)
348 OPTIMIZATIONS
+=-mno-split-addresses
349 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_1
)+=-mips1
350 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_2
)+=-mips2
-mtune
=mips2
351 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_3
)+=-mips3
-mtune
=mips3
352 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_4
)+=-mips4
-mtune
=mips4
353 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_MIPS32
)+=-mips32
-mtune
=mips32
354 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_MIPS32R2
)+=-march
=mips32r2
-mtune
=mips32r2
355 CPU_CFLAGS-
$(CONFIG_MIPS_ISA_MIPS64
)+=-mips64
-mtune
=mips32
356 ifeq ($(strip $(ARCH_BIG_ENDIAN
)),y
)
357 CPU_LDFLAGS-
$(CONFIG_MIPS_N64_ABI
)+=-Wl
,-melf64btsmip
358 CPU_LDFLAGS-
$(CONFIG_MIPS_O32_ABI
)+=-Wl
,-melf32btsmip
360 ifeq ($(strip $(ARCH_LITTLE_ENDIAN
)),y
)
361 CPU_LDFLAGS-
$(CONFIG_MIPS_N64_ABI
)+=-Wl
,-melf64ltsmip
362 CPU_LDFLAGS-
$(CONFIG_MIPS_O32_ABI
)+=-Wl
,-melf32ltsmip
364 CPU_CFLAGS-
$(CONFIG_MIPS_N64_ABI
)+=-mabi
=64
365 CPU_CFLAGS-
$(CONFIG_MIPS_O32_ABI
)+=-mabi
=32
366 CPU_CFLAGS-
$(CONFIG_MIPS_N32_ABI
)+=-mabi
=n32
369 ifeq ($(TARGET_ARCH
),nios
)
370 OPTIMIZATIONS
+=-funaligned-struct-hack
371 CPU_LDFLAGS-y
+=-Wl
,-m32
372 CPU_CFLAGS-y
+=-Wl
,-m32
375 ifeq ($(TARGET_ARCH
),sh
)
376 OPTIMIZATION
+=-fstrict-aliasing
377 OPTIMIZATION
+= $(call check_gcc
,-mprefergot
,)
378 CPU_CFLAGS-
$(ARCH_LITTLE_ENDIAN
)+=-ml
379 CPU_CFLAGS-
$(ARCH_BIG_ENDIAN
)+=-mb
380 CPU_CFLAGS-
$(CONFIG_SH2
)+=-m2
381 CPU_CFLAGS-
$(CONFIG_SH3
)+=-m3
382 ifeq ($(UCLIBC_HAS_FPU
),y
)
383 CPU_CFLAGS-
$(CONFIG_SH2A
)+=-m2a
384 CPU_CFLAGS-
$(CONFIG_SH4
)+=-m4
386 CPU_CFLAGS-
$(CONFIG_SH2A
)+=-m2a-nofpu
387 CPU_CFLAGS-
$(CONFIG_SH4
)+=-m4-nofpu
391 ifeq ($(TARGET_ARCH
),sh64
)
392 OPTIMIZATION
+=-fstrict-aliasing
393 CPU_CFLAGS-
$(ARCH_LITTLE_ENDIAN
):=-ml
394 CPU_CFLAGS-
$(ARCH_BIG_ENDIAN
):=-mb
395 CPU_CFLAGS-
$(CONFIG_SH5
)+=-m5-32media
398 ifeq ($(TARGET_ARCH
),h8300
)
400 CPU_LDFLAGS-
$(CONFIG_H8300H
)+= -Wl
,-ms8300h
401 CPU_LDFLAGS-
$(CONFIG_H8S
) += -Wl
,-ms8300s
402 CPU_CFLAGS-
$(CONFIG_H8300H
) += -mh
-mint32
403 CPU_CFLAGS-
$(CONFIG_H8S
) += -ms
-mint32
406 ifeq ($(TARGET_ARCH
),i960
)
407 OPTIMIZATIONS
+=-mh
-mint32
#-fsigned-char
410 ifeq ($(TARGET_ARCH
),e1
)
411 OPTIMIZATIONS
+=-mgnu-param
414 ifeq ($(TARGET_ARCH
),cris
)
415 CPU_LDFLAGS-
$(CONFIG_CRIS
)+=-Wl
,-mcrislinux
416 CPU_LDFLAGS-
$(CONFIG_CRISV32
)+=-Wl
,-mcrislinux
417 CPU_CFLAGS-
$(CONFIG_CRIS
)+=-mlinux
422 ifeq ($(TARGET_ARCH
),m68k
)
423 # -fPIC is only supported for 68020 and above. It is not supported
424 # for 68000, 68010, or Coldfire.
429 ifeq ($(TARGET_ARCH
),powerpc
)
430 # PowerPC can hold 8192 entries in its GOT with -fpic which is more than
431 # enough. Therefore use -fpic which will reduce code size and generates
435 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
)
436 CPU_CFLAGS-
$(PPC_HAS_REL16
)+= -DHAVE_ASM_PPC_REL16
437 CPU_CFLAGS-
$(CONFIG_E500
) += "-D__NO_MATH_INLINES"
441 ifeq ($(TARGET_ARCH
),bfin
)
443 ifeq ($(UCLIBC_FORMAT_FDPIC_ELF
),y
)
444 CPU_CFLAGS-y
:=-mfdpic
445 CPU_LDFLAGS-y
+= -Wl
,-melf32bfinfd
449 ifeq ($(UCLIBC_FORMAT_SHARED_FLAT
),y
)
450 PICFLAG
:= -mleaf-id-shared-library
454 ifeq ($(TARGET_ARCH
),frv
)
455 CPU_LDFLAGS-
$(CONFIG_FRV
)+=-Wl
,-melf32frvfd
456 # Using -pie causes the program to have an interpreter, which is
457 # forbidden, so we must make do with -shared. Unfortunately,
458 # -shared by itself would get us global function descriptors
459 # and calls through PLTs, dynamic resolution of symbols, etc,
460 # which would break as well, but -Bsymbolic comes to the rescue.
461 export LDPIEFLAG
:=-shared
-Wl
,-Bsymbolic
465 ifeq ($(strip $(TARGET_ARCH
)),avr32
)
466 CPU_CFLAGS-
$(CONFIG_AVR32_AP7
) += -march
=ap
467 CPU_CFLAGS-
$(CONFIG_LINKRELAX
) += -mrelax
468 CPU_LDFLAGS-
$(CONFIG_LINKRELAX
) += --relax
471 ifeq ($(TARGET_ARCH
),i960
)
475 ifeq ($(TARGET_ARCH
),microblaze
)
479 ifeq ($(TARGET_ARCH
),v850
)
483 # Keep the check_gcc from being needlessly executed
485 export PIEFLAG
:=$(call check_gcc
,$(PIEFLAG_NAME
),$(PICFLAG
))
487 # We need to keep track of both the CC PIE flag (above) as
488 # well as the LD PIE flag (below) because we can't rely on
489 # gcc passing -pie if we used -fPIE. We need to directly use -pie
490 # instead of -Wl,-pie as gcc picks up the wrong startfile/endfile
492 export LDPIEFLAG
:=$(shell $(LD
) --help
2>/dev
/null | grep
-q
-- -pie
&& echo
"-pie")
495 # Check for --as-needed support in linker
496 ifndef LD_FLAG_ASNEEDED
497 _LD_FLAG_ASNEEDED
:=$(shell $(LD
) --help
2>/dev
/null | grep
-- --as-needed
)
498 ifneq ($(_LD_FLAG_ASNEEDED
),)
499 export LD_FLAG_ASNEEDED
:=--as-needed
502 ifndef LD_FLAG_NO_ASNEEDED
503 ifdef LD_FLAG_ASNEEDED
504 export LD_FLAG_NO_ASNEEDED
:=--no-as-needed
507 ifndef CC_FLAG_ASNEEDED
508 ifdef LD_FLAG_ASNEEDED
509 export CC_FLAG_ASNEEDED
:=-Wl
,$(LD_FLAG_ASNEEDED
)
512 ifndef CC_FLAG_NO_ASNEEDED
513 ifdef LD_FLAG_NO_ASNEEDED
514 export CC_FLAG_NO_ASNEEDED
:=-Wl
,$(LD_FLAG_NO_ASNEEDED
)
517 link.asneeded
= $(if
$(and
$(CC_FLAG_ASNEEDED
),$(CC_FLAG_NO_ASNEEDED
)),$(CC_FLAG_ASNEEDED
) $(1) $(CC_FLAG_NO_ASNEEDED
))
519 # Check for AS_NEEDED support in linker script (binutils>=2.16.1 has it)
521 export ASNEEDED
:=$(shell $(LD
) --help
2>/dev
/null | grep
-q
-- --as-needed
&& echo
"AS_NEEDED ( $(UCLIBC_LDSO) )" || echo
"$(UCLIBC_LDSO)")
524 # Add a bunch of extra pedantic annoyingly strict checks
525 XWARNINGS
=$(call qstrip
,$(WARNINGS
)) -Wstrict-prototypes
-fno-strict-aliasing
526 ifeq ($(EXTRA_WARNINGS
),y
)
527 XWARNINGS
+=-Wnested-externs
-Wshadow
-Wmissing-noreturn
-Wmissing-format-attribute
-Wformat
=2
528 XWARNINGS
+=-Wmissing-prototypes
-Wmissing-declarations
529 XWARNINGS
+=-Wold-style-declaration
-Wold-style-definition
530 XWARNINGS
+=-Wnonnull
-Wundef
531 # Works only w/ gcc-3.4 and up, can't be checked for gcc-3.x w/ check_gcc()
532 #XWARNINGS+=-Wdeclaration-after-statement
534 CPU_CFLAGS
=$(call qstrip
,$(CPU_CFLAGS-y
))
536 SSP_DISABLE_FLAGS ?
= $(call check_gcc
,-fno-stack-protector
,)
537 ifeq ($(UCLIBC_BUILD_SSP
),y
)
538 SSP_CFLAGS
:= $(call check_gcc
,-fno-stack-protector-all
,)
539 SSP_CFLAGS
+= $(call check_gcc
,-fstack-protector
,)
540 SSP_ALL_CFLAGS ?
= $(call check_gcc
,-fstack-protector-all
,)
542 SSP_CFLAGS
:= $(SSP_DISABLE_FLAGS
)
545 NOSTDLIB_CFLAGS
:=$(call check_gcc
,-nostdlib
,)
547 # Collect all CFLAGS components
548 CFLAGS
:= -include $(top_srcdir
)include/libc-symbols.h \
549 $(XWARNINGS
) $(CPU_CFLAGS
) $(SSP_CFLAGS
) \
550 -nostdinc
-I
$(top_builddir
)include -I
$(top_srcdir
)include -I. \
551 -I
$(top_srcdir
)libc
/sysdeps
/linux \
552 -I
$(top_srcdir
)libc
/sysdeps
/linux
/$(TARGET_ARCH
)
553 ifneq ($(strip $(UCLIBC_EXTRA_CFLAGS
)),"")
554 CFLAGS
+= $(call qstrip
,$(UCLIBC_EXTRA_CFLAGS
))
557 # We need this to be checked within libc-symbols.h
558 ifneq ($(HAVE_SHARED
),y
)
562 LDFLAG_WARN_ONCE
:=$(if
$(call check_ld
,--warn-once
),-Wl
$(comma
)--warn-once
)
563 LDFLAG_SORT_COMMON
:=$(if
$(call check_ld
,--sort-common
),-Wl
$(comma
)--sort-common
)
564 LDFLAG_DISCARD_ALL
:=$(if
$(call check_ld
,--discard-all
),-Wl
$(comma
)--discard-all
)
565 LDFLAGS_NOSTRIP
:=$(CPU_LDFLAGS-y
) -shared \
566 -Wl
,--warn-common
$(LDFLAG_WARN_ONCE
) -Wl
,-z
,combreloc
567 # binutils-2.16.1 warns about ignored sections, 2.16.91.0.3 and newer are ok
568 #LDFLAGS_NOSTRIP+=$(call check_ld,--gc-sections)
570 ifeq ($(UCLIBC_BUILD_RELRO
),y
)
571 LDFLAGS_NOSTRIP
+=-Wl
,-z
,relro
574 ifeq ($(UCLIBC_BUILD_NOW
),y
)
575 LDFLAGS_NOSTRIP
+=-Wl
,-z
,now
578 ifeq ($(LDSO_GNU_HASH_SUPPORT
),y
)
579 # Be sure that binutils support it
580 LDFLAGS_GNUHASH
:=$(call check_ld
,--hash-style
=gnu
)
581 ifeq ($(LDFLAGS_GNUHASH
),)
582 ifneq ($(filter-out install_headers headers-y
,$(MAKECMDGOALS
)),)
583 $(error Your binutils do not support
--hash-style option
, while you want to use it
)
586 LDFLAGS_NOSTRIP
+= -Wl
,$(LDFLAGS_GNUHASH
)
590 LDFLAGS
:=$(LDFLAGS_NOSTRIP
) -Wl
,-z
,defs
592 CFLAGS
+= -O0
-g3
-DDEBUG
594 CFLAGS
+= $(OPTIMIZATION
)
599 STRIPTOOL
:= true
-Stripping_disabled
603 # we try to compile all sources at once into an object (IMA), but
604 # gcc-3.3.x does not support it
605 # gcc-3.4.x supports it, but does not need and support --combine. though fails on many sources
606 # gcc-4.0.x supports it, supports the --combine flag, but does not need it
607 # gcc-4.1(200506xx) supports it, but needs the --combine flag, else libs are useless
608 ifeq ($(GCC_MAJOR_VER
),3)
611 CFLAGS
+=$(call check_gcc
,--combine
,)
617 ifneq ($(strip $(UCLIBC_EXTRA_LDFLAGS
)),"")
618 LDFLAGS
+= $(call qstrip
,$(UCLIBC_EXTRA_LDFLAGS
))
621 ifeq ($(UCLIBC_HAS_THREADS
),y
)
622 ifeq ($(UCLIBC_HAS_THREADS_NATIVE
),y
)
625 ifeq ($(LINUXTHREADS_OLD
),y
)
626 PTNAME
:= linuxthreads.old
628 PTNAME
:= linuxthreads
631 PTDIR
:= libpthread
/$(PTNAME
)
632 # set up system dependencies include dirs (NOTE: order matters!)
633 ifeq ($(UCLIBC_HAS_THREADS_NATIVE
),y
)
634 PTINC
:= -I
$(top_srcdir
)$(PTDIR
) \
635 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux
/$(TARGET_ARCH
)/$(TARGET_SUBARCH
) \
636 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux
/$(TARGET_ARCH
) \
637 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/$(TARGET_ARCH
) \
638 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux \
639 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/pthread \
640 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/pthread
/bits \
641 -I
$(top_srcdir
)ldso
/ldso
/$(TARGET_ARCH
) \
642 -I
$(top_srcdir
)ldso
/include
644 # Test for TLS if NPTL support was selected.
646 GCC_HAS_TLS
=$(shell \
647 echo
"extern __thread int foo;" |
$(CC
) -o
/dev
/null
-S
-xc
- 2>&1)
648 ifneq ($(GCC_HAS_TLS
),)
651 @echo
"#### Your compiler does not support TLS and you are trying to build uClibc";
652 @echo
"#### with NPTL support. Upgrade your binutils and gcc to versions which";
653 @echo
"#### support TLS for your architecture. Do not contact uClibc maintainers";
654 @echo
"#### about this problem.";
656 @echo
"#### Exiting...";
662 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux
/$(TARGET_ARCH
) \
663 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/$(TARGET_ARCH
) \
664 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/unix
/sysv
/linux \
665 -I
$(top_srcdir
)$(PTDIR
)/sysdeps
/pthread \
666 -I
$(top_srcdir
)$(PTDIR
) \
667 -I
$(top_srcdir
)libpthread
674 CFLAGS
+= -I
$(top_srcdir
)libc
/sysdeps
/linux
/common
675 CFLAGS
+= -I
$(KERNEL_HEADERS
)
677 #CFLAGS += -iwithprefix include-fixed -iwithprefix include
678 CC_IPREFIX
:= $(shell $(CC
) --print-file-name
=include)
679 CC_INC
:= -isystem
$(dir $(CC_IPREFIX
))include-fixed
-isystem
$(CC_IPREFIX
)
682 ifneq ($(DOASSERTS
),y
)
686 ifeq ($(SYMBOL_PREFIX
),_
)
687 CFLAGS
+=-D__UCLIBC_UNDERSCORES__
690 # Keep the check_as from being needlessly executed
691 ifndef ASFLAGS_NOEXEC
692 ifeq ($(UCLIBC_BUILD_NOEXECSTACK
),y
)
693 export ASFLAGS_NOEXEC
:= $(call check_as
,--noexecstack
)
695 export ASFLAGS_NOEXEC
:=
698 ASFLAGS
= $(ASFLAGS_NOEXEC
)
700 LIBGCC_CFLAGS ?
= $(CFLAGS
) $(CPU_CFLAGS-y
)
701 LIBGCC
:=$(shell $(CC
) $(LIBGCC_CFLAGS
) -print-libgcc-file-name
)
702 LIBGCC_DIR
:=$(dir $(LIBGCC
))
704 # moved from libpthread/linuxthreads
705 ifeq ($(UCLIBC_CTOR_DTOR
),y
)
706 SHARED_START_FILES
:=$(top_builddir
)lib
/crti.o
$(LIBGCC_DIR
)crtbeginS.o
707 SHARED_END_FILES
:=$(LIBGCC_DIR
)crtendS.o
$(top_builddir
)lib
/crtn.o
710 LOCAL_INSTALL_PATH
:= install_dir