1# Rules.make for uClibc 2# 3# Copyright (C) 2000-2008 Erik Andersen <andersen@uclibc.org> 4# 5# Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. 6# 7 8# make nano-doc 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 :=). 17 18 19# check for proper make version 20ifneq ($(findstring x3.7,x$(MAKE_VERSION)),) 21$(error Your make is too old $(MAKE_VERSION). Go get at least 3.80) 22endif 23 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. 29 30clean_targets := clean realclean distclean \ 31 objclean-y headers_clean-y CLEAN_utils 32noconfig_targets := menuconfig config nconfig \ 33 oldaskconfig silentoldconfig oldconfig allnoconfig allyesconfig \ 34 alldefconfig randconfig defconfig savedefconfig listnewconfig \ 35 olddefconfig \ 36 xconfig gconfig update-po-config mconf qconf gconf nconf conf \ 37 release dist tags help 38 39 40#----------------------------------------------------------- 41# If you are running a cross compiler, you will want to set 42# 'CROSS_COMPILE' to something more interesting ... Target 43# architecture is determined by asking the CC compiler what 44# arch it compiles things for, so unless your compiler is 45# broken, you should not need to specify TARGET_ARCH. 46# 47# Most people will set this stuff on the command line, i.e. 48# make CROSS_COMPILE=arm-linux- 49# will build uClibc for 'arm'. 50# CROSS is still supported for backward compatibily only 51 52CROSS_COMPILE ?= $(CROSS) 53 54CC = $(CROSS_COMPILE)gcc 55AR = $(CROSS_COMPILE)ar 56LD = $(CROSS_COMPILE)ld 57NM = $(CROSS_COMPILE)nm 58OBJDUMP = $(CROSS_COMPILE)objdump 59STRIPTOOL = $(CROSS_COMPILE)strip 60 61INSTALL = install 62LN = ln 63RM = rm -f 64TAR = tar 65SED = sed 66AWK = awk 67 68STRIP_FLAGS ?= -x -R .note -R .comment 69 70## unused? if yes, remove after 0.9.31 71## UNIFDEF := $(top_builddir)extra/scripts/unifdef 72 73# Select the compiler needed to build binaries for your development system 74HOSTCC = gcc 75BUILD_CFLAGS = -Os 76 77#--------------------------------------------------------- 78# Nothing beyond this point should ever be touched by mere 79# mortals. Unless you hang out with the gods, you should 80# probably leave all this stuff alone. 81 82# strip quotes 83qstrip = $(strip $(subst ",,$(1))) 84#")) 85 86# kconfig stuff 87KCONFIG_CONFIG ?= $(top_builddir).config 88KCONFIG_CONFIG := $(abspath $(KCONFIG_CONFIG)) 89export KCONFIG_CONFIG 90KCONFIG_AUTOCONFIG := $(dir $(KCONFIG_CONFIG))include/config/auto.conf 91export KCONFIG_AUTOCONFIG 92KCONFIG_TRISTATE := $(dir $(KCONFIG_CONFIG))include/config/tristate.conf 93export KCONFIG_TRISTATE 94srctree := $(abspath $(top_srcdir)) 95export srctree 96KCONFIG_AUTOHEADER := $(dir $(KCONFIG_CONFIG))include/generated/autoconf.h 97export KCONFIG_AUTOHEADER 98Kconfig := $(abspath $(top_srcdir)extra/Configs/Config.in) 99 100# Pull in the user's uClibc configuration 101ifeq ($(filter $(noconfig_targets) clean CLEAN_%,$(MAKECMDGOALS)),) 102-include $(KCONFIG_CONFIG) 103endif 104 105TARGET_ARCH:=$(call qstrip,$(TARGET_ARCH)) 106ifeq ($(TARGET_ARCH),) 107ARCH ?= $(shell uname -m | $(SED) -e s/i.86/i386/ \ 108 -e s/sun.*/sparc/ -e s/sparc.*/sparc/ \ 109 -e s/arm.*/arm/ -e s/sa110/arm/ \ 110 -e s/sh.*/sh/ \ 111 -e s/s390x/s390/ -e s/parisc.*/hppa/ \ 112 -e s/ppc.*/powerpc/ -e s/mips.*/mips/ \ 113 -e s/xtensa.*/xtensa/ ) 114else 115ARCH = $(TARGET_ARCH) 116endif 117export ARCH 118 119# Make certain these contain a final "/", but no "//"s. 120scrub_path = $(strip $(subst //,/, $(subst ,/, $(call qstrip,$(1))))) 121TARGET_SUBARCH := $(call qstrip,$(TARGET_SUBARCH)) 122RUNTIME_PREFIX := $(call scrub_path,$(RUNTIME_PREFIX)) 123DEVEL_PREFIX := $(call scrub_path,$(DEVEL_PREFIX)) 124MULTILIB_DIR := $(call scrub_path,$(MULTILIB_DIR)) 125KERNEL_HEADERS := $(call scrub_path,$(KERNEL_HEADERS)) 126export RUNTIME_PREFIX DEVEL_PREFIX KERNEL_HEADERS MULTILIB_DIR 127 128 129# Now config hard core 130MAJOR_VERSION := 0 131MINOR_VERSION := 9 132SUBLEVEL := 34 133EXTRAVERSION :=-git 134VERSION := $(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL) 135ABI_VERSION := $(MAJOR_VERSION) 136ifneq ($(EXTRAVERSION),) 137VERSION := $(VERSION)$(EXTRAVERSION) 138endif 139# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc. 140LC_ALL := C 141export MAJOR_VERSION MINOR_VERSION SUBLEVEL VERSION ABI_VERSION LC_ALL 142 143LIBC := libc 144SHARED_LIBNAME := $(LIBC).so.$(ABI_VERSION) 145UBACKTRACE_DSO := libubacktrace.so.$(ABI_VERSION) 146 147UCLIBC_LDSO_NAME := ld-uClibc 148ARCH_NATIVE_BIT := 32 149ifneq ($(findstring $(TARGET_ARCH) , hppa64 ia64 powerpc64 s390x sparc64 x86_64 ),) 150UCLIBC_LDSO_NAME := ld64-uClibc 151ARCH_NATIVE_BIT := 64 152else 153ifeq ($(CONFIG_MIPS_N64_ABI),y) 154UCLIBC_LDSO_NAME := ld64-uClibc 155ARCH_NATIVE_BIT := 64 156endif 157endif 158 159UCLIBC_LDSO := $(UCLIBC_LDSO_NAME).so.$(ABI_VERSION) 160NONSHARED_LIBNAME := uclibc_nonshared.a 161libc := $(top_builddir)lib/$(SHARED_LIBNAME) 162libc.depend := $(top_builddir)lib/$(SHARED_LIBNAME:.$(ABI_VERSION)=) 163ifneq ($(ARCH_HAS_NO_SHARED),y) 164libdl.depend := $(top_builddir)lib/libdl.so 165endif 166ifneq ($(HAS_NO_THREADS),y) 167libpthread.depend := $(top_builddir)lib/libpthread.so 168endif 169interp := $(top_builddir)lib/interp.os 170ldso := $(top_builddir)lib/$(UCLIBC_LDSO) 171headers_dep := $(top_builddir)include/bits/sysnum.h 172sub_headers := $(headers_dep) 173 174#LIBS :=$(interp) -L$(top_builddir)lib -lc 175LIBS := $(interp) -L$(top_builddir)lib $(libc:.$(ABI_VERSION)=) 176 177# Make sure DESTDIR and PREFIX can be used to install 178# PREFIX is a uClibcism while DESTDIR is a common GNUism 179ifndef PREFIX 180PREFIX = $(DESTDIR) 181endif 182 183ifneq ($(HAVE_SHARED),y) 184libc := 185interp := 186ldso := 187endif 188 189comma:=, 190space:= # 191 192ifeq ($(CROSS_COMPILE),) 193CROSS_COMPILE=$(call qstrip,$(CROSS_COMPILER_PREFIX)) 194endif 195 196# A nifty macro to make testing gcc features easier 197check_gcc=$(shell \ 198 if $(CC) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1; \ 199 then echo "$(1)"; else echo "$(2)"; fi) 200check_as=$(shell \ 201 if $(CC) -Wa,$(1) -Wa,-Z -c -o /dev/null -xassembler /dev/null > /dev/null 2>&1; \ 202 then echo "-Wa,$(1)"; fi) 203check_ld=$(shell \ 204 if $(CC) $(LDFLAG-fuse-ld) -Wl,$(1) $(CFLAG_-nostdlib) -o /dev/null -Wl,-b,binary /dev/null > /dev/null 2>&1; \ 205 then echo "$(1)"; fi) 206 207# Use variable indirection here so that we can have variable 208# names with fun chars in them like equal signs 209define check-tool-var 210ifeq ($(filter $(clean_targets) CLEAN_%,$(MAKECMDGOALS)),) 211_v = $(2)_$(3) 212ifndef $$(_v) 213$$(_v) := $$(call $(1),$(subst %, ,$(3))) 214export $$(_v) 215endif 216endif 217endef 218 219# Usage: check-gcc-var,<flag> 220# Check the C compiler to see if it supports <flag>. 221# Export the variable CFLAG_<flag> if it does. 222define check-gcc-var 223$(call check-tool-var,check_gcc,CFLAG,$(1)) 224endef 225# Usage: check-as-var,<flag> 226# Check the assembler to see if it supports <flag>. Export the 227# variable ASFLAG_<flag> if it does (for invoking the assembler), 228# as well CFLAG_-Wa<flag> (for invoking the compiler driver). 229define check-as-var 230$(call check-tool-var,check_as,ASFLAG,$(1)) 231_v = CFLAG_-Wa$(1) 232export $$(_v) = $$(if $$(ASFLAG_$(1)),-Wa$$(comma)$$(ASFLAG_$(1))) 233endef 234# Usage: check-ld-var,<flag> 235# Check the linker to see if it supports <flag>. Export the 236# variable LDFLAG_<flag> if it does (for invoking the linker), 237# as well CFLAG_-Wl<flag> (for invoking the compiler driver). 238define check-ld-var 239$(call check-tool-var,check_ld,LDFLAG,$(1)) 240_v = CFLAG_-Wl$(1) 241export $$(_v) = $$(if $$(LDFLAG_$(1)),-Wl$$(comma)$$(LDFLAG_$(1))) 242endef 243# Usage: cache-output-var,<variable>,<shell command> 244# Execute <shell command> and cache the output in <variable>. 245define cache-output-var 246ifndef $(1) 247$(1) := $$(shell $(2)) 248export $(1) 249endif 250endef 251 252 253ARFLAGS:=cr 254 255# Note: The check for -nostdlib has to be before all calls to check_ld 256$(eval $(call check-gcc-var,-nostdlib)) 257LDFLAG-fuse-ld := $(filter -fuse-ld=%,$(EXTRA_UCLIBC_FLAGS)) 258# deliberately not named CFLAG-fuse-ld since unchecked and from user 259 260# Flags in OPTIMIZATION are used only for non-debug builds 261 262OPTIMIZATION:= 263# Use '-Os' optimization if available, else use -O2, allow Config to override 264$(eval $(call check-gcc-var,-Os)) 265ifneq ($(CFLAG_-Os),) 266OPTIMIZATION += $(CFLAG_-Os) 267else 268$(eval $(call check-gcc-var,-O2)) 269OPTIMIZATION += $(CFLAG_-O2) 270endif 271# Use the gcc 3.4 -funit-at-a-time optimization when available 272$(eval $(call check-gcc-var,-funit-at-a-time)) 273OPTIMIZATION += $(CFLAG_-funit-at-a-time) 274# shrinks code by about 0.1% 275$(eval $(call check-gcc-var,-fmerge-all-constants)) 276$(eval $(call check-gcc-var,-fstrict-aliasing)) 277OPTIMIZATION += $(CFLAG_-fmerge-all-constants) $(CFLAG_-fstrict-aliasing) 278 279$(eval $(call cache-output-var,GCC_VER,$(CC) -dumpversion)) 280GCC_VER := $(subst ., ,$(GCC_VER)) 281GCC_MAJOR_VER ?= $(word 1,$(GCC_VER)) 282#GCC_MINOR_VER ?= $(word 2,$(GCC_VER)) 283 284ifneq ($(TARGET_ARCH),arc) 285ifeq ($(GCC_MAJOR_VER),4) 286# shrinks code, results are from 4.0.2 287# 0.36% 288$(eval $(call check-gcc-var,-fno-tree-loop-optimize)) 289OPTIMIZATION += $(CFLAG_-fno-tree-loop-optimize) 290# 0.34% 291$(eval $(call check-gcc-var,-fno-tree-dominator-opts)) 292OPTIMIZATION += $(CFLAG_-fno-tree-dominator-opts) 293# 0.1% 294$(eval $(call check-gcc-var,-fno-strength-reduce)) 295OPTIMIZATION += $(CFLAG_-fno-strength-reduce) 296endif 297endif 298 299# CPU_CFLAGS-y contain options which are not warnings, 300# not include or library paths, and not optimizations. 301 302# Why -funsigned-char: I hunted a bug related to incorrect 303# sign extension of 'char' type for 10 hours straight. Not fun. 304CPU_CFLAGS-y := -funsigned-char -fno-builtin 305 306$(eval $(call check-gcc-var,-fno-asm)) 307CPU_CFLAGS-y += $(CFLAG_-fno-asm) 308 309LDADD_LIBFLOAT= 310ifeq ($(UCLIBC_HAS_SOFT_FLOAT),y) 311# If -msoft-float isn't supported, we want an error anyway. 312# Hmm... might need to revisit this for arm since it has 2 different 313# soft float encodings. 314ifneq ($(TARGET_ARCH),nios) 315ifneq ($(TARGET_ARCH),nios2) 316ifneq ($(TARGET_ARCH),sh) 317ifneq ($(TARGET_ARCH),c6x) 318CPU_CFLAGS-y += -msoft-float 319endif 320endif 321endif 322endif 323ifeq ($(TARGET_ARCH),arm) 324# No longer needed with current toolchains, but leave it here for now. 325# If anyone is actually still using gcc 2.95 (say), they can uncomment it. 326# LDADD_LIBFLOAT=-lfloat 327endif 328endif 329 330$(eval $(call check-gcc-var,-std=gnu99)) 331CPU_CFLAGS-y += $(CFLAG_-std=gnu99) 332 333CPU_CFLAGS-$(UCLIBC_FORMAT_SHARED_FLAT) += -mid-shared-library 334CPU_CFLAGS-$(UCLIBC_FORMAT_FLAT_SEP_DATA) += -msep-data 335 336CPU_LDFLAGS-$(ARCH_LITTLE_ENDIAN) += -Wl,-EL 337CPU_LDFLAGS-$(ARCH_BIG_ENDIAN) += -Wl,-EB 338 339PICFLAG-y := -fPIC 340PICFLAG-$(UCLIBC_FORMAT_FDPIC_ELF) := -mfdpic 341PICFLAG-$(UCLIBC_FORMAT_DSBT_ELF) := -mdsbt -fpic 342PICFLAG := $(PICFLAG-y) 343PIEFLAG_NAME:=-fPIE 344 345# Some nice CPU specific optimizations 346ifeq ($(TARGET_ARCH),i386) 347$(eval $(call check-gcc-var,-fomit-frame-pointer)) 348 OPTIMIZATION += $(CFLAG_-fomit-frame-pointer) 349 350ifeq ($(CONFIG_386)$(CONFIG_486)$(CONFIG_586),y) 351 # TODO: Change this to a gcc version check. This bug 352 # should be fixed with at least gcc-4.3. 353 # Non-SSE capable processor. 354 # NB: this may make SSE insns segfault! 355 # -O1 -march=pentium3, -Os -msse etc are known to be affected. 356 # See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=13685 357 # -m32 is needed if host is 64-bit 358 OPTIMIZATION+=$(call check_gcc,-m32 -mpreferred-stack-boundary=2,) 359else 360$(eval $(call check-gcc-var,-mpreferred-stack-boundary=4)) 361 OPTIMIZATION += $(CFLAG_-mpreferred-stack-boundary=4) 362endif 363 364 # Choice of alignment (please document why!) 365 # -falign-labels: in-line labels 366 # (reachable by normal code flow, aligning will insert nops 367 # which will be executed - may even make things slower) 368 # -falign-jumps: reachable only by a jump 369 # Generic: no alignment at all (smallest code) 370 GCC_FALIGN=$(call check_gcc,-falign-functions=1 -falign-jumps=1 -falign-labels=1 -falign-loops=1,-malign-jumps=1 -malign-loops=1) 371 OPTIMIZATION+=$(GCC_FALIGN) 372 373 # Putting each function and data object into its own section 374 # allows for kbytes of less text if users link against static uclibc 375 # using ld --gc-sections. 376 # ld 2.18 can't do that (yet?) for shared libraries, so we itself 377 # do not use --gc-sections at shared lib link time. 378 # However, in combination with sections being sorted by alignment 379 # it does result in much reduced padding: 380 # text data bss dec hex 381 # 235319 1472 5992 242783 3b45f old.so 382 # 234104 1472 5980 241556 3af94 new.so 383 # Without -ffunction-sections, all functions will get aligned 384 # to 4 byte boundary by as/ld. This is arguably a bug in as. 385 # It specifies 4 byte align for .text even if not told to do so: 386 # Idx Name Size VMA LMA File off Algn 387 # 0 .text xxxxxxxx 00000000 00000000 xxxxxxxx 2**2 <===! 388 CPU_CFLAGS-y += $(CFLAG_-ffunction-sections) $(CFLAG_-fdata-sections) 389 CPU_LDFLAGS-y += $(CFLAG_-Wl--sort-common) 390$(eval $(call check-ld-var,--sort-section=alignment)) 391 CPU_LDFLAGS-y += $(CFLAG_-Wl--sort-section=alignment) 392 393 CPU_LDFLAGS-y+=-m32 394 CPU_CFLAGS-y+=-m32 395endif 396 397ifeq ($(TARGET_ARCH),sparc) 398 CPU_CFLAGS-$(CONFIG_SPARC_V7)+=-mcpu=v7 399 CPU_CFLAGS-$(CONFIG_SPARC_V8)+=-mcpu=v8 400 CPU_CFLAGS-$(CONFIG_SPARC_V9)+=-mcpu=v9 401 CPU_CFLAGS-$(CONFIG_SPARC_V9B)+=$(call check_gcc,-mcpu=v9b,-mcpu=ultrasparc) 402endif 403 404ifeq ($(TARGET_ARCH),arm) 405 CPU_CFLAGS-$(ARCH_LITTLE_ENDIAN)+=-mlittle-endian 406 CPU_CFLAGS-$(ARCH_BIG_ENDIAN)+=-mbig-endian 407 CPU_CFLAGS-$(COMPILE_IN_THUMB_MODE)+=-mthumb 408endif 409 410ifeq ($(TARGET_ARCH),metag) 411 SYMBOL_PREFIX=_ 412 CPU_CFLAGS-$(CONFIG_META_1_2)+= 413 CPU_CFLAGS-$(CONFIG_META_2_1)+=-Wa,-mcpu=metac21 414endif 415 416ifeq ($(TARGET_ARCH),mips) 417 OPTIMIZATION+=-mno-split-addresses 418 CPU_CFLAGS-$(CONFIG_MIPS_ISA_1)+=-mips1 419 CPU_CFLAGS-$(CONFIG_MIPS_ISA_2)+=-mips2 -mtune=mips2 420 CPU_CFLAGS-$(CONFIG_MIPS_ISA_3)+=-mips3 -mtune=mips3 421 CPU_CFLAGS-$(CONFIG_MIPS_ISA_4)+=-mips4 -mtune=mips4 422 CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS32)+=-mips32 -mtune=mips32 423 CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS32R2)+=-march=mips32r2 -mtune=mips32r2 424 CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS64)+=-mips64 -mtune=mips32 425 CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS64R2)+=-mips64r2 -mtune=mips64r2 426 ifeq ($(strip $(ARCH_BIG_ENDIAN)),y) 427 CPU_LDFLAGS-$(CONFIG_MIPS_N64_ABI)+=-Wl,-melf64btsmip 428 CPU_LDFLAGS-$(CONFIG_MIPS_O32_ABI)+=-Wl,-melf32btsmip 429 endif 430 ifeq ($(strip $(ARCH_LITTLE_ENDIAN)),y) 431 CPU_LDFLAGS-$(CONFIG_MIPS_N64_ABI)+=-Wl,-melf64ltsmip 432 CPU_LDFLAGS-$(CONFIG_MIPS_O32_ABI)+=-Wl,-melf32ltsmip 433 endif 434 CPU_CFLAGS-$(CONFIG_MIPS_N64_ABI)+=-mabi=64 435 CPU_CFLAGS-$(CONFIG_MIPS_O32_ABI)+=-mabi=32 436 CPU_CFLAGS-$(CONFIG_MIPS_N32_ABI)+=-mabi=n32 437endif 438 439ifeq ($(TARGET_ARCH),nios) 440 OPTIMIZATION+=-funaligned-struct-hack 441 CPU_LDFLAGS-y+=-Wl,-m32 442 CPU_CFLAGS-y+=-Wl,-m32 443endif 444 445ifeq ($(TARGET_ARCH),sh) 446$(eval $(call check-gcc-var,-mprefergot)) 447 OPTIMIZATION += $(CFLAG_-mprefergot) 448 CPU_CFLAGS-$(ARCH_LITTLE_ENDIAN)+=-ml 449 CPU_CFLAGS-$(ARCH_BIG_ENDIAN)+=-mb 450 CPU_CFLAGS-$(CONFIG_SH2)+=-m2 451 CPU_CFLAGS-$(CONFIG_SH3)+=-m3 452ifeq ($(UCLIBC_HAS_FPU),y) 453 CPU_CFLAGS-$(CONFIG_SH2A)+=-m2a 454 CPU_CFLAGS-$(CONFIG_SH4)+=-m4 455else 456 CPU_CFLAGS-$(CONFIG_SH2A)+=-m2a-nofpu 457 CPU_CFLAGS-$(CONFIG_SH4)+=-m4-nofpu 458endif 459endif 460 461ifeq ($(TARGET_ARCH),sh64) 462 CPU_CFLAGS-$(ARCH_LITTLE_ENDIAN):=-ml 463 CPU_CFLAGS-$(ARCH_BIG_ENDIAN):=-mb 464 CPU_CFLAGS-$(CONFIG_SH5)+=-m5-32media 465endif 466 467ifeq ($(TARGET_ARCH),h8300) 468 SYMBOL_PREFIX=_ 469 CPU_LDFLAGS-$(CONFIG_H8300H)+= -Wl,-ms8300h 470 CPU_LDFLAGS-$(CONFIG_H8S) += -Wl,-ms8300s 471 CPU_CFLAGS-$(CONFIG_H8300H) += -mh -mint32 472 CPU_CFLAGS-$(CONFIG_H8S) += -ms -mint32 473endif 474 475ifeq ($(TARGET_ARCH),i960) 476 OPTIMIZATION+=-mh -mint32 #-fsigned-char 477endif 478 479ifeq ($(TARGET_ARCH),e1) 480 OPTIMIZATION+=-mgnu-param 481endif 482 483ifeq ($(TARGET_ARCH),cris) 484 CPU_LDFLAGS-$(CONFIG_CRIS)+=-Wl,-mcrislinux 485 CPU_LDFLAGS-$(CONFIG_CRISV32)+=-Wl,-mcrislinux 486 CPU_CFLAGS-$(CONFIG_CRIS)+=-mlinux 487 PICFLAG:=-fpic 488 PIEFLAG_NAME:=-fpie 489endif 490 491ifeq ($(TARGET_ARCH),m68k) 492 # -fPIC is only supported for 68020 and above. It is not supported 493 # for 68000, 68010, or Coldfire. 494 PICFLAG:=-fpic 495 PIEFLAG_NAME:=-fpie 496endif 497 498ifeq ($(TARGET_ARCH),powerpc) 499# PowerPC can hold 8192 entries in its GOT with -fpic which is more than 500# enough. Therefore use -fpic which will reduce code size and generates 501# faster code. 502 PICFLAG:=-fpic 503 PIEFLAG_NAME:=-fpie 504 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) 505 CPU_CFLAGS-$(PPC_HAS_REL16)+= -DHAVE_ASM_PPC_REL16 506 CPU_CFLAGS-$(CONFIG_E500) += "-D__NO_MATH_INLINES" 507 508endif 509 510ifeq ($(TARGET_ARCH),bfin) 511 SYMBOL_PREFIX=_ 512ifeq ($(UCLIBC_FORMAT_FDPIC_ELF),y) 513 CPU_CFLAGS-y:=-mfdpic 514 CPU_LDFLAGS-y += -Wl,-melf32bfinfd 515 PICFLAG:=-fpic 516 PIEFLAG_NAME:=-fpie 517endif 518ifeq ($(UCLIBC_FORMAT_SHARED_FLAT),y) 519 PICFLAG := -mleaf-id-shared-library 520endif 521endif 522 523ifeq ($(TARGET_ARCH),frv) 524 CPU_LDFLAGS-$(CONFIG_FRV)+=-Wl,-melf32frvfd 525 # Using -pie causes the program to have an interpreter, which is 526 # forbidden, so we must make do with -shared. Unfortunately, 527 # -shared by itself would get us global function descriptors 528 # and calls through PLTs, dynamic resolution of symbols, etc, 529 # which would break as well, but -Bsymbolic comes to the rescue. 530 export LDPIEFLAG:=-shared -Wl,-Bsymbolic 531 UCLIBC_LDSO=ld.so.1 532endif 533 534ifeq ($(strip $(TARGET_ARCH)),avr32) 535 CPU_CFLAGS-$(CONFIG_AVR32_AP7) += -march=ap 536 CPU_CFLAGS-$(CONFIG_LINKRELAX) += -mrelax 537 CPU_LDFLAGS-$(CONFIG_LINKRELAX) += --relax 538endif 539 540ifeq ($(TARGET_ARCH),i960) 541 SYMBOL_PREFIX=_ 542endif 543 544ifeq ($(TARGET_ARCH),v850) 545 SYMBOL_PREFIX=_ 546endif 547 548ifeq ($(TARGET_ARCH),c6x) 549 PIEFLAG:= 550 CPU_CFLAGS-$(CONFIG_TMS320C64X) += -march=c64x 551 CPU_CFLAGS-$(CONFIG_TMS320C64XPLUS) += -march=c64x+ 552 CPU_CFLAGS-$(ARCH_LITTLE_ENDIAN)+=-mlittle-endian 553 CPU_CFLAGS-$(ARCH_BIG_ENDIAN)+=-mbig-endian 554 CPU_LDFLAGS-y += $(CPU_CFLAGS) 555endif 556 557ifeq ($(TARGET_ARCH),arc) 558 CPU_CFLAGS-y += -mlock -mswape 559 CPU_CFLAGS-$(CONFIG_ARC_CPU_700) += -mA7 560 CPU_LDFLAGS-y += $(CPU_CFLAGS) -marclinux 561endif 562 563$(eval $(call check-gcc-var,$(PIEFLAG_NAME))) 564PIEFLAG := $(CFLAG_$(PIEFLAG_NAME)) 565ifeq ($(PIEFLAG),) 566PIEFLAG := $(PICFLAG) 567endif 568# We need to keep track of both the CC PIE flag (above) as 569# well as the LD PIE flag (below) because we can't rely on 570# gcc passing -pie if we used -fPIE. We need to directly use -pie 571# instead of -Wl,-pie as gcc picks up the wrong startfile/endfile 572$(eval $(call cache-output-var,LDPIEFLAG,$(CC) -Wl$(comma)--help 2>/dev/null | grep -q -- -pie && echo "-pie")) 573 574# Check for --as-needed support in linker 575ifndef LD_FLAG_ASNEEDED 576_LD_FLAG_ASNEEDED:=$(shell $(CC) -Wl,--help 2>/dev/null | grep -- --as-needed) 577ifneq ($(_LD_FLAG_ASNEEDED),) 578export LD_FLAG_ASNEEDED:=--as-needed 579endif 580endif 581ifndef LD_FLAG_NO_ASNEEDED 582ifdef LD_FLAG_ASNEEDED 583export LD_FLAG_NO_ASNEEDED:=--no-as-needed 584endif 585endif 586ifndef CC_FLAG_ASNEEDED 587ifdef LD_FLAG_ASNEEDED 588export CC_FLAG_ASNEEDED:=-Wl,$(LD_FLAG_ASNEEDED) 589endif 590endif 591ifndef CC_FLAG_NO_ASNEEDED 592ifdef LD_FLAG_NO_ASNEEDED 593export CC_FLAG_NO_ASNEEDED:=-Wl,$(LD_FLAG_NO_ASNEEDED) 594endif 595endif 596link.asneeded = $(if $(findstring yy,$(CC_FLAG_ASNEEDED)$(CC_FLAG_NO_ASNEEDED)),$(CC_FLAG_ASNEEDED) $(1) $(CC_FLAG_NO_ASNEEDED)) 597 598# Check for AS_NEEDED support in linker script (binutils>=2.16.1 has it) 599ifndef ASNEEDED 600export ASNEEDED:=$(shell $(CC) -Wl,--help 2>/dev/null | grep -q -- --as-needed && echo "AS_NEEDED ( $(UCLIBC_LDSO) )" || echo "$(UCLIBC_LDSO)") 601 602# Only used in installed libc.so linker script 603ifeq ($(UCLIBC_HAS_BACKTRACE),y) 604ifeq ($(HARDWIRED_ABSPATH),y) 605UBACKTRACE_FULL_NAME := $(subst //,/,$(RUNTIME_PREFIX)$(MULTILIB_DIR)/$(UBACKTRACE_DSO)) 606else 607UBACKTRACE_FULL_NAME := $(UBACKTRACE_DSO) 608endif 609export UBACKTRACE_ASNEEDED:=$(shell $(CC) -Wl,--help 2>/dev/null | grep -q -- --as-needed && \ 610 echo "GROUP ( AS_NEEDED ( $(UBACKTRACE_FULL_NAME) ) )" || \ 611 echo "GROUP ( $(UBACKTRACE_FULL_NAME) )") 612else 613export UBACKTRACE_ASNEEDED:="" 614endif 615endif 616 617# Add a bunch of extra pedantic annoyingly strict checks 618WARNING_FLAGS = -Wstrict-prototypes -Wstrict-aliasing 619ifeq ($(EXTRA_WARNINGS),y) 620WARNING_FLAGS += \ 621 -Wformat=2 \ 622 -Wmissing-noreturn \ 623 -Wmissing-format-attribute \ 624 -Wmissing-prototypes \ 625 -Wmissing-declarations \ 626 -Wnested-externs \ 627 -Wnonnull \ 628 -Wold-style-declaration \ 629 -Wold-style-definition \ 630 -Wshadow \ 631 -Wundef 632# Works only w/ gcc-3.4 and up, can't be checked for gcc-3.x w/ check_gcc() 633WARNING_FLAGS-gcc-4 += -Wdeclaration-after-statement 634endif 635WARNING_FLAGS += $(WARNING_FLAGS-gcc-$(GCC_MAJOR_VER)) 636$(foreach w,$(WARNING_FLAGS),$(eval $(call check-gcc-var,$(w)))) 637XWARNINGS = $(call qstrip,$(WARNINGS)) $(foreach w,$(WARNING_FLAGS),$(CFLAG_$(w))) 638 639CPU_CFLAGS=$(call qstrip,$(CPU_CFLAGS-y)) 640 641# Save the tested flag in a single variable and force it to be 642# evaluated just once. Then use that computed value. 643$(eval $(call check-gcc-var,-fno-stack-protector)) 644SSP_DISABLE_FLAGS ?= $(CFLAG_-fno-stack-protector) 645ifeq ($(UCLIBC_BUILD_SSP),y) 646$(eval $(call check-gcc-var,-fno-stack-protector-all)) 647$(eval $(call check-gcc-var,-fstack-protector)) 648$(eval $(call check-gcc-var,-fstack-protector-all)) 649SSP_CFLAGS := $(CFLAG_-fno-stack-protector-all) 650SSP_CFLAGS += $(CFLAG_-fstack-protector) 651SSP_ALL_CFLAGS ?= $(CFLAG_-fstack-protector-all) 652else 653SSP_CFLAGS := $(SSP_DISABLE_FLAGS) 654endif 655 656# Collect all CFLAGS components 657CFLAGS := $(XWARNINGS) $(CPU_CFLAGS) $(SSP_CFLAGS) \ 658 -nostdinc -I$(top_builddir)include \ 659 -I$(top_srcdir)include -include libc-symbols.h \ 660 -I$(top_srcdir)libc/sysdeps/linux/$(TARGET_ARCH) \ 661 -I$(top_srcdir)libc/sysdeps/linux \ 662 -I$(top_srcdir)ldso/ldso/$(TARGET_ARCH) \ 663 -I$(top_srcdir)ldso/include -I. 664ifneq ($(strip $(UCLIBC_EXTRA_CFLAGS)),"") 665CFLAGS += $(call qstrip,$(UCLIBC_EXTRA_CFLAGS)) 666endif 667 668# We need this to be checked within libc-symbols.h 669ifneq ($(HAVE_SHARED),y) 670CFLAGS += -DSTATIC 671endif 672 673$(eval $(call check-ld-var,--warn-once)) 674$(eval $(call check-ld-var,--sort-common)) 675$(eval $(call check-ld-var,--discard-all)) 676LDFLAGS_NOSTRIP:=$(LDFLAG-fuse-ld) $(CPU_LDFLAGS-y) -shared \ 677 -Wl,--warn-common $(CFLAG_-Wl--warn-once) -Wl,-z,combreloc 678# binutils-2.16.1 warns about ignored sections, 2.16.91.0.3 and newer are ok 679#$(eval $(call check-ld-var,--gc-sections)) 680#LDFLAGS_NOSTRIP += $(LDFLAG_--gc-sections) 681 682$(eval $(call check-gcc-var,-fdata-sections)) 683$(eval $(call check-gcc-var,-ffunction-sections)) 684 685ifeq ($(UCLIBC_BUILD_RELRO),y) 686LDFLAGS_NOSTRIP+=-Wl,-z,relro 687endif 688 689ifeq ($(UCLIBC_BUILD_NOW),y) 690LDFLAGS_NOSTRIP+=-Wl,-z,now 691endif 692 693ifeq ($(LDSO_GNU_HASH_SUPPORT),y) 694# Be sure that binutils support it 695$(eval $(call check-ld-var,--hash-style=gnu)) 696ifeq ($(LDFLAG_--hash-style=gnu),) 697ifneq ($(filter-out $(clean_targets) CLEAN_% install_headers headers-y,$(MAKECMDGOALS)),) 698$(error Your binutils do not support --hash-style option, while you want to use it) 699endif 700else 701LDFLAGS_NOSTRIP += $(CFLAG_-Wl--hash-style=gnu) 702endif 703endif 704 705LDFLAGS:=$(LDFLAGS_NOSTRIP) -Wl,-z,defs 706ifeq ($(DODEBUG),y) 707CFLAGS += -O0 -g3 -DDEBUG 708else 709CFLAGS += $(OPTIMIZATION) 710endif 711ifeq ($(DOSTRIP),y) 712LDFLAGS += -Wl,-s 713else 714STRIPTOOL := true -Stripping_disabled 715endif 716ifneq ($(strip $(UCLIBC_EXTRA_CFLAGS)),"") 717CFLAGS += $(call qstrip,$(UCLIBC_EXTRA_CFLAGS)) 718endif 719 720ifeq ($(DOMULTI),y) 721# we try to compile all sources at once into an object (IMA), but 722# gcc-3.3.x does not support it 723# gcc-3.4.x supports it, but does not need and support --combine. though fails on many sources 724# gcc-4.0.x supports it, supports the --combine flag, but does not need it 725# gcc-4.1(200506xx) supports it, but needs the --combine flag, else libs are useless 726ifeq ($(GCC_MAJOR_VER),3) 727DOMULTI:=n 728else 729$(eval $(call check-gcc-var,--combine)) 730CFLAGS += $(CFLAG_--combine) 731endif 732else 733DOMULTI:=n 734endif 735 736ifneq ($(strip $(UCLIBC_EXTRA_LDFLAGS)),"") 737LDFLAGS += $(call qstrip,$(UCLIBC_EXTRA_LDFLAGS)) 738endif 739 740ifeq ($(UCLIBC_HAS_THREADS),y) 741ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y) 742 PTNAME := nptl 743 CFLAGS += -DHAVE_FORCED_UNWIND 744else 745ifeq ($(LINUXTHREADS_OLD),y) 746 PTNAME := linuxthreads.old 747else 748 PTNAME := linuxthreads 749endif 750endif 751PTDIR := libpthread/$(PTNAME) 752# set up system dependencies include dirs (NOTE: order matters!) 753ifeq ($(UCLIBC_HAS_THREADS_NATIVE),y) 754PTINC:= -I$(top_builddir)$(PTDIR) \ 755 -I$(top_srcdir)$(PTDIR) \ 756 $(if $(TARGET_SUBARCH),-I$(top_srcdir)$(PTDIR)/sysdeps/unix/sysv/linux/$(TARGET_ARCH)/$(TARGET_SUBARCH)) \ 757 -I$(top_srcdir)$(PTDIR)/sysdeps/unix/sysv/linux/$(TARGET_ARCH) \ 758 -I$(top_builddir)$(PTDIR)/sysdeps/$(TARGET_ARCH) \ 759 -I$(top_srcdir)$(PTDIR)/sysdeps/$(TARGET_ARCH) \ 760 -I$(top_builddir)$(PTDIR)/sysdeps/unix/sysv/linux \ 761 -I$(top_srcdir)$(PTDIR)/sysdeps/unix/sysv/linux \ 762 -I$(top_srcdir)$(PTDIR)/sysdeps/pthread \ 763 -I$(top_srcdir)$(PTDIR)/sysdeps/pthread/bits \ 764 -I$(top_srcdir)$(PTDIR)/sysdeps/generic 765# 766# Test for TLS if NPTL support was selected. 767# 768GCC_HAS_TLS=$(shell \ 769 echo "extern __thread int foo;" | $(CC) -o /dev/null -S -xc - 2>&1) 770ifneq ($(GCC_HAS_TLS),) 771gcc_tls_test_fail: 772 @echo "####"; 773 @echo "#### Your compiler does not support TLS and you are trying to build uClibc"; 774 @echo "#### with NPTL support. Upgrade your binutils and gcc to versions which"; 775 @echo "#### support TLS for your architecture. Do not contact uClibc maintainers"; 776 @echo "#### about this problem."; 777 @echo "####"; 778 @echo "#### Exiting..."; 779 @echo "####"; 780 @exit 1; 781endif 782else 783PTINC := \ 784 -I$(top_srcdir)$(PTDIR)/sysdeps/unix/sysv/linux/$(TARGET_ARCH) \ 785 -I$(top_srcdir)$(PTDIR)/sysdeps/$(TARGET_ARCH) \ 786 -I$(top_srcdir)$(PTDIR)/sysdeps/unix/sysv/linux \ 787 -I$(top_srcdir)$(PTDIR)/sysdeps/pthread \ 788 -I$(top_srcdir)$(PTDIR) \ 789 -I$(top_srcdir)libpthread 790endif 791CFLAGS+=$(PTINC) 792else 793 PTNAME := 794 PTINC := 795endif 796CFLAGS += -I$(top_srcdir)libc/sysdeps/linux/common 797 798#CFLAGS += -iwithprefix include-fixed -iwithprefix include 799$(eval $(call cache-output-var,CC_IPREFIX,$(CC) -print-file-name=include)) 800CC_INC := -isystem $(dir $(CC_IPREFIX))include-fixed -isystem $(CC_IPREFIX) 801CFLAGS += $(CC_INC) 802 803CFLAGS += -I$(KERNEL_HEADERS) 804 805ifneq ($(DOASSERTS),y) 806CFLAGS+=-DNDEBUG 807endif 808 809ifeq ($(SYMBOL_PREFIX),_) 810CFLAGS+=-D__UCLIBC_UNDERSCORES__ 811endif 812 813# Keep the check_as from being needlessly executed 814ifeq ($(UCLIBC_BUILD_NOEXECSTACK),y) 815$(eval $(call check-as-var,--noexecstack)) 816endif 817ASFLAGS = $(ASFLAG_--noexecstack) 818 819LIBGCC_CFLAGS ?= $(CFLAGS) $(CPU_CFLAGS-y) 820$(eval $(call cache-output-var,LIBGCC,$(CC) $(LIBGCC_CFLAGS) -print-libgcc-file-name)) 821$(eval $(call cache-output-var,LIBGCC_EH,$(CC) $(LIBGCC_CFLAGS) -print-file-name=libgcc_eh.a)) 822# with -O0 we (e.g. lockf) might end up with references to 823# _Unwind_Resume, so pull in gcc_eh in this case.. 824LIBGCC_DIR:=$(dir $(LIBGCC)) 825LIBGCC += $(if $(DODEBUG),$(LIBGCC_EH)) 826 827# moved from libpthread/linuxthreads 828ifeq ($(UCLIBC_CTOR_DTOR),y) 829SHARED_START_FILES:=$(top_builddir)lib/crti.o $(LIBGCC_DIR)crtbeginS.o 830SHARED_END_FILES:=$(LIBGCC_DIR)crtendS.o $(top_builddir)lib/crtn.o 831endif 832 833LOCAL_INSTALL_PATH := $(if $(O),$(O)/)install_dir 834 835PTHREAD_GENERATE_MANGLE ?= -n "s/^.*@@@name@@@\([^@]*\)@@@value@@@[^0-9Xxa-fA-F-]*\([0-9Xxa-fA-F-][0-9Xxa-fA-F-]*\).*@@@end@@@.*\$$/\#define \1 \2/p" 836