# Latest jamplus is needed to use this

# Targets:
# pugixml - build pugixml library
# tests - build pugixml test suite
# run_tests - run pugixml test suite
# coverage - get test suite coverage

# Options:
# toolset=name - select toolset
# 	supported toolsets: mingw*, msvc*

# default toolset/configuration
if ( ! $(toolset) )
{
	if ( $(OS) = SOLARIS )
	{
		toolset = suncc ;
	}
	else if ( $(UNIX) )
	{
		local GCCVERSION = [ Subst [ Shell "gcc -dumpversion" ] : $(NEWLINE) ] ;
		toolset = "gcc"$(GCCVERSION) ;
	}
	else
	{
		exit You should specify a toolset ;
	}
}

if ( ! $(configuration) )
{
	configuration = "debug" ;
}

if ( ! $(defines) )
{
	defines = "PUGIXML_STANDARD" ;
}

# coverage options
if ( $(toolset:I=^mingw) || $(toolset:I=^gcc) )
{
	CCFLAGS = -fprofile-arcs -ftest-coverage ;
	LDFLAGS = -fprofile-arcs ;
	GCOVFLAGS = -n ;
}

# build folder
BUILD = build ;

# enable dependency cache
DEPCACHE.standard = $(BUILD)/.depcache ;

# rules
include "Jamrules.jam" ;

# split define sets into list
local DEFINESETS = [ Split $(defines) : ':' ] ;

# split configurations into list
local CONFIGURATIONS = [ Split $(configuration) : ',' ] ;

for CONFIG in $(CONFIGURATIONS)
{
	for DEFINESET in $(DEFINESETS)
	{
		local DEFINES = [ Split $(DEFINESET) : ',' ] ;

		# build folder
		local CFGBUILD = $(BUILD)/$(toolset)/$(DEFINES:J=_)/$(CONFIG) ;

		# compilation options
		local CFGFLAGS = $(CCFLAGS) [ GetCFlags $(CONFIG) : $(DEFINES) ] ;

		# build library
		local PUGIXML = $(CFGBUILD)/pugixml.lib ;
		Library $(PUGIXML) : src/pugixml.cpp src/pugixpath.cpp : $(CFGFLAGS) ;
		Alias pugixml : $(PUGIXML) ;

		# build tests
		local TESTS = $(CFGBUILD)/tests.exe ;
		Application $(TESTS) : [ Glob tests : *.cpp ] : $(CFGFLAGS) : $(PUGIXML) ;
		Alias tests : $(TESTS) ;

		# run tests
		Test $(TESTS)_run : $(TESTS) ;
		Alias run_tests : $(TESTS)_run ;

		# gather coverage
		Coverage $(TESTS)_coverage : $(PUGIXML) ;
		Alias coverage : $(TESTS)_coverage ;

		GCOVFLAGS on $(TESTS)_coverage = $(GCOVFLAGS) -o $(CFGBUILD)/src ; # because stupid gcov can't find files via relative paths

		# add special autotest markers to build log
		if $(autotest)
		{
			COVPREFIX on $(TESTS)_coverage = "... autotest $(CONFIG) [$(DEFINESET)]" ;
		}

		# gather coverage after tests run
		Depends $(TESTS)_coverage : $(TESTS)_run ;
	}
}