#!/usr/bin/python # Copyright 2012 Steven Watanabe # 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) import BoostBuild t = BoostBuild.Tester(use_test_config=False) # Test a header loop that depends on (but does not contain) a generated header. t.write("test.cpp", '#include "header1.h"\n') t.write("header1.h", """\ #ifndef HEADER1_H #define HEADER1_H #include "header2.h" #endif """) t.write("header2.h", """\ #ifndef HEADER2_H #define HEADER2_H #include "header1.h" #include "header3.h" #endif """) t.write("header3.in", "/* empty file */\n") t.write("jamroot.jam", """\ import common ; make header3.h : header3.in : @common.copy ; obj test : test.cpp : header3.h ; """) t.run_build_system(["-j2"]) t.expect_addition("bin/$toolset/debug/header3.h") t.expect_addition("bin/$toolset/debug/test.obj") t.expect_nothing_more() t.rm(".") # Test a linear sequence of generated headers. t.write("test.cpp", '#include "header1.h"\n') t.write("header1.in", """\ #ifndef HEADER1_H #define HEADER1_H #include "header2.h" #endif """) t.write("header2.in", """\ #ifndef HEADER2_H #define HEADER2_H #include "header3.h" #endif """) t.write("header3.in", "/* empty file */\n") t.write("jamroot.jam", """\ import common ; make header1.h : header1.in : @common.copy ; make header2.h : header2.in : @common.copy ; make header3.h : header3.in : @common.copy ; obj test : test.cpp : header1.h header2.h header3.h ; """) t.run_build_system(["-j2", "test"]) t.expect_addition("bin/$toolset/debug/header1.h") t.expect_addition("bin/$toolset/debug/header2.h") t.expect_addition("bin/$toolset/debug/header3.h") t.expect_addition("bin/$toolset/debug/test.obj") t.expect_nothing_more() t.rm(".") # Test a loop in generated headers. t.write("test.cpp", '#include "header1.h"\n') t.write("header1.in", """\ #ifndef HEADER1_H #define HEADER1_H #include "header2.h" #endif """) t.write("header2.in", """\ #ifndef HEADER2_H #define HEADER2_H #include "header3.h" #endif """) t.write("header3.in", """\ #ifndef HEADER2_H #define HEADER2_H #include "header1.h" #endif """) t.write("jamroot.jam", """\ import common ; actions copy { sleep 1 cp $(>) $(<) } make header1.h : header1.in : @common.copy ; make header2.h : header2.in : @common.copy ; make header3.h : header3.in : @common.copy ; obj test : test.cpp : header1.h header2.h header3.h ; """) t.run_build_system(["-j2", "test"]) t.expect_addition("bin/$toolset/debug/header1.h") t.expect_addition("bin/$toolset/debug/header2.h") t.expect_addition("bin/$toolset/debug/header3.h") t.expect_addition("bin/$toolset/debug/test.obj") t.expect_nothing_more() t.rm(".") # Test that all the dependencies of a loop are updated before any of the # dependents. t.write("test1.cpp", '#include "header1.h"\n') t.write("test2.cpp", """\ #include "header2.h" int main() {} """) t.write("header1.h", """\ #ifndef HEADER1_H #define HEADER1_H #include "header2.h" #endif """) t.write("header2.h", """\ #ifndef HEADER2_H #define HEADER2_H #include "header1.h" #include "header3.h" #endif """) t.write("header3.in", "\n") t.write("sleep.bat", """\ ::@timeout /T %1 /NOBREAK >nul @ping 127.0.0.1 -n 2 -w 1000 >nul @ping 127.0.0.1 -n %1 -w 1000 >nul @exit /B 0 """) t.write("jamroot.jam", """\ import common ; import os ; if [ os.name ] = NT { SLEEP = call sleep.bat ; } else { SLEEP = sleep ; } rule copy { common.copy $(<) : $(>) ; } actions copy { $(SLEEP) 1 } make header3.h : header3.in : @copy ; exe test : test2.cpp test1.cpp : header3.h ; """) t.run_build_system(["-j2", "test"]) t.expect_addition("bin/$toolset/debug/header3.h") t.expect_addition("bin/$toolset/debug/test1.obj") t.expect_addition("bin/$toolset/debug/test2.obj") t.expect_addition("bin/$toolset/debug/test.exe") t.expect_nothing_more() t.touch("header3.in") t.run_build_system(["-j2", "test"]) t.expect_touch("bin/$toolset/debug/header3.h") t.expect_touch("bin/$toolset/debug/test1.obj") t.expect_touch("bin/$toolset/debug/test2.obj") t.expect_touch("bin/$toolset/debug/test.exe") t.expect_nothing_more() t.rm(".") # Test a loop that includes a generated header t.write("test1.cpp", '#include "header1.h"\n') t.write("test2.cpp", """\ #include "header2.h" int main() {} """) t.write("header1.h", """\ #ifndef HEADER1_H #define HEADER1_H #include "header2.h" #endif """) t.write("header2.in", """\ #ifndef HEADER2_H #define HEADER2_H #include "header3.h" #endif """) t.write("header3.h", """\ #ifndef HEADER3_H #define HEADER3_H #include "header1.h" #endif """) t.write("sleep.bat", """\ ::@timeout /T %1 /NOBREAK >nul @ping 127.0.0.1 -n 2 -w 1000 >nul @ping 127.0.0.1 -n %1 -w 1000 >nul @exit /B 0 """) t.write("jamroot.jam", """\ import common ; import os ; if [ os.name ] = NT { SLEEP = call sleep.bat ; } else { SLEEP = sleep ; } rule copy { common.copy $(<) : $(>) ; } actions copy { $(SLEEP) 1 } make header2.h : header2.in : @copy ; exe test : test2.cpp test1.cpp : header2.h . ; """) t.run_build_system(["-j2", "test"]) t.expect_addition("bin/$toolset/debug/header2.h") t.expect_addition("bin/$toolset/debug/test1.obj") t.expect_addition("bin/$toolset/debug/test2.obj") t.expect_addition("bin/$toolset/debug/test.exe") t.expect_nothing_more() t.cleanup()