[sr-dev] git:master: makefile: arch detection uses gcc

Andrei Pelinescu-Onciul andrei at iptel.org
Thu Oct 1 01:29:30 CEST 2009


Module: sip-router
Branch: master
Commit: c46e79709216c4975abc83869fbce9fa696eac74
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=c46e79709216c4975abc83869fbce9fa696eac74

Author: Andrei Pelinescu-Onciul <andrei at iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei at iptel.org>
Date:   Wed Sep 30 20:18:23 2009 +0200

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 files changed, 89 insertions(+), 10 deletions(-)

diff --git a/Makefile.defs b/Makefile.defs
index e46aa03..eb659be 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




More information about the sr-dev mailing list