summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Jamrules.jam831
1 files changed, 430 insertions, 401 deletions
diff --git a/Jamrules.jam b/Jamrules.jam
index d4109d3..54806a6 100644
--- a/Jamrules.jam
+++ b/Jamrules.jam
@@ -1,401 +1,430 @@
-# 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 ;
- }
-
- 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:$(<) $(>) /LIBPATH:"%$(toolset)_PATH%\lib$(postfix)" /LIBPATH:"%$(toolset)_PATH%\PlatformSDK\lib" /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,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) ;
-}
+# Rules for Jamfile.jam
+
+if ( $(toolset:I=^mingw) || $(toolset) = "gcc" )
+{
+ if ( $(toolset) = "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 ;
+ }
+
+ actions ObjectAction
+ {
+ "$(GCCPATH)gcc" -W -Wall -Wextra -Werror -pedantic -c $(>) -o $(<) $(CCFLAGS)
+ }
+
+ actions LibraryAction
+ {
+ "$(GCCPATH)ar" rc $(<) $(>)
+ }
+
+ actions LinkAction
+ {
+ "$(GCCPATH)g++" $(>) -o $(<) -static-libgcc $(LDFLAGS)
+ }
+
+ actions CoverageAction
+ {
+ "$(GCCPATH)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 ;
+ }
+
+ 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:$(<) $(>) /LIBPATH:"%$(toolset)_PATH%\lib$(postfix)" /LIBPATH:"%$(toolset)_PATH%\PlatformSDK\lib" /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,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)!" ;
+}
+
+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) ;
+
+ 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) ;
+}