# Rules for Jamfile.jam if ( $(toolset:I=^mingw) || $(toolset:I=^gcc) ) { if ( $(toolset:I=^gcc) ) { GCCPATH = "" ; } else { GCCPATH = "%$(toolset)_PATH%\\bin\\" ; } CCFLAGS += -D$(defines) ; if ( $(configuration) = "debug" ) { CCFLAGS += -D_DEBUG ; } else { CCFLAGS += -DNDEBUG -O3 ; } if ( PUGIXML_NO_EXCEPTIONS in $(defines) ) { CCFLAGS += -fno-exceptions ; } if ( $(OS) != MACOSX ) { LDFLAGS += -static-libgcc -static ; } actions ObjectAction { "$(GCCPATH)gcc" -W -Wall -Wextra -Werror -pedantic -c $(>) -o $(<) $(CCFLAGS) } actions LibraryAction { "$(GCCPATH)ar" rcs $(<) $(>) } actions LinkAction { "$(GCCPATH)g++" $(>) -o $(<) $(LDFLAGS) } actions maxtargets 1 CoverageAction { "$(GCCPATH)gcov" $(>) $(GCOVFLAGS) | perl tests/gcov-filter.pl } } else if ( $(toolset:I=^msvc) ) { CCFLAGS += /D$(defines) ; if ( $(fulldebug) ) { CCFLAGS += /Z7 ; LDFLAGS += /DEBUG ; } if ( $(configuration) = "debug" ) { CCFLAGS += /D_DEBUG /MTd ; } else { CCFLAGS += /DNDEBUG /Ox /MT ; } if ( $(toolset) = msvc7 || $(toolset) = msvc71 || $(toolset) = msvc8 ) { CCFLAGS += /Wp64 ; # Wp64 is deprecated from msvc9 } if ( $(toolset) != msvc6 ) { CCFLAGS += /W4 ; } else { CCFLAGS += /W3 ; # lots of warnings at W4 in standard library } if ( $(toolset) = msvc7 || $(toolset) = msvc71 || $(toolset) = msvc8 ) { CCFLAGS += "/I\"%$(toolset)_PATH%\\PlatformSDK\\include\"" ; } else if ( $(toolset) != msvc6 ) { CCFLAGS += "/I\"%WINSDK_PATH%\\Include\"" ; } if ( ! ( PUGIXML_NO_EXCEPTIONS in $(defines) ) ) { CCFLAGS += /EHsc ; } else if ( $(toolset) = "msvc6" || $(toolset) = "msvc71" ) { # No no-exception STL in MSVC6, buggy no-exception STL in MSVC71 CCFLAGS += /EHsc ; } else { CCFLAGS += /D_HAS_EXCEPTIONS=0 ; } if ( $(toolset:I=x64$) ) { postfix = "\\amd64" ; sdk_postfix = "\\x64" ; LDFLAGS += /MACHINE:X64 ; } else { postfix = "" ; sdk_postfix = "" ; } actions ObjectAction { "%$(toolset)_PATH%\bin$(postfix)\cl.exe" /WX /I"%$(toolset)_PATH%\include" /c $(>) /Fo$(<) /nologo $(CCFLAGS) } actions LibraryAction { "%$(toolset)_PATH%\bin$(postfix)\lib.exe" /NOLOGO /OUT:$(<) $(>) } actions LinkAction { "%$(toolset)_PATH%\bin$(postfix)\link.exe" /SUBSYSTEM:CONSOLE /NOLOGO /OUT:$(<) /PDB:$(<:S=.pdb) $(>) /LIBPATH:"%$(toolset)_PATH%\lib$(postfix)" /LIBPATH:"%$(toolset)_PATH%\PlatformSDK\lib$(postfix)" /LIBPATH:"%WINSDK_PATH%\Lib$(sdk_postfix)" $(LDFLAGS) } actions CoverageAction { } } else if ( $(toolset) = "ic8" ) { msvc = "msvc7" ; CCFLAGS += /D$(defines) ; if ( $(configuration) = "debug" ) { CCFLAGS += /D_DEBUG /MTd ; } else { CCFLAGS += /DNDEBUG /Ox /MT ; } if ( ! ( PUGIXML_NO_EXCEPTIONS in $(defines) ) ) { CCFLAGS += /EHsc ; } actions ObjectAction { "%$(toolset)_PATH%\bin\icl.exe" /W4 /WX /Wport /Qwd981,444,280,383,909,304,167,171,177,1419 /I"%$(msvc)_PATH%\include" /I"%$(msvc)_PATH%\PlatformSDK\Include" /I"%$(toolset)_PATH%\include" /c $(>) /Fo$(<) /nologo $(CCFLAGS) } actions LibraryAction { "%$(msvc)_PATH%\bin\lib.exe" /NOLOGO /OUT:$(<) $(>) } actions LinkAction { "%$(msvc)_PATH%\bin\link.exe" /SUBSYSTEM:CONSOLE /NOLOGO /OUT:$(<) $(>) /LIBPATH:"%$(toolset)_PATH%\lib" /LIBPATH:"%$(msvc)_PATH%\lib" /LIBPATH:"%$(msvc)_PATH%\PlatformSDK\lib" $(LDFLAGS) } actions CoverageAction { } } else if ( $(toolset:I=^dmc) ) { CCFLAGS += -D$(defines) ; if ( $(configuration) = "debug" ) { CCFLAGS += -D_DEBUG ; } else { CCFLAGS += -DNDEBUG ; } if ( ! ( PUGIXML_NO_EXCEPTIONS in $(defines) ) ) { CCFLAGS += -Ae ; } actions ObjectAction { "%$(toolset)_PATH%\bin\dmc.exe" -c -f -I%$(toolset)_PATH%\stlport\stlport -wx $(>) -o$(<) $(CCFLAGS) } actions LibraryAction { "%$(toolset)_PATH%\bin\lib.exe" -c $(<) $(>) } actions LinkAction { "%$(toolset)_PATH%\bin\link.exe" $(>:\\) , $(<:\\) , nul , $(LDFLAGS:\\) -L/co/ma } actions CoverageAction { } } else if ( $(toolset:I=^cw) ) { cw_bin = "%$(toolset)_PATH%\\Other Metrowerks Tools\\Command Line Tools" ; CCFLAGS += -D$(defines) ; if ( $(configuration) = "debug" ) { CCFLAGS += -D_DEBUG ; } else { CCFLAGS += -DNDEBUG -O4 ; } if ( PUGIXML_NO_EXCEPTIONS in $(defines) ) { CCFLAGS += -Cpp_exceptions off ; } actions ObjectAction { "$(cw_bin)\mwcc.exe" -c -cwd include -ansi strict -iso_templates on -msext off -w all,cmdline,iserror,nonotused,nonotinlined,noimplicitconv,nounwanted $(>) -o $(<) $(CCFLAGS) } actions LibraryAction { "$(cw_bin)\mwld.exe" -library -o $(<) $(>) } actions LinkAction { "$(cw_bin)\mwld.exe" -subsystem console -o $(<) $(>) $(LDFLAGS) } actions CoverageAction { } } else if ( $(toolset:I=^bcc) ) { CCFLAGS += -D$(defines) ; if ( $(configuration) = "debug" ) { CCFLAGS += -D_DEBUG ; } else { CCFLAGS += -DNDEBUG -Ox ; } actions ObjectAction { "%$(toolset)_PATH%\bin\bcc32.exe" $(CCFLAGS) -c -q -Q -fp -w -w! -w-8026 -w-8027 -w-8091 -w-8004 -o $(<) $(>) } actions LibraryAction { "%$(toolset)_PATH%\bin\tlib.exe" /C $(<:\\) -+$(>:\\) } actions LinkAction { "%$(toolset)_PATH%\bin\ilink32.exe" -L"%$(toolset)_PATH%\lib" -Tpe -ap -Gn -x -c "%$(toolset)_PATH%\lib\c0x32.obj" $(>:\\) , $(<:\\) , , $(LDFLAGS:\\) cw32 import32 } actions CoverageAction { } } else if ( $(toolset:I=^suncc) ) { CCFLAGS += -D$(defines) ; if ( $(configuration) = "debug" ) { CCFLAGS += -D_DEBUG ; } else { CCFLAGS += -DNDEBUG -O ; } if ( PUGIXML_NO_EXCEPTIONS in $(defines) ) { CCFLAGS += -noex ; } actions ObjectAction { sunCC $(CCFLAGS) +w -xwe -c -o $(<) $(>) } actions LibraryAction { ar rcs $(<) $(>) } actions LinkAction { sunCC $(>) -o $(<) $(LDFLAGS) } actions CoverageAction { } } else { exit "Unknown toolset $(toolset)!" ; } if ( $(UNIX) ) { actions screenoutput RunAction { $(>) } actions quietly ignore MakeDirAction { mkdir -p $(<) } actions quietly ignore DeleteAction { rm -f $(>) } } else { actions screenoutput RunAction { $(>:\\) } actions quietly ignore MakeDirAction { mkdir $(<:\\) >nul 2>&1 } actions quietly ignore DeleteAction { del /F $(>:\\) >nul 2>&1 } } rule MakeFileDir TARGET { local DIR = $(TARGET:D) ; MakeDirAction $(DIR) ; Needs $(TARGET) : $(DIR) ; } rule Alias TARGET : SOURCE { NotFile $(TARGET) ; Always $(TARGET) ; Depends $(TARGET) : $(SOURCE) ; } rule Object TARGET : SOURCE { HDRRULE on $(SOURCE) = C.HdrRule ; HDRSCAN on $(SOURCE) = $(C.HDRPATTERN) ; MakeFileDir $(TARGET) ; ObjectAction $(TARGET) : $(SOURCE) ; Depends $(TARGET) : $(SOURCE) ; } rule Objects SOURCES { local OBJECTS ; for SOURCE in $(SOURCES) { local OBJECT = $(BUILD)/$(SOURCE:S=.o) ; Object $(OBJECT) : $(SOURCE) ; OBJECTS += $(OBJECT) ; } return $(OBJECTS) ; } rule Library TARGET : SOURCES { # build object files local OBJECTS = [ Objects $(SOURCES) ] ; # build library local LIBRARY = $(BUILD)/$(TARGET).a ; MakeFileDir $(LIBRARY) ; LibraryAction $(LIBRARY) : $(OBJECTS) ; Depends $(LIBRARY) : $(OBJECTS) ; # make alias Alias $(TARGET) : $(LIBRARY) ; # remember library path for linking $(TARGET)_path = $(LIBRARY) ; # remember library objects for coverage $(TARGET)_objects = $(OBJECTS) ; } rule Application TARGET : SOURCES : LIBRARIES { # build object files local OBJECTS = [ Objects $(SOURCES) ] ; # get binary path local EXECUTABLE = $(BUILD)/$(TARGET).exe ; # set libraries LDFLAGS on $(EXECUTABLE) = $(LDFLAGS) $($(LIBRARIES)_path) ; # build application MakeFileDir $(EXECUTABLE) ; LinkAction $(EXECUTABLE) : $(OBJECTS) ; Depends $(EXECUTABLE) : $(OBJECTS) $($(LIBRARIES)_path) ; # make alias Alias $(TARGET) : $(EXECUTABLE) ; # remember executable path for running $(TARGET)_path = $(EXECUTABLE) ; # remember executable objects for coverage $(TARGET)_objects = $(OBJECTS) $($(LIBRARIES)_objects) ; } rule CleanCoverage TARGET { # make target local CLEAN_TARGET = $(TARGET)_clean_coverage ; NotFile $(CLEAN_TARGET) ; Always $(CLEAN_TARGET) ; Depends $(TARGET) : $(CLEAN_TARGET) ; # clean object files local FILES = $($(SOURCE)_objects:S=.gcda) ; # disable "independent target" warnings NotFile $(FILES) ; DeleteAction $(CLEAN_TARGET) : $(FILES) ; } rule Test TARGET : SOURCE { # make alias Alias $(TARGET) : $(SOURCE) ; # run tests RunAction $(TARGET) : $($(SOURCE)_path) ; # remember executable objects for coverage $(TARGET)_objects = $($(SOURCE)_objects) ; # clean coverage files before run CleanCoverage $(TARGET) ; } rule Coverage TARGET : SOURCE { local FILES = $($(SOURCE)_objects:S=.gcda) ; # disable "independent target" warnings NotFile $(FILES) ; CoverageAction $(TARGET) : $(FILES) ; Depends $(TARGET) : $(SOURCE) ; }