mirror of
https://github.com/boostorg/build.git
synced 2026-02-15 13:02:11 +00:00
Added a new internal Boost Build test illustrating a bug in the current Boost Build/Jam implementation and causing targets to be rebuilt when not necessary in some cases.
[SVN r79599]
This commit is contained in:
84
v2/test/scanner_causing_rebuilds.py
Executable file
84
v2/test/scanner_causing_rebuilds.py
Executable file
@@ -0,0 +1,84 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
# Copyright 2012 Jurko Gospodnetic
|
||||
# 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)
|
||||
|
||||
# Tests for a bug causing Boost Build's scanner targets to be rebuilt.
|
||||
# unnecessarily in the following scenario:
|
||||
# * We want to build target X requiring target A.
|
||||
# * We have a multi-file action generating targets A & B.
|
||||
# * Out action generates target B with a more recent timestamp than target A.
|
||||
# * Target A includes target B.
|
||||
# * Target A has a registered include scanner.
|
||||
# Now even if our targets A & B have already been built and are up-to-date
|
||||
# (e.g. in a state left by a previous successful build run), our scanner target
|
||||
# tasked with scanning target A will be marked for updating, thus causing any
|
||||
# targets depending on it to be updated/rebuilt as well.
|
||||
|
||||
import BoostBuild
|
||||
|
||||
t = BoostBuild.Tester()
|
||||
|
||||
t.write("foo.jam", r"""
|
||||
import common ;
|
||||
import generators ;
|
||||
import modules ;
|
||||
import type ;
|
||||
import types/cpp ;
|
||||
|
||||
type.register FOO : foo ;
|
||||
type.register BAR : bar ;
|
||||
generators.register-standard foo.foo : FOO : CPP BAR ;
|
||||
|
||||
local rule sleep-cmd ( delay )
|
||||
{
|
||||
if [ modules.peek : NT ]
|
||||
{
|
||||
return ping 127.0.0.1 -n $(delay) -w 1000 >NUL ;
|
||||
}
|
||||
else
|
||||
{
|
||||
return sleep $(delay) ;
|
||||
}
|
||||
}
|
||||
|
||||
.touch = [ common.file-creation-command ] ;
|
||||
.sleep = [ sleep-cmd 2 ] ;
|
||||
|
||||
rule foo ( cpp bar : foo : properties * )
|
||||
{
|
||||
# We add the INCLUDE relationship between our generated CPP & BAR targets
|
||||
# explicitly instead of relying on Boost Jam's internal implementation
|
||||
# detail - automatically adding such relationships between all files
|
||||
# generated by the same action. This way our test will continue to function
|
||||
# correctly even if the related Boost Jam implementation detail changes.
|
||||
# Note that adding this relationship by adding an #include directive in our
|
||||
# generated CPP file is not good enough as such a relationship would get
|
||||
# added only after the scanner target's relationships have already been
|
||||
# established and they (as affected by our initial INCLUDE relationship) are
|
||||
# the original reason for this test failing.
|
||||
INCLUDES $(cpp) : $(bar) ;
|
||||
}
|
||||
|
||||
actions foo
|
||||
{
|
||||
$(.touch) "$(<[1])"
|
||||
$(.sleep)
|
||||
$(.touch) "$(<[2])"
|
||||
}
|
||||
""")
|
||||
t.write("x.foo", "")
|
||||
t.write("jamroot.jam", """\
|
||||
import foo ;
|
||||
lib x : x.foo : <link>static ;
|
||||
""")
|
||||
|
||||
|
||||
# Get everything built once.
|
||||
t.run_build_system()
|
||||
|
||||
# Simply rerunning the build without touching any of its source target files
|
||||
# should not cause any files to be affected.
|
||||
t.run_build_system()
|
||||
t.expect_nothing_more()
|
||||
@@ -243,6 +243,7 @@ tests = ["absolute_sources",
|
||||
"remove_requirement",
|
||||
"rescan_header",
|
||||
"resolution",
|
||||
"scanner_causing_rebuilds",
|
||||
"searched_lib",
|
||||
"skipping",
|
||||
"sort_rule",
|
||||
|
||||
Reference in New Issue
Block a user