| # 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 |
| } |
| } |
| |