#!/usr/bin/python # Copyright 2003 Dave Abrahams # Copyright 2002, 2003, 2004, 2005, 2006 Vladimir Prus # 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) # Test staging. import BoostBuild t = BoostBuild.Tester() t.write("jamroot.jam", "import gcc ;") t.write("jamfile.jam", """ lib a : a.cpp ; stage dist : a a.h auxilliary/1 ; """) t.write( "a.cpp", """ int #ifdef _WIN32 __declspec(dllexport) #endif must_export_something; """) t.write("a.h", "") t.write("auxilliary/1", "") t.run_build_system() t.expect_addition(["dist/a.dll", "dist/a.h", "dist/1"]) # Regression test: the following was causing the "duplicate target name" error. t.write("jamfile.jam", """ project : requirements true ; lib a : a.cpp ; stage dist : a a.h auxilliary/1 ; alias dist-alias : dist ; """) t.run_build_system() # Test the property. t.write("jamfile.jam", """ lib a : a.cpp ; stage dist : a : debug:ds release:rs ; """) t.run_build_system() t.expect_addition("ds/a.dll") t.run_build_system("release") t.expect_addition("rs/a.dll") # Test the property in subprojects. Thanks to Kirill Lapshin for the # bug report. t.write("jamroot.jam", """ path-constant DIST : dist ; """) t.write("jamfile.jam", "build-project d ;") t.write("d/jamfile.jam", """ exe a : a.cpp ; stage dist : a : $(DIST) ; """) t.write("d/a.cpp", "int main() {}\n") t.run_build_system() t.expect_addition("dist/a.exe") t.rm("dist") # Workaround a BIG BUG: the response file is not deleted, even if application # *is* deleted. We will try to use the same response file when building from # subdir, with very bad results. t.rm("d/bin") t.run_build_system(subdir="d") t.expect_addition("dist/a.exe") # Check that 'stage' does not incorrectly reset target suffixes. t.write("a.cpp", """ int main() {} """) t.write("jamroot.jam", """ import type ; type.register MYEXE : : EXE ; type.set-generated-target-suffix MYEXE : off : myexe ; """) # Since off is in properties when 'a' is built, and staged, its # suffix should be "myexe". t.write("jamfile.jam", """ stage dist : a ; myexe a : a.cpp ; """) t.run_build_system() t.expect_addition("dist/a.myexe") # Test 'stage's ability to traverse dependencies. t.write("a.cpp", """ int main() {} """) t.write("l.cpp", """ void #if defined(_WIN32) __declspec(dllexport) #endif foo() {} """) t.write("jamfile.jam", """ lib l : l.cpp ; exe a : a.cpp l ; stage dist : a : on EXE LIB ; """) t.write("jamroot.jam", "") t.rm("dist") t.run_build_system() t.expect_addition("dist/a.exe") t.expect_addition("dist/l.dll") # Check that properties are ignored the traversing target for staging. t.copy("l.cpp", "l2.cpp") t.copy("l.cpp", "l3.cpp") t.write("jamfile.jam", """ lib l2 : l2.cpp ; lib l3 : l3.cpp ; lib l : l.cpp : l2 l3 ; exe a : a.cpp l ; stage dist : a : on EXE LIB ; """) t.rm("dist") t.run_build_system() t.expect_addition("dist/l3.dll") t.expect_nothing("dist/l2.dll") # Check if on 'stage' works. t.rm(".") t.write("jamroot.jam", """ stage a1 : a1.txt : dist ; stage a2 : a2.txt : dist a1 ; """) t.write("a1.txt", "") t.write("a2.txt", "") t.run_build_system("a2") t.expect_addition(["dist/a1.txt", "dist/a2.txt"]) # Regression test: check that . works. t.rm(".") t.write("jamroot.jam", """ stage a1 : d/a1.txt : . ; """) t.write("d/a1.txt", "") t.run_build_system() t.expect_addition("a1.txt") # Test that relative paths of sources can be preserved. t.rm(".") t.write("jamroot.jam", """ install dist : a/b/c.h : . ; """) t.write("a/b/c.h", "") t.run_build_system() t.expect_addition("dist/a/b/c.h") t.write("jamroot.jam", """ install dist : a/b/c.h : a ; """) t.write("a/b/c.h", "") t.run_build_system() t.expect_addition("dist/b/c.h") t.rm(".") t.write("build/jamroot.jam", """ install dist : ../a/b/c.h : ../dist ../a ; """) t.write("a/b/c.h", "") t.run_build_system(subdir="build") t.expect_addition("dist/b/c.h") t.write("jamroot.jam", """ install dist2 : a/b/c.h : a ; """) t.write("a/b/c.h", "") t.write("sub/jamfile.jam", """ alias h : ..//dist2 ; """) t.run_build_system(subdir="sub") t.expect_addition("dist2/b/c.h") # Test that when installing .cpp files, we do not scan include dependencies. t.rm(".") t.write("jamroot.jam", """ install dist : a.cpp ; """) t.write("a.cpp", """ #include "a.h" """) t.write("a.h", "") t.run_build_system() t.expect_addition("dist/a.cpp") t.touch("a.h") t.run_build_system() t.expect_nothing("dist/a.cpp") # Test that property works, when there is just one file in sources. t.rm(".") t.write("jamroot.jam", """ install dist : a.cpp : b.cpp ; """) t.write("a.cpp", "test file") t.run_build_system() t.expect_addition("dist/b.cpp") t.cleanup()