blob: 8087f7da75d32b8e04ef98f23361afba9c1e515e [file] [log] [blame]
# Copyright 2001, 2002 Dave Abrahams
# Copyright 2005 Rene Rivera
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
##############################################################
# Rules and actions that test Jam by invoking it recursively #
# #
# This is necessary for testing anything that requires Jam #
# to execute build actions whose results must be checked, #
# and anything which exits Jam with a failure code (e.g. a #
# failed assertion). #
##############################################################
# Creates a fake target, always built, which succeeds in building if Invoking a
# Jamfile containing the given string succeeds. If optional-expected-output is
# supplied, creates another fake target which succeeds in building if
# optional-expected-output is in the Jam output.
#
# RETURNS: the target name of the Jam command.
rule Jam ( command : expected-output ? )
{
local jam-cmd = "$(command:G=jam_command)" ;
NOTFILE "$(jam-cmd)" ;
ALWAYS "$(jam-cmd)" ;
DEPENDS all : "$(jam-cmd)" ;
if ($NT)
{
redirect on $(jam-cmd) = "nul" ;
}
else if $(UNIX)
{
redirect on $(jam-cmd) = "/dev/null" ;
}
if $(VERBOSE)
{
redirect on $(jam-cmd) = ;
}
invoke-Jam "$(jam-cmd)" ;
if $(expected-output)
{
redirect on $(jam-cmd) = "scratch-output.txt" ;
local output-target = "$(expected-output:G=$(command))" ;
NOTFILE "$(output-target)" ;
ALWAYS "$(output-target)" ;
DEPENDS all : "$(output-target)" ;
Expect-in-output "$(output-target)" ;
if $(VERBOSE)
{
if $(NT) { VERBOSE on $(output-target) = "type " ; }
else { VERBOSE on $(output-target) = "cat " ; }
}
}
return $(jam-cmd) ;
}
# Just like the "Jam" rule, above, but only succeeds if the Jam command /fails/.
rule Jam-fail ( command : expected-output ? )
{
local target = [ Jam $(command) : $(expected-output) ] ;
FAIL_EXPECTED $(target) ;
return $(target) ;
}
# The temporary jamfile we write is called "temp.jam". If the user has set
# BOOST_BUILD_ROOT, it will be built there.
gBOOST_TEST_JAMFILE = temp.jam ;
LOCATE on gBOOST_TEST_JAMFILE ?= $(BOOST_BUILD_ROOT) ;
# Runs Jam on a temporary Jamfile which contains the string in $(command:G=)
# and redirects the results into a file whose name is given by $(redirect) on
# command
rule invoke-Jam ( command )
{
PREFIX on $(command) = "actions unbuilt { } unbuilt all ;" ;
if $(NT)
{
REMOVE on $(command) = $(SystemRoot)\System32\find ;
}
REMOVE on $(command) ?= rm ;
}
actions invoke-Jam
{
echo $(PREFIX) $(<:G=) > $(gBOOST_TEST_JAMFILE)
jam -sBOOST_ROOT=../../.. -sJAMFILE=$(gBOOST_TEST_JAMFILE) $(JAMARGS) >$(redirect)
}
# $(REMOVE) $(gBOOST_TEST_JAMFILE)
# These actions expect to find the ungristed part of $(<) in scratch-output.txt
# and return a nonzero exit code otherwise
if $(NT)
{
# Explicitly get the NT find command in case someone has another find in their path.
actions quietly Expect-in-output
{
$(VERBOSE)scratch-output.txt ;
$(SystemRoot)\System32\find /C "$(<:G=)" scratch-output.txt >nul
}
}
else
{
# Not really the right actions for Unix; the argument will be interpreted as
# a regular expression. Is there a simpler find?
actions quietly Expect-in-output
{
$(VERBOSE)scratch-output.txt;
grep "$(<:G=)" scratch-output.txt
}
}