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