# 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=) "$(<)" "$(>)"
}