| 1 |
# Rules.make for uClibc |
| 2 |
# |
| 3 |
# Copyright (C) 2000 by Lineo, inc. |
| 4 |
# Copyright (C) 2000-2002 Erik Andersen <andersen@uclibc.org> |
| 5 |
# |
| 6 |
# This program is free software; you can redistribute it and/or modify it under |
| 7 |
# the terms of the GNU Library General Public License as published by the Free |
| 8 |
# Software Foundation; either version 2 of the License, or (at your option) any |
| 9 |
# later version. |
| 10 |
# |
| 11 |
# This program is distributed in the hope that it will be useful, but WITHOUT |
| 12 |
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
| 13 |
# FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more |
| 14 |
# details. |
| 15 |
# |
| 16 |
# You should have received a copy of the GNU Library General Public License |
| 17 |
# along with this program; if not, write to the Free Software Foundation, Inc., |
| 18 |
# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
| 19 |
|
| 20 |
|
| 21 |
#-------------------------------------------------------- |
| 22 |
# This file contains rules which are shared between multiple Makefiles. |
| 23 |
# All normal configuration options live in the file named ".config". |
| 24 |
# Don't mess with this file unless you know what you are doing. |
| 25 |
|
| 26 |
|
| 27 |
#-------------------------------------------------------- |
| 28 |
# If you are running a cross compiler, you will want to set 'CROSS' |
| 29 |
# to something more interesting... Target architecture is determined |
| 30 |
# by asking the CC compiler what arch it compiles things for, so unless |
| 31 |
# your compiler is broken, you should not need to specify TARGET_ARCH |
| 32 |
# |
| 33 |
# Most people will set this stuff on the command line, i.e. |
| 34 |
# make CROSS=arm-linux- |
| 35 |
# will build uClibc for 'arm'. |
| 36 |
|
| 37 |
ifndef CROSS |
| 38 |
CROSS= |
| 39 |
endif |
| 40 |
CC= $(CROSS)gcc |
| 41 |
AR= $(CROSS)ar |
| 42 |
LD= $(CROSS)ld |
| 43 |
NM= $(CROSS)nm |
| 44 |
STRIPTOOL= $(CROSS)strip |
| 45 |
|
| 46 |
INSTALL= install |
| 47 |
LN= ln |
| 48 |
RM= rm -f |
| 49 |
|
| 50 |
# Select the compiler needed to build binaries for your development system |
| 51 |
HOSTCC=gcc |
| 52 |
HOSTCFLAGS=-O2 -Wall |
| 53 |
|
| 54 |
|
| 55 |
#-------------------------------------------------------- |
| 56 |
# Nothing beyond this point should ever be touched by mere mortals. |
| 57 |
# Unless you hang out with the gods, you should probably leave all |
| 58 |
# this stuff alone. |
| 59 |
MAJOR_VERSION:=0 |
| 60 |
MINOR_VERSION:=9 |
| 61 |
SUBLEVEL:=26 |
| 62 |
VERSION:=$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL) |
| 63 |
# Ensure consistent sort order, 'gcc -print-search-dirs' behavior, etc. |
| 64 |
LC_ALL:= C |
| 65 |
export MAJOR_VERSION MINOR_VERSION SUBLEVEL VERSION LC_ALL |
| 66 |
|
| 67 |
SHARED_FULLNAME:=libuClibc-$(MAJOR_VERSION).$(MINOR_VERSION).$(SUBLEVEL).so |
| 68 |
SHARED_MAJORNAME:=libc.so.$(MAJOR_VERSION) |
| 69 |
UCLIBC_LDSO:=ld-uClibc.so.$(MAJOR_VERSION) |
| 70 |
LIBNAME:=libc.a |
| 71 |
LIBC:=$(TOPDIR)libc/$(LIBNAME) |
| 72 |
|
| 73 |
# Pull in the user's uClibc configuration |
| 74 |
ifeq ($(filter $(noconfig_targets),$(MAKECMDGOALS)),) |
| 75 |
-include $(TOPDIR).config |
| 76 |
endif |
| 77 |
|
| 78 |
# A nifty macro to make testing gcc features easier |
| 79 |
check_gcc=$(shell if $(CC) $(1) -S -o /dev/null -xc /dev/null > /dev/null 2>&1; \ |
| 80 |
then echo "$(1)"; else echo "$(2)"; fi) |
| 81 |
|
| 82 |
# Make certain these contain a final "/", but no "//"s. |
| 83 |
TARGET_ARCH:=$(strip $(subst ",, $(strip $(TARGET_ARCH)))) |
| 84 |
RUNTIME_PREFIX:=$(strip $(subst //,/, $(subst ,/, $(subst ",, $(strip $(RUNTIME_PREFIX)))))) |
| 85 |
DEVEL_PREFIX:=$(strip $(subst //,/, $(subst ,/, $(subst ",, $(strip $(DEVEL_PREFIX)))))) |
| 86 |
export RUNTIME_PREFIX DEVEL_PREFIX |
| 87 |
|
| 88 |
ARFLAGS:=r |
| 89 |
|
| 90 |
OPTIMIZATION:= |
| 91 |
PICFLAG:=-fPIC |
| 92 |
# Some nice CPU specific optimizations |
| 93 |
ifeq ($(strip $(TARGET_ARCH)),i386) |
| 94 |
OPTIMIZATION+=$(call check_gcc,-mpreferred-stack-boundary=2,) |
| 95 |
OPTIMIZATION+=$(call check_gcc,-falign-jumps=0 -falign-loops=0,-malign-jumps=0 -malign-loops=0) |
| 96 |
CPU_CFLAGS-$(CONFIG_386)+=-march=i386 |
| 97 |
CPU_CFLAGS-$(CONFIG_486)+=-march=i486 |
| 98 |
CPU_CFLAGS-$(CONFIG_ELAN)+=-march=i486 |
| 99 |
CPU_CFLAGS-$(CONFIG_586)+=-march=i586 |
| 100 |
CPU_CFLAGS-$(CONFIG_586MMX)+=$(call check_gcc,-march=pentium-mmx,-march=i586) |
| 101 |
CPU_CFLAGS-$(CONFIG_686)+=-march=i686 |
| 102 |
CPU_CFLAGS-$(CONFIG_PENTIUMII)+=$(call check_gcc,-march=pentium2,-march=i686) |
| 103 |
CPU_CFLAGS-$(CONFIG_PENTIUMIII)+=$(call check_gcc,-march=pentium3,-march=i686) |
| 104 |
CPU_CFLAGS-$(CONFIG_PENTIUM4)+=$(call check_gcc,-march=pentium4,-march=i686) |
| 105 |
CPU_CFLAGS-$(CONFIG_K6)+=$(call check_gcc,-march=k6,-march=i586) |
| 106 |
CPU_CFLAGS-$(CONFIG_K7)+=$(call check_gcc,-march=athlon,-malign-functions=4 -march=i686) |
| 107 |
CPU_CFLAGS-$(CONFIG_CRUSOE)+=-march=i686 -malign-functions=0 -malign-jumps=0 -malign-loops=0 |
| 108 |
CPU_CFLAGS-$(CONFIG_WINCHIPC6)+=$(call check_gcc,-march=winchip-c6,-march=i586) |
| 109 |
CPU_CFLAGS-$(CONFIG_WINCHIP2)+=$(call check_gcc,-march=winchip2,-march=i586) |
| 110 |
CPU_CFLAGS-$(CONFIG_CYRIXIII)+=$(call check_gcc,-march=c3,-march=i486) -malign-functions=0 -malign-jumps=0 -malign-loops=0 |
| 111 |
CPU_CFLAGS-$(CONFIG_NEHEMIAH)+=$(call check_gcc,-march=c3-2,-march=i686) |
| 112 |
endif |
| 113 |
|
| 114 |
ifeq ($(strip $(TARGET_ARCH)),arm) |
| 115 |
OPTIMIZATION+=-fstrict-aliasing |
| 116 |
CPU_LDFLAGS-$(ARCH_LITTLE_ENDIAN)+=-EL |
| 117 |
CPU_LDFLAGS-$(ARCH_BIG_ENDIAN)+=-EB |
| 118 |
CPU_CFLAGS-$(ARCH_LITTLE_ENDIAN)+=-mlittle-endian |
| 119 |
CPU_CFLAGS-$(ARCH_BIG_ENDIAN)+=-mbig-endian |
| 120 |
CPU_CFLAGS-$(CONFIG_GENERIC_ARM)+= |
| 121 |
CPU_CFLAGS-$(CONFIG_ARM610)+=-mtune=arm610 -march=armv3 |
| 122 |
CPU_CFLAGS-$(CONFIG_ARM710)+=-mtune=arm710 -march=armv3 |
| 123 |
CPU_CFLAGS-$(CONFIG_ARM720T)+=-mtune=arm7tdmi -march=armv4 |
| 124 |
CPU_CFLAGS-$(CONFIG_ARM920T)+=-mtune=arm9tdmi -march=armv4 |
| 125 |
CPU_CFLAGS-$(CONFIG_ARM922T)+=-mtune=arm9tdmi -march=armv4 |
| 126 |
CPU_CFLAGS-$(CONFIG_ARM926T)+=-mtune=arm9tdmi -march=armv4 |
| 127 |
CPU_CFLAGS-$(CONFIG_ARM_SA110)+=-mtune=strongarm110 -march=armv4 |
| 128 |
CPU_CFLAGS-$(CONFIG_ARM_SA1100)+=-mtune=strongarm1100 -march=armv4 |
| 129 |
CPU_CFLAGS-$(CONFIG_ARM_XSCALE)+=$(call check_gcc,-mtune=xscale,-mtune=strongarm110) |
| 130 |
CPU_CFLAGS-$(CONFIG_ARM_XSCALE)+=-march=armv4 -Wa,-mcpu=xscale |
| 131 |
endif |
| 132 |
|
| 133 |
ifeq ($(strip $(TARGET_ARCH)),mips) |
| 134 |
CPU_CFLAGS-$(CONFIG_MIPS_ISA_1)+=-mips1 |
| 135 |
CPU_CFLAGS-$(CONFIG_MIPS_ISA_2)+=-mips2 -mtune=mips2 |
| 136 |
CPU_CFLAGS-$(CONFIG_MIPS_ISA_3)+=-mips3 -mtune=mips3 |
| 137 |
CPU_CFLAGS-$(CONFIG_MIPS_ISA_4)+=-mips4 -mtune=mips4 |
| 138 |
CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS32)+=-mips32 -mtune=mips32 |
| 139 |
CPU_CFLAGS-$(CONFIG_MIPS_ISA_MIPS64)+=-mips64 -mtune=mips32 |
| 140 |
endif |
| 141 |
|
| 142 |
ifeq ($(strip $(TARGET_ARCH)),sh) |
| 143 |
OPTIMIZATION+=-fstrict-aliasing |
| 144 |
OPTIMIZATION+= $(call check_gcc,-mprefergot,) |
| 145 |
CPU_LDFLAGS-$(ARCH_LITTLE_ENDIAN)+=-EL |
| 146 |
CPU_LDFLAGS-$(ARCH_BIG_ENDIAN)+=-EB |
| 147 |
CPU_CFLAGS-$(ARCH_LITTLE_ENDIAN)+=-ml |
| 148 |
CPU_CFLAGS-$(ARCH_BIG_ENDIAN)+=-mb |
| 149 |
CPU_CFLAGS-$(CONFIG_SH2)+=-m2 |
| 150 |
CPU_CFLAGS-$(CONFIG_SH3)+=-m3 |
| 151 |
CPU_CFLAGS-$(CONFIG_SH4)+=-m4 |
| 152 |
endif |
| 153 |
|
| 154 |
ifeq ($(strip $(TARGET_ARCH)),sh64) |
| 155 |
OPTIMIZATION+=-fstrict-aliasing |
| 156 |
CPU_LDFLAGS-$(ARCH_LITTLE_ENDIAN):=-EL |
| 157 |
CPU_LDFLAGS-$(ARCH_BIG_ENDIAN):=-EB |
| 158 |
CPU_CFLAGS-$(ARCH_LITTLE_ENDIAN):=-ml |
| 159 |
CPU_CFLAGS-$(ARCH_BIG_ENDIAN):=-mb |
| 160 |
CPU_CFLAGS-$(CONFIG_SH5)+=-m5-32media |
| 161 |
endif |
| 162 |
|
| 163 |
ifeq ($(strip $(TARGET_ARCH)),h8300) |
| 164 |
CPU_LDFLAGS-$(CONFIG_H8300H)+= -ms8300h |
| 165 |
CPU_LDFLAGS-$(CONFIG_H8S) += -ms8300s |
| 166 |
CPU_CFLAGS-$(CONFIG_H8300H) += -mh -mint32 -fsigned-char |
| 167 |
CPU_CFLAGS-$(CONFIG_H8S) += -ms -mint32 -fsigned-char |
| 168 |
endif |
| 169 |
|
| 170 |
ifeq ($(strip $(TARGET_ARCH)),cris) |
| 171 |
CPU_LDFLAGS-$(CONFIG_CRIS)+=-mcrislinux |
| 172 |
CPU_CFLAGS-$(CONFIG_CRIS)+=-mlinux |
| 173 |
PICFLAG=-fpic |
| 174 |
endif |
| 175 |
|
| 176 |
ifeq ($(strip $(TARGET_ARCH)),frv) |
| 177 |
CPU_LDFLAGS-$(CONFIG_FRV)+=-melf32frvfd |
| 178 |
CPU_CFLAGS-$(CONFIG_FRV)+=-mfdpic |
| 179 |
PICFLAG=-fPIC -DPIC |
| 180 |
PIEFLAG=-fpie |
| 181 |
# Using -pie causes the program to have an interpreter, which is |
| 182 |
# forbidden, so we must make do with -shared. Unfortunately, |
| 183 |
# -shared by itself would get us global function descriptors |
| 184 |
# and calls through PLTs, dynamic resolution of symbols, etc, |
| 185 |
# which would break as well, but -Bsymbolic comes to the rescue. |
| 186 |
LDPIEFLAG=-shared -Bsymbolic |
| 187 |
UCLIBC_LDSO=ld.so.1 |
| 188 |
endif |
| 189 |
|
| 190 |
# Use '-Os' optimization if available, else use -O2, allow Config to override |
| 191 |
OPTIMIZATION+=$(call check_gcc,-Os,-O2) |
| 192 |
# Use the gcc 3.4 -funit-at-a-time optimization when available |
| 193 |
OPTIMIZATION+=$(call check_gcc,-funit-at-a-time,) |
| 194 |
|
| 195 |
|
| 196 |
# Add a bunch of extra pedantic annoyingly strict checks |
| 197 |
XWARNINGS=$(subst ",, $(strip $(WARNINGS))) -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing |
| 198 |
XARCH_CFLAGS=$(subst ",, $(strip $(ARCH_CFLAGS))) |
| 199 |
CPU_CFLAGS=$(subst ",, $(strip $(CPU_CFLAGS-y))) |
| 200 |
|
| 201 |
LDADD_LIBFLOAT= |
| 202 |
ifeq ($(strip $(UCLIBC_HAS_SOFT_FLOAT)),y) |
| 203 |
# Add -msoft-float to the CPU_FLAGS since ldso and libdl ignore CFLAGS. |
| 204 |
# If -msoft-float isn't supported, we want an error anyway. |
| 205 |
CPU_CFLAGS += -msoft-float |
| 206 |
ifeq ($(strip $(TARGET_ARCH)),arm) |
| 207 |
LDADD_LIBFLOAT=-lfloat |
| 208 |
endif |
| 209 |
endif |
| 210 |
|
| 211 |
# Some nice CFLAGS to work with |
| 212 |
CFLAGS=$(XWARNINGS) $(OPTIMIZATION) $(XARCH_CFLAGS) $(CPU_CFLAGS) \ |
| 213 |
-fno-builtin -nostdinc -D_LIBC -I$(TOPDIR)include -I. |
| 214 |
|
| 215 |
ifeq ($(DODEBUG),y) |
| 216 |
#CFLAGS += -g3 |
| 217 |
CFLAGS = $(XWARNINGS) -O0 -g3 $(CPU_CFLAGS) -fno-builtin -nostdinc -D_LIBC -I$(TOPDIR)include -I. |
| 218 |
LDFLAGS:= $(CPU_LDFLAGS-y) -shared --warn-common --warn-once -z combreloc |
| 219 |
STRIPTOOL:= true -Since_we_are_debugging |
| 220 |
else |
| 221 |
LDFLAGS := $(CPU_LDFLAGS-y) -s -shared --warn-common --warn-once -z combreloc |
| 222 |
endif |
| 223 |
|
| 224 |
# Sigh, some stupid versions of gcc can't seem to cope with '-iwithprefix include' |
| 225 |
#CFLAGS+=-iwithprefix include |
| 226 |
CFLAGS+=$(shell $(CC) -print-search-dirs | sed -ne "s/install: *\(.*\)/-I\1include/gp") |
| 227 |
|
| 228 |
ifneq ($(DOASSERTS),y) |
| 229 |
CFLAGS += -DNDEBUG |
| 230 |
endif |
| 231 |
|
| 232 |
ifeq ($(HAVE_SHARED),y) |
| 233 |
LIBRARY_CACHE:=#-DUSE_CACHE |
| 234 |
ifeq ($(BUILD_UCLIBC_LDSO),y) |
| 235 |
LDSO:=$(TOPDIR)lib/$(UCLIBC_LDSO) |
| 236 |
DYNAMIC_LINKER:=$(SHARED_LIB_LOADER_PREFIX)/$(UCLIBC_LDSO) |
| 237 |
else |
| 238 |
LDSO:=$(SYSTEM_LDSO) |
| 239 |
DYNAMIC_LINKER:=/lib/$(strip $(subst ",, $(notdir $(SYSTEM_LDSO)))) |
| 240 |
endif |
| 241 |
endif |
| 242 |
|
| 243 |
CFLAGS_NOPIC:=$(CFLAGS) |
| 244 |
ifeq ($(DOPIC),y) |
| 245 |
CFLAGS += $(PICFLAG) |
| 246 |
endif |
| 247 |
|
| 248 |
LIBGCC_CFLAGS ?= $(CFLAGS) $(CPU_CFLAGS-y) |
| 249 |
LIBGCC:=$(shell $(CC) $(LIBGCC_CFLAGS) -print-libgcc-file-name) |
| 250 |
LIBGCC_DIR:=$(dir $(LIBGCC)) |
| 251 |
|
| 252 |
######################################## |
| 253 |
# |
| 254 |
# uClinux shared lib support |
| 255 |
# |
| 256 |
|
| 257 |
ifeq ($(CONFIG_BINFMT_SHARED_FLAT),y) |
| 258 |
# For the shared version of this, we specify no stack and its library ID |
| 259 |
FLTFLAGS += -s 0 |
| 260 |
LIBID=1 |
| 261 |
export LIBID FLTFLAGS |
| 262 |
SHARED_TARGET = lib/libc |
| 263 |
endif |
| 264 |
|
| 265 |
TARGET_ARCH:=$(strip $(subst ",, $(strip $(TARGET_ARCH)))) |
| 266 |
|