# (C) Copyright David Abrahams 2001. Permission to copy, use, # modify, sell and distribute this software is granted provided this # copyright notice appears in all copies. This software is provided # "as is" without express or implied warranty, and with no claim as # to its suitability for any purpose. # compute directories for invoking GCC SPACE ?= " " ; GCC_BIN_DIRECTORY ?= $(GCC_ROOT_DIRECTORY)$(SLASH)bin$(SLASH) ; GCC_BIN_DIRECTORY ?= "" ; # Don't clobber tool names if GCC_ROOT_DIRECTORY not set GCC_INCLUDE_DIRECTORY ?= $(GCC_ROOT_DIRECTORY)$(SLASH)include ; GCC_STDLIB_DIRECTORY ?= $(GCC_ROOT_DIRECTORY)$(SLASH)lib ; 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 ; # # set threading options for various platforms: # if $(NT) { flags gcc CFLAGS multi : -mthreads ; } else if $(UNIX) { switch $(JAMUNAME) { case CYGWIN* : { flags gcc CFLAGS multi : -mthreads ; } case SunOS* : { flags gcc CFLAGS multi : -pthreads ; flags gcc LINKFLAGS multi : -pthreads ; flags gcc FINDLIBS multi : rt ; NO_GNU_LN = true ; # sun seems not to use the GNU linker with gcc } 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 * : { flags gcc CFLAGS multi : -pthread ; flags gcc LINKFLAGS multi : -pthread ; flags gcc FINDLIBS multi : rt ; } } } # # define compiler names if not set: GCC ?= gcc ; GXX ?= g++ ; flags gcc CFLAGS on : -pg ; flags gcc LINKFLAGS on : -pg ; flags gcc C++FLAGS off : -fno-rtti ; flags gcc CFLAGS ; flags gcc C++FLAGS ; flags gcc DEFINES ; flags gcc UNDEFS ; flags gcc HDRS ; flags gcc STDHDRS ; 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 ! $(NT) # 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 ; if $(DLLVERSION) { DLLVERSION = $(DLLVERSION[1]) ; } else { DLLVERSION = $(BOOST_VERSION) ; } #### Link #### rule Link-action { # 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 neccessary with some versions of Cygwin. IMPLIB_COMMAND on $(<) = "-Wl,--export-all-symbols -Wl,--exclude-symbols,_bss_end__:_bss_start__:_data_end__:_data_start__ -Wl,--out-implib," ; DEPENDS $(<) : $(NEEDLIBS) ; gRUN_LD_LIBRARY_PATH($(<)) += $(GCC_STDLIB_DIRECTORY) ; if $(<[2]) && $(NT) && ( -mno-cygwin in $(gBUILD_PROPERTIES:G=) ) { gcc-dllwrap $(<) : $(>) ; } else { gcc-Link-action $(<) : $(>) ; } } # for gcc, we repeat all libraries so that dependencies are always resolved if $(NO_GNU_LN) { # if we don't have a GNU linker then we can't pass any GNU-ld specific flags: actions gcc-Link-action bind NEEDLIBS { $(GCC_BIN_DIRECTORY)$(GXX) $(IMPLIB_COMMAND)$(<[2]) $(LINKFLAGS) -o "$(<[1])" -L$(LIBPATH:T) -L$(STDLIBPATH:T) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) } } else { actions gcc-Link-action bind NEEDLIBS { $(SHELL_SET)LD_LIBRARY_PATH=$(RUN_LD_LIBRARY_PATH) $(SHELL_EXPORT)LD_LIBRARY_PATH $(GCC_BIN_DIRECTORY)$(GXX) $(IMPLIB_COMMAND)$(<[2]) $(LINKFLAGS) -o "$(<[1])" -L$(LIBPATH:T) -L$(STDLIBPATH:T) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) -Wl,-rpath-link,. -Wl,-soname,$(<[1]:D=).$(DLLVERSION) } } actions gcc-dllwrap bind NEEDLIBS { dllwrap --dllname $(<[1]) -o foo.pyd $(>) -s --entry _DllMain@12 --target=i386-mingw32 -L$(LIBPATH:T) -L$(STDLIBPATH:T) "$(>)" "$(NEEDLIBS)" "$(NEEDLIBS)" -l$(FINDLIBS) -Wl,-rpath-link,. $(LINKFLAGS) } #### Cc ##### rule Cc-action { gcc-Cc-action $(<) : $(>) ; } actions gcc-Cc-action { $(GCC_BIN_DIRECTORY)$(GCC) -c -Wall -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) -I"$(HDRS)" -isystem$(SPACE)"$(STDHDRS)" -o "$(<)" "$(>)" } #### C++ #### rule C++-action { gcc-C++-action $(<) : $(>) ; } actions gcc-C++-action { $(GCC_BIN_DIRECTORY)$(GXX) -c -Wall -ftemplate-depth-100 -U$(UNDEFS) -D$(DEFINES) $(CFLAGS) $(C++FLAGS) -I"$(HDRS)" -isystem$(SPACE)"$(STDHDRS)" -o "$(<)" "$(>)" } #### Archive #### rule Archive-action { gcc-Archive-action $(<) : $(>) ; } actions updated together piecemeal gcc-Archive-action { ar ru$(ARFLAGS) "$(<:T)" "$(>:T)" }