diff options
Diffstat (limited to 'tools/build/v2/test/recursive.jam')
-rw-r--r-- | tools/build/v2/test/recursive.jam | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/tools/build/v2/test/recursive.jam b/tools/build/v2/test/recursive.jam new file mode 100644 index 0000000000..8087f7da75 --- /dev/null +++ b/tools/build/v2/test/recursive.jam @@ -0,0 +1,117 @@ +# 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 + } +} + |