2
0
mirror of https://github.com/boostorg/build.git synced 2026-02-10 23:32:20 +00:00
Files
build/test/stage.py
Jurko Gospodnetić 343b4d6532 Updated the internal Boost Build testing system to use the Python subprocess module (introduced in Python 2.4) for running external processes instead of popen2 (deprecated since Python 2.6). We are already using Python 2.4 features in this codebase so there is no need to support Python releases older than 2.4.
Related changes:
  * BoostBuild.Tester & TestCmd.TestCmd interfaces now accept external process parameters as a list of strings, thus avoiding problems with parsing arguments containing spaces.
  * Avoided a potential process hang in case an external process being run prints out enough output to fill up the OS's pipe buffer (OS would pause the process until someone read the data from the pipe but the testing framework would not do this until the process in question had terminated).

[SVN r79448]
2012-07-12 12:55:25 +00:00

208 lines
4.9 KiB
Python

#!/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", "")
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 a "duplicate target name" error.
t.write("jamfile.jam", """\
project : requirements <hardcode-dll-paths>true ;
lib a : a.cpp ;
stage dist : a a.h auxilliary/1 ;
alias dist-alias : dist ;
""")
t.run_build_system()
# Test the <location> property.
t.write("jamfile.jam", """\
lib a : a.cpp ;
stage dist : a : <variant>debug:<location>ds <variant>release:<location>rs ;
""")
t.run_build_system()
t.expect_addition("ds/a.dll")
t.run_build_system(["release"])
t.expect_addition("rs/a.dll")
# Test the <location> 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 : <location>$(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() {}\n")
t.write("jamroot.jam", """\
import type ;
type.register MYEXE : : EXE ;
type.set-generated-target-suffix MYEXE : <optimization>off : myexe ;
""")
# Since <optimization>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() {}\n")
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 : <install-dependencies>on <install-type>EXE <install-type>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 <use> 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 : <use>l2 <dependency>l3 ;
exe a : a.cpp l ;
stage dist : a : <install-dependencies>on <install-type>EXE <install-type>LIB ;
""")
t.rm("dist")
t.run_build_system()
t.expect_addition("dist/l3.dll")
t.expect_nothing("dist/l2.dll")
# Check if <dependency> on 'stage' works.
t.rm(".")
t.write("jamroot.jam", """\
stage a1 : a1.txt : <location>dist ;
stage a2 : a2.txt : <location>dist <dependency>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 <location>. works.
t.rm(".")
t.write("jamroot.jam", "stage a1 : d/a1.txt : <location>. ;")
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 : <install-source-root>. ;")
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 : <install-source-root>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 : <location>../dist <install-source-root>../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 : <install-source-root>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 <name> property works, when there is just one file in sources.
t.rm(".")
t.write("jamroot.jam", "install dist : a.cpp : <name>b.cpp ;")
t.write("a.cpp", "test file")
t.run_build_system()
t.expect_addition("dist/b.cpp")
t.cleanup()