# Copyright (c) 2001 David Abrahams. # Copyright (c) 2002-2005 Rene Rivera. # Distributed under the Boost Software License, Version 1.0. # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) # The following #// line will be used by the regression test table generation # program as the column heading for HTML tables. Must not include version number. #//GNU
GCC
# compute directories for invoking GCC # # The gcc toolset can be user-configured using the following # variables: # # GCC_ROOT_DIRECTORY # The directory in which GCC was installed. Defaults to # unset. Usually, there is no need to set this variable at # all. However, if G++ is not in the path it is usually # sufficient to configure this one variable. More fine-grained # configuration is available by setting the following: # # GCC_BIN_DIRECTORY # the directory prefix used to find the gcc executables. Defaults to # $(GCC_ROOT_DIRECTORY)/bin/, or "" if GCC_ROOT_DIRECTORY is # not set. # # GCC_INCLUDE_DIRECTORY # the directory in which to find system includes. Defaults to # empty. # # GCC_STDLIB_DIRECTORY # the directory in which to find the standard library # objects associated with this build of gcc. Defaults to # $(GCC_ROOT_DIRECTORY)/lib. # # GXX # The name by which g++ is invoked. You can also use this in # lieu of setting the property to force options such # as "-V3.0.4" into the g++ command line: "-sGXX=g++ -V3.0.4". # # GCC # Similar to GXX, the name by which gcc is invoked for "C" # language targets. # singleton variables... set-as-singleton GCC_ROOT_DIRECTORY GCC_BIN_DIRECTORY GCC_INCLUDE_DIRECTORY GCC_STDLIB_DIRECTORY ; flags gcc GCC_BIN_DIRECTORY : $(GCC_BIN_DIRECTORY) ; flags gcc GCC_INCLUDE_DIRECTORY : $(GCC_INCLUDE_DIRECTORY) ; flags gcc GCC_STDLIB_DIRECTORY : $(GCC_STDLIB_DIRECTORY) ; GCC_BIN_DIRECTORY ?= $(GCC_ROOT_DIRECTORY)$(SLASH)bin ; GCC_BIN_DIRECTORY ?= "" ; # Don't clobber tool names if GCC_ROOT_DIRECTORY not set GCC_STDLIB_DIRECTORY ?= $(GCC_ROOT_DIRECTORY)$(SLASH)lib ; # Make sure this gets set "on" the target flags gcc GCC_BIN_DIR : $(GCC_BIN_DIRECTORY) ; flags gcc LINKFLAGS static : -static ; flags gcc CFLAGS on : -g ; flags gcc LINKFLAGS on : -g ; flags gcc CFLAGS off : -O0 ; flags gcc CFLAGS speed : -O3 ; # Other optimizations we might want for GCC # -fforce-mem -fomit-frame-pointer # -foptimize-sibling-calls -finline-functions -ffast-math -finline-limit=10000 flags gcc CFLAGS space : -Os ; flags gcc CFLAGS off : -fno-inline ; flags gcc CFLAGS on : -Wno-inline ; flags gcc CFLAGS full : -finline-functions -Wno-inline ; flags gcc .GXX : $(GXX) ; flags gcc .GCC : $(GCC) ; # # set threading options for various platforms: # local on-windows ; if $(NT) { on-windows = 1 ; } else if $(UNIX) { switch $(JAMUNAME) { case CYGWIN* : { on-windows = 1 ; } } } flags gcc ON_WINDOWS : $(on-windows) ; if $(on-windows) { flags gcc CFLAGS multi : -mthreads ; flags gcc LINKFLAGS multi : -mthreads ; } else if $(UNIX) { switch $(JAMUNAME) { case SunOS* : { flags gcc CFLAGS multi : -pthreads ; flags gcc LINKFLAGS multi : -pthreads ; flags gcc FINDLIBS multi : rt ; } case BeOS : { # BeOS has no threading options, don't set anything here. } case Darwin : { # MacOS X, doesn't need any threading options set # -lpthread is linked to by default. # There is no gcc/g++, we need to use cc/c++ instead: .GCC ?= cc ; .GXX ?= c++ ; } case *BSD : { flags gcc CFLAGS multi : -pthread ; flags gcc LINKFLAGS multi : -pthread ; # there is no -lrt on BSD } case DragonFly : { flags gcc CFLAGS multi : -pthread ; flags gcc LINKFLAGS multi : -pthread ; # there is no -lrt on BSD - DragonFly is a FreeBSD variant, # which anoyingly doesn't say it's a *BSD. } case IRIX : { # gcc on IRIX does not support multi-threading, don't set anything here. } case HP_UX : { # gcc on HP-UX does not support multi-threading, don't set anything here } case QNX* : { # gcc/QCC on QNX is always? in multi-thread mode, don't set anything here } case * : { flags gcc CFLAGS multi : -pthread ; flags gcc LINKFLAGS multi : -pthread ; flags gcc FINDLIBS multi : rt ; } } } # Some possibly supported, or not, linker flags. The support depends on the OS linker. # flags gcc RPATH_LINK ; flags gcc SONAME ; # Set/reset options for the linker of the platform. # if $(UNIX) { switch $(JAMUNAME) { case SunOS* : { NO_GNU_LN = true ; # sun seems not to use the GNU linker with gcc flags gcc OBJCOPY_FLAGS on : "--set-section-flags .debug_str=contents" ; } case Linux : { RPATH_LINK = -Wl,-rpath-link, ; SONAME = -Wl,-soname, ; flags gcc OBJCOPY_FLAGS on : "--set-section-flags .debug_str=contents,debug" ; } case OpenBSD : { SONAME = -Wl,-soname, ; } case AIX* : { NO_GNU_LN = true ; IMPLIB_FLAGS = "-Wl,-bI:" ; } } } # Set architecture/instruction-set options. # # x86 and compatible .ARCH = x86 native ; flags gcc CFLAGS x86/default : -mcpu=i386 ; flags gcc CFLAGS $(.ARCH)/i386 : -mcpu=i386 ; flags gcc CFLAGS $(.ARCH)/i486 : -mcpu=i486 ; flags gcc CFLAGS $(.ARCH)/i586 : -mcpu=i586 ; flags gcc CFLAGS $(.ARCH)/i686 : -mcpu=i686 ; flags gcc CFLAGS $(.ARCH)/pentium : -mcpu=pentium ; flags gcc CFLAGS $(.ARCH)/pentium-mmx : -mcpu=pentium-mmx ; flags gcc CFLAGS $(.ARCH)/pentiumpro : -mcpu=pentiumpro ; flags gcc CFLAGS $(.ARCH)/pentium2 : -mcpu=pentium2 ; flags gcc CFLAGS $(.ARCH)/pentium3 : -mcpu=pentium3 ; flags gcc CFLAGS $(.ARCH)/pentium4 : -mcpu=pentium4 ; flags gcc CFLAGS $(.ARCH)/k6 : -mcpu=k6 ; flags gcc CFLAGS $(.ARCH)/k6-2 : -mcpu=k6-2 ; flags gcc CFLAGS $(.ARCH)/k6-3 : -mcpu=k6-3 ; flags gcc CFLAGS $(.ARCH)/athlon : -mcpu=athlon ; flags gcc CFLAGS $(.ARCH)/athlon-tbird : -mcpu=athlon-tbird ; flags gcc CFLAGS $(.ARCH)/athlon-4 : -mcpu=athlon-4 ; flags gcc CFLAGS $(.ARCH)/athlon-xp : -mcpu=athlon-xp ; flags gcc CFLAGS $(.ARCH)/athlon-mp : -mcpu=athlon-mp ; # Sparc .ARCH = sparc native ; flags gcc CFLAGS sparc/default : -mcpu=v7 ; flags gcc CFLAGS $(.ARCH)/v7 : -mcpu=v7 ; flags gcc CFLAGS $(.ARCH)/cypress : -mcpu=cypress ; flags gcc CFLAGS $(.ARCH)/v8 : -mcpu=v8 ; flags gcc CFLAGS $(.ARCH)/supersparc : -mcpu=supersparc ; flags gcc CFLAGS $(.ARCH)/sparclite : -mcpu=sparclite ; flags gcc CFLAGS $(.ARCH)/hypersparc : -mcpu=hypersparc ; flags gcc CFLAGS $(.ARCH)/sparclite86x : -mcpu=sparclite86x ; flags gcc CFLAGS $(.ARCH)/f930 : -mcpu=f930 ; flags gcc CFLAGS $(.ARCH)/f934 : -mcpu=f934 ; flags gcc CFLAGS $(.ARCH)/sparclet : -mcpu=sparclet ; flags gcc CFLAGS $(.ARCH)/tsc701 : -mcpu=tsc701 ; flags gcc CFLAGS $(.ARCH)/v9 : -mcpu=v9 ; flags gcc CFLAGS $(.ARCH)/ultrasparc : -mcpu=ultrasparc ; flags gcc CFLAGS sparc/64 : -m64 ; flags gcc LINKFLAGS sparc/64 : -m64 ; # RS/6000 & PowerPC .ARCH = power native ; flags gcc CFLAGS power/default/default : -mcpu=common ; flags gcc CFLAGS power/32/default : -mcpu=common ; flags gcc CFLAGS power/64/default : -mcpu=powerpc64 ; flags gcc CFLAGS $(.ARCH)/rios : -mcpu=rios ; flags gcc CFLAGS $(.ARCH)/rios1 : -mcpu=rios1 ; flags gcc CFLAGS $(.ARCH)/rsc : -mcpu=rsc ; flags gcc CFLAGS $(.ARCH)/rios2 : -mcpu=rios2 ; flags gcc CFLAGS $(.ARCH)/rs64a : -mcpu=rs64a ; flags gcc CFLAGS $(.ARCH)/403 : -mcpu=403 ; flags gcc CFLAGS $(.ARCH)/505 : -mcpu=505 ; flags gcc CFLAGS $(.ARCH)/601 : -mcpu=601 ; flags gcc CFLAGS $(.ARCH)/602 : -mcpu=602 ; flags gcc CFLAGS $(.ARCH)/603 : -mcpu=603 ; flags gcc CFLAGS $(.ARCH)/603e : -mcpu=603e ; flags gcc CFLAGS $(.ARCH)/604 : -mcpu=604 ; flags gcc CFLAGS $(.ARCH)/604e : -mcpu=604e ; flags gcc CFLAGS $(.ARCH)/620 : -mcpu=620 ; flags gcc CFLAGS $(.ARCH)/630 : -mcpu=630 ; flags gcc CFLAGS $(.ARCH)/740 : -mcpu=740 ; flags gcc CFLAGS $(.ARCH)/7400 : -mcpu=7400 ; flags gcc CFLAGS $(.ARCH)/7450 : -mcpu=7450 ; flags gcc CFLAGS $(.ARCH)/750 : -mcpu=750 ; flags gcc CFLAGS $(.ARCH)/801 : -mcpu=801 ; flags gcc CFLAGS $(.ARCH)/821 : -mcpu=821 ; flags gcc CFLAGS $(.ARCH)/823 : -mcpu=823 ; flags gcc CFLAGS $(.ARCH)/860 : -mcpu=860 ; flags gcc CFLAGS $(.ARCH)/power : -mcpu=power ; flags gcc CFLAGS $(.ARCH)/power2 : -mcpu=power2 ; flags gcc CFLAGS $(.ARCH)/power3 : -mcpu=power3 ; flags gcc CFLAGS $(.ARCH)/power4 : -mcpu=power4 ; flags gcc CFLAGS $(.ARCH)/power5 : -mcpu=power5 ; flags gcc CFLAGS $(.ARCH)/powerpc : -mcpu=powerpc ; flags gcc CFLAGS $(.ARCH)/powerpc64 : -mcpu=powerpc64 ; # AIX variant of RS/6000 & PowerPC flags gcc CFLAGS power/32/aix : -maix32 ; flags gcc LINKFLAGS power/32/aix : -maix32 ; flags gcc CFLAGS power/64/aix : -maix64 ; flags gcc LINKFLAGS power/64/aix : -maix64 ; flags gcc AROPTIONS power/64/aix : "-X 64" ; # MIPS-1-2-3-4 flags gcc MIPS mips1 mips2 mips3 mips4 : TRUE ; flags gcc MIPS r2000 r3000 r3900 r4000 r4100 r4300 r4400 r4600 r4650 r5000 r6000 r8000 orion : TRUE ; if $(MIPS) { flags gcc CFLAGS mips1 : -mips1 ; flags gcc CFLAGS mips2 : -mips2 ; flags gcc CFLAGS mips3 : -mips3 ; flags gcc CFLAGS mips4 : -mips4 ; flags gcc CFLAGS r2000 : -mcpu=r2000 ; flags gcc CFLAGS r3000 : -mcpu=r3000 ; flags gcc CFLAGS r3900 : -mcpu=r3900 ; flags gcc CFLAGS r4000 : -mcpu=r4000 ; flags gcc CFLAGS r4100 : -mcpu=r4100 ; flags gcc CFLAGS r4300 : -mcpu=r4300 ; flags gcc CFLAGS r4400 : -mcpu=r4400 ; flags gcc CFLAGS r4600 : -mcpu=r4600 ; flags gcc CFLAGS r4650 : -mcpu=r4650 ; flags gcc CFLAGS r5000 : -mcpu=r5000 ; flags gcc CFLAGS r6000 : -mcpu=r6000 ; flags gcc CFLAGS r8000 : -mcpu=r8000 ; flags gcc CFLAGS orion : -mcpu=orion ; # ...addressing model options flags gcc ADDRESS_MODEL_INVALID 16 : TRUE ; if $(ADDRESS_MODEL_INVALID) { EXIT "Error: Invalid addressing model for MIPS architecture (16)." ; } flags gcc CFLAGS default : -mgp32 ; flags gcc CFLAGS 32 : -mgp32 ; flags gcc CFLAGS 64 : -mgp64 -mlong64 ; } #S390 if $(OSPLAT) = 390 || $(OSPLAT) = IA64 { flags gcc CFLAGS multi : -D_REENTRANT ; } # # define compiler names if not set: .GCC ?= gcc ; .GXX ?= g++ ; flags gcc CFLAGS : -Wall ; flags gcc C++FLAGS : -ftemplate-depth-255 ; flags gcc CFLAGS on : -pg ; flags gcc LINKFLAGS on : -pg ; flags gcc C++FLAGS off : -fno-rtti ; flags gcc C++FLAGS on : -fvtable-thunks ; flags gcc C++FLAGS off : -fvtable-thunks=0 ; flags gcc CFLAGS ; flags gcc C++FLAGS ; flags gcc DEFINES ; flags gcc UNDEFS ; flags gcc HDRS ; flags gcc SYSHDRS ; flags gcc LINKFLAGS ; flags gcc LINKFLAGS off : -s ; flags gcc ARFLAGS ; flags gcc STDHDRS : $(GCC_INCLUDE_DIRECTORY) ; flags gcc STDLIBPATH : $(GCC_STDLIB_DIRECTORY) ; if ! $(ARFLAGS) { flags gcc ARFLAGS : "" ; } if ! $(on-windows) # The compiler complains about -fPIC on NT { flags gcc CFLAGS true : -fPIC ; flags gcc LINKFLAGS true : -fPIC ; } if $(BETOOLS) { flags gcc LINKFLAGS $(SHARED_TYPES) : -nostart ; } else { flags gcc LINKFLAGS $(SHARED_TYPES) : -shared ; } flags gcc LIBPATH ; flags gcc NEEDLIBS ; flags gcc FINDLIBS ; flags gcc DLLVERSION ; DLLVERSION = $(DLLVERSION[1]) ; DLLVERSION ?= $(BOOST_VERSION) ; flags gcc TARGET_TYPE ; # allow for "ar" to be part of the compiler distribution, for # example in mingw and cygwin flags gcc .AR : [ GLOB $(GCC_BIN_DIRECTORY) $(PATH) : ar ar.exe ] ; .AR ?= ar ; # used to manipulate the object files produced by GCC to # prevent the merging of debug symbols (which happens to be n^2 slow) if ! ( --no-objcopy in $(ARGV) ) { flags gcc .OBJCOPY : [ GLOB $(GCC_BIN_DIRECTORY) $(PATH) : objcopy ] ; } if ! $(on-windows) { flags gcc .SET_EXIT : "set -e" ; } # Since GCC doesn't support response files, we want to give it a # chance to execute any long commands via spawnvp on NT, where the # command-line length limitation can really get in the way. We call # this on every target, but it will only take effect for targets we # deem spawnable, and that have long command-lines. rule gcc-spawn ( targets + ) { if $(NT) { JAMSHELL on $(targets) = % ; } } #### Link #### rule Link-action { _ on $(<) = " " ; # if we don't have a GNU linker then we can't pass any GNU-ld specific flags: if $(NO_GNU_LN) { LNOPT on $(<) = ; } else { LNOPT on $(<) = "" ; } # do we use sonames or not? if $(DLLVERSION) && $(TARGET_TYPE) in $(SHARED_TYPES) && ( $(OS) = LINUX || $(OS) = OPENBSD || $(OS) = KFREEBSD ) && ! $(NO_GNU_LN) { OUTTAG on $(<) = ".$(DLLVERSION)" ; SOTAG on $(<) = ".$(DLLVERSION)" ; ACTION_1 on $(<) = "" ; } else { OUTTAG on $(<) = "" ; SOTAG on $(<) = ; ACTION_1 on $(<) = ; } if [ on $(<) return $(ON_WINDOWS) ] { # On Win32, choose different image bases for load-time efficiency DLL_LINK_FLAGS on $(<) += "-Wl,--enable-auto-image-base" ; } if $(<[2]) && [ on $(<) return $(ON_WINDOWS) ] { # Allow gcc-nocygwin to avoid this flag if ! $(GCC_NO_EXPORT_ALL) { DLL_LINK_FLAGS on $(<) += "-Wl,--export-all-symbols" ; } # This will appear before the import library name when building a DLL, but # will be "multiplied away" otherwise. The --exclude-symbols directive # proved to be necessary with some versions of Cygwin. DLL_LINK_FLAGS on $(<) += "-Wl,--exclude-symbols,_bss_end__:_bss_start__:_data_end__:_data_start__" ; # set the link command to generate an import library if ! $(NO_GNU_LN) { IMPLIB_COMMAND on $(<) = "-Wl,--out-implib," ; } } DEPENDS $(<) : $(NEEDLIBS) $(NEEDIMPS) ; gRUN_LD_LIBRARY_PATH($(<)) += $(STDLIBPATH:T) ; # Workaround GCC's lack of command-files and NT's line-length limitation. gcc-spawn $(<) ; gcc-Link-action $(<) : $(>) ; if $(DLLVERSION) && $(TARGET_TYPE) in $(SHARED_TYPES) && ( $(OS) = LINUX || $(OS) = OPENBSD || $(OS) = KFREEBSD ) && ! $(NO_GNU_LN) { return "$(<[1]).$(DLLVERSION)" ; } } # for gcc, we repeat all libraries so that dependencies are always resolved actions gcc-Link-action bind NEEDLIBS NEEDIMPS { $(.SET_EXIT) $(SHELL_SET)$(gSHELL_LIBPATH)=$(LINK_LIBPATH)$(gAPPEND_LD_LIBRARY_PATH) $(SHELL_EXPORT)$(gSHELL_LIBPATH) "$(.GXX[1]:R=$(GCC_BIN_DIR))" $(.GXX[2-]) "$(DLL_LINK_FLAGS)" "$(IMPLIB_COMMAND)$(<[2])" $(LINKFLAGS) -o "$(<[1])$(OUTTAG)" -L"$(LIBPATH:T)" -L"$(STDLIBPATH:T)" "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" "$(IMPLIB_FLAGS)$(NEEDIMPS)" -l$(FINDLIBS) $(LNOPT)$(RPATH_LINK). $(LNOPT)$(SONAME)$(<[1]:D=)$(SOTAG) $(ACTION_1)$(LN)$(_)-fs$(_)"$(<[1]:D=)$(OUTTAG)"$(_)"$(<[1])" } #### Cc ##### rule Cc-action { gcc-spawn $(<) ; _ on $(<) = " " ; gcc-Cc-action $(<) : $(>) ; } actions gcc-Cc-action { $(.SET_EXIT) "$(.GCC[1]:R=$(GCC_BIN_DIR))" $(.GCC[2-]) -c -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) -I"$(HDRS)" -I$(_)"$(STDHDRS)" -I$(_)"$(SYSHDRS)" -o "$(<)" "$(>)" "$(.OBJCOPY[1])"$(_)$(OBJCOPY_FLAGS)$(_)"$(<)" } #### C++ #### rule C++-action { gcc-spawn $(<) ; _ on $(<) = " " ; gcc-C++-action $(<) : $(>) ; } actions gcc-C++-action { $(.SET_EXIT) "$(.GXX[1]:R=$(GCC_BIN_DIR))" $(.GXX[2-]) -c -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) $(C++FLAGS) -I"$(HDRS)" -I$(_)"$(STDHDRS)" -I$(_)"$(SYSHDRS)" -o "$(<)" "$(>)" "$(.OBJCOPY[1])"$(_)$(OBJCOPY_FLAGS)$(_)"$(<)" } #### Archive #### rule Archive-action { gcc-spawn $(<) ; gcc-Archive-action $(<) : $(>) ; } actions updated together piecemeal gcc-Archive-action { "$(.AR[1])" $(AROPTIONS) ru$(ARFLAGS:J=) "$(<)" "$(>)" }