# Rules for Jamfile.jam if ( $(toolset:I=^mingw) ) { CCFLAGS += -D$(defines) ; if ( $(configuration) = "debug" ) { CCFLAGS += -D_DEBUG ; } else { CCFLAGS += -DNDEBUG -O3 ; } if ( PUGIXML_NO_EXCEPTIONS in $(defines) ) { CCFLAGS += -fno-exceptions ; } actions ObjectAction { "%$(toolset)_PATH%\bin\gcc" -W -Wall -Wextra -Werror -pedantic -c $(>) -o $(<) $(CCFLAGS) } actions LibraryAction { "%$(toolset)_PATH%\bin\ar" rc $(<) $(>) } actions LinkAction { "%$(toolset)_PATH%\bin\g++" $(>) -o $(<) -static-libgcc $(LDFLAGS) } actions CoverageAction { "%$(toolset)_PATH%\bin\gcov" $(>:\\) $(GCOVFLAGS) | perl tests/gcov-filter.pl } } else if ( $(toolset:I=^msvc) ) { CCFLAGS += /D$(defines) ; if ( $(configuration) = "debug" ) { CCFLAGS += /D_DEBUG /MTd ; } else { CCFLAGS += /DNDEBUG /Ox /MT ; } if ( $(toolset) != msvc6 ) { CCFLAGS += /Wp64 /W4 ; } else { CCFLAGS += /W3 ; # lots of warnings at W4 in standard library } 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 ; } actions ObjectAction { "%$(toolset)_PATH%\bin\cl.exe" /WX /I"%$(toolset)_PATH%\include" /c $(>) /Fo$(<) /nologo $(CCFLAGS) } actions LibraryAction { "%$(toolset)_PATH%\bin\lib.exe" /NOLOGO /OUT:$(<) $(>) } actions LinkAction { "%$(toolset)_PATH%\bin\link.exe" /SUBSYSTEM:CONSOLE /NOLOGO /OUT:$(<) $(>) /LIBPATH:"%$(toolset)_PATH%\lib" /LIBPATH:"%$(toolset)_PATH%\PlatformSDK\lib" $(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,177 /I"%$(msvc)_PATH%\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:\\) } 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 { exit "Unknown toolset $(toolset)!" ; } 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) ; 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) ; }