From c46e79709216c4975abc83869fbce9fa696eac74 Mon Sep 17 00:00:00 2001 From: Andrei Pelinescu-Onciul Date: Wed, 30 Sep 2009 20:18:23 +0200 Subject: [PATCH] makefile: arch detection uses gcc Target architecture detection switched from using the host to using the target architecture of the compiler, if the compiler is gcc. Extra options (CC_EXTRA_OPTS) are taken into account (e.g. make config CC_EXTRA_OPTS=-m32 will result in i386 on a gcc configured with default x86_64 arch.). This should make cross-compiling much easier and should also fix problems with systems with 64-bit kernels and 32-bits userland or vice versa (e.g. snow leopard which by default boots a 32-bit kernel, but its gcc produces only 64-bit binaries). --- Makefile.defs | 99 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 89 insertions(+), 10 deletions(-) diff --git a/Makefile.defs b/Makefile.defs index e46aa03bf5e..eb659be46fd 100644 --- a/Makefile.defs +++ b/Makefile.defs @@ -69,7 +69,9 @@ # 2009-03-10 replaced DEFS with C_DEFS and INCLUDES with C_INCLUDES (DEFS # and INCLUDES are now used only for "temporary" defines/includes # inside modules or libs) (andrei) -# 2009-09-20 for gcc 4.2+ use -fno-strict-overflow (andrei) +# 2009-09-29 for gcc 4.2+ use -fno-strict-overflow (andrei) +# 2009-09-30 find the target architecture from the compiler and not +# from the host (andrei) # check if already included/exported @@ -129,18 +131,18 @@ else GETARCH=uname -m endif -ARCH := $(shell $(GETARCH) |sed -e s/i.86/i386/ -e s/sun4[uv]/sparc64/ \ +HOST_ARCH := $(shell $(GETARCH) |sed -e s/i.86/i386/ -e s/sun4[uv]/sparc64/ \ -e s/armv[3-5].*/arm/ -e s/armv6.*/arm6/ \ -e "s/Power Macintosh/ppc/" \ -e "s/cobalt/mips2/" \ -e s/amd64/x86_64/ -e s/sparcv9/sparc64/ ) # fix sparc -> sparc64 -ifeq ($(ARCH),sparc) +ifeq ($(HOST_ARCH),sparc) ifeq ($(shell uname -m),sun4u) - ARCH := sparc64 + HOST_ARCH := sparc64 endif ifeq ($(shell uname -m),sun4v) - ARCH := sparc64 + HOST_ARCH := sparc64 endif endif @@ -340,6 +342,84 @@ $(warning Unknown compiler $(CC)\; supported compilers: \ gcc, sun cc, intel icc ) endif +# ARCH detection +# predefined compiler macros for different architectures +# (see http://predef.sourceforge.net/prearch.html for a more complete list) +i386_macros= i386 __i386__ __i486__ __i586__ __i686__ \ + __i386 _M_IX86 __X86__ _X86_ +x86_64_macros= __amd64__ __amd64 __x86_64__ __x86_64 _M_X64 + +sparc_macros= __sparc__ __sparc __sparcv8 +sparc64_macros= __sparcv9 __sparc_v9__ + +arm_macros= __arm__ __thumb__ +arm6_macros= __ARM_ARCH_6__ + +ppc_macros= __powerpc __powerpc__ __POWERPC__ __ppc__ _ARCH_PPC +ppc64_macros= __ppc64__ _ARCH_PPC64 + +mips_macros= __mips__ __mips _MIPS_ARCH_MIPS1 +mips2_macros= _MIPS_ISA_MIPS2 _MIPS_ISA_MIPS3 _MIPS_ISA_MIPS4 \ + _MIPS_ARCH_MIPS2 _MIPS_ARCH_MIPS3 _MIPS_ARCH_MIPS4 +mips64_macros= _MIPS_ISA_MIPS64 _MIPS_ARCH_MIPS64 + +alpha_macros= __alpha__ __alpha _M_ALPHA_ + +ifeq ($(CC_NAME),gcc) +#if gcc use gcc arch +predef_macros:=$(shell $(CC) -dM -E -x c $(CC_EXTRA_OPTS) $(extra_defs) \ + $(CFLAGS) /dev/null) + +ifneq ($(strip $(filter $(i386_macros), $(predef_macros))),) +CC_ARCH=i386 +else ifneq ($(strip $(filter $(x86_64_macros), $(predef_macros))),) +CC_ARCH=x86_64 +else ifneq ($(strip $(filter $(sparc_macros), $(predef_macros))),) + +ifneq ($(strip $(filter $(sparc64_macros), $(predef_macros))),) +CC_ARCH=sparc64 +else # sparc64_macros +CC_ARCH=sparc +endif # sparc64_macros + +else ifneq ($(strip $(filter $(arm_macros), $(predef_macros))),) + +ifneq ($(strip $(filter $(arm6_macros), $(predef_macros))),) +CC_ARCH=arm6 +else # arm6_macros +CC_ARCH=arm +endif # arm6_macros + +else ifneq ($(strip $(filter $(ppc64_macros), $(predef_macros))),) +CC_ARCH=ppc64 +else ifneq ($(strip $(filter $(ppc_macros), $(predef_macros))),) +CC_ARCH=ppc +else ifneq ($(strip $(filter $(mips_macros), $(predef_macros))),) + +ifneq ($(strip $(filter $(mips64_macros), $(predef_macros))),) +CC_ARCH=mips64 +else ifneq ($(strip $(filter $(mips2_macros), $(predef_macros))),) +CC_ARCH=mips2 +else # mips2_macros +CC_ARCH=mips +endif # mips64_macros + +else ifneq ($(strip $(filter $(alpha_macros), $(predef_macros))),) +CC_ARCH=alpha +else + +$(warn "Unknown target compiler architecture") + +endif # predefined macros tests (x86_macros, ...) + +endif # gcc + +ifdef CC_ARCH +$(info "target architecture <$(CC_ARCH)>, host architecture <$(HOST_ARCH)>") +ARCH:=$(CC_ARCH) +else +ARCH:=$(HOST_ARCH) +endif # compile-time options # @@ -671,7 +751,8 @@ ifeq ($(ARCH), i386) ifeq ($(CC_NAME), gcc) C_DEFS+=-DCC_GCC_LIKE_ASM #common stuff - CFLAGS=-g -O9 -funroll-loops -Wcast-align $(PROFILE) + CFLAGS=-m32 -g -O9 -funroll-loops -Wcast-align $(PROFILE) + LDFLAGS+=-m32 #if gcc 4.2+ ifeq ($(CC_SHORTVER), 4.2+) CPU ?= athlon64 @@ -908,8 +989,7 @@ ifeq ($(CC_NAME), gcc) ifeq ($(CC_SHORTVER), 4.2+) CPU ?= v8 #use 32bit for now - CFLAGS+= -minline-all-stringops \ - -mtune=$(CPU) \ + CFLAGS+= -mtune=$(CPU) \ -fno-strict-overflow \ -ftree-vectorize else @@ -917,8 +997,7 @@ else ifeq ($(CC_SHORTVER), 4.x) CPU ?= v8 #use 32bit for now - CFLAGS+= -minline-all-stringops \ - -mtune=$(CPU) \ + CFLAGS+= -mtune=$(CPU) \ -ftree-vectorize else #if gcc 3.4