178 lines
5.1 KiB
Python
178 lines
5.1 KiB
Python
|
#!/usr/bin/python
|
||
|
|
||
|
# Copyright 2005 David Abrahams
|
||
|
# Copyright 2008, 2012 Jurko Gospodnetic
|
||
|
# Distributed under the Boost Software License, Version 1.0.
|
||
|
# (See accompanying file LICENSE.txt or copy at
|
||
|
# https://www.bfgroup.xyz/b2/LICENSE.txt)
|
||
|
|
||
|
# Tests the build step timing facilities.
|
||
|
|
||
|
# TODO: Missing tests:
|
||
|
# 1. 'time' target with a source target representing more than one virtual
|
||
|
# target. This happens in practice, e.g. when using the time rule on a msvc
|
||
|
# exe target whose generator actually constructs an EXE and a PDB target.
|
||
|
# When this is done - only the main virtual target's constructing action
|
||
|
# should be timed.
|
||
|
# 2. 'time' target with a source target representing a virtual target that
|
||
|
# actually gets built by multiple actions run in sequence. In that case a
|
||
|
# separate timing result should be reported for each of those actions. This
|
||
|
# happens in practice, e.g. when using the time rule on a msvc exe target
|
||
|
# which first gets created as a result of some link action and then its
|
||
|
# manifest gets embedded inside it as a resource using a separate action
|
||
|
# (assuming an appropriate property has been set for this target - see the
|
||
|
# msvc module for details).
|
||
|
|
||
|
import BoostBuild
|
||
|
import re
|
||
|
|
||
|
|
||
|
###############################################################################
|
||
|
#
|
||
|
# basic_jam_action_test()
|
||
|
# -----------------------
|
||
|
#
|
||
|
###############################################################################
|
||
|
|
||
|
def basic_jam_action_test():
|
||
|
"""Tests basic Jam action timing support."""
|
||
|
|
||
|
t = BoostBuild.Tester(pass_toolset=0)
|
||
|
|
||
|
t.write("file.jam", """\
|
||
|
rule time
|
||
|
{
|
||
|
DEPENDS $(<) : $(>) ;
|
||
|
__TIMING_RULE__ on $(>) = record_time $(<) ;
|
||
|
DEPENDS all : $(<) ;
|
||
|
}
|
||
|
|
||
|
actions time
|
||
|
{
|
||
|
echo $(>) user: $(__USER_TIME__) system: $(__SYSTEM_TIME__) clock: $(__CLOCK_TIME__)
|
||
|
echo timed from $(>) >> $(<)
|
||
|
}
|
||
|
|
||
|
rule record_time ( target : source : start end user system clock )
|
||
|
{
|
||
|
__USER_TIME__ on $(target) = $(user) ;
|
||
|
__SYSTEM_TIME__ on $(target) = $(system) ;
|
||
|
__CLOCK_TIME__ on $(target) = $(clock) ;
|
||
|
}
|
||
|
|
||
|
rule make
|
||
|
{
|
||
|
DEPENDS $(<) : $(>) ;
|
||
|
}
|
||
|
|
||
|
actions make
|
||
|
{
|
||
|
echo made from $(>) >> $(<)
|
||
|
}
|
||
|
|
||
|
time foo : bar ;
|
||
|
make bar : baz ;
|
||
|
""")
|
||
|
|
||
|
t.write("baz", "nothing")
|
||
|
|
||
|
expected_output = """\
|
||
|
\.\.\.found 4 targets\.\.\.
|
||
|
\.\.\.updating 2 targets\.\.\.
|
||
|
make bar
|
||
|
time foo
|
||
|
bar +user: [0-9\.]+ +system: +[0-9\.]+ +clock: +[0-9\.]+ *
|
||
|
\.\.\.updated 2 targets\.\.\.$
|
||
|
"""
|
||
|
|
||
|
t.run_build_system(["-ffile.jam", "-d+1"], stdout=expected_output,
|
||
|
match=lambda actual, expected: re.search(expected, actual, re.DOTALL))
|
||
|
t.expect_addition("foo")
|
||
|
t.expect_addition("bar")
|
||
|
t.expect_nothing_more()
|
||
|
|
||
|
t.cleanup()
|
||
|
|
||
|
|
||
|
###############################################################################
|
||
|
#
|
||
|
# boost_build_testing_support_timing_rule():
|
||
|
# ------------------------------------------
|
||
|
#
|
||
|
###############################################################################
|
||
|
|
||
|
def boost_build_testing_support_timing_rule():
|
||
|
"""
|
||
|
Tests the target build timing rule provided by the Boost Build testing
|
||
|
support system.
|
||
|
|
||
|
"""
|
||
|
t = BoostBuild.Tester(use_test_config=False)
|
||
|
|
||
|
t.write("aaa.cpp", "int main() {}\n")
|
||
|
|
||
|
t.write("jamroot.jam", """\
|
||
|
import testing ;
|
||
|
exe my-exe : aaa.cpp ;
|
||
|
time my-time : my-exe ;
|
||
|
""")
|
||
|
|
||
|
t.run_build_system()
|
||
|
t.expect_addition("bin/$toolset/debug*/aaa.obj")
|
||
|
t.expect_addition("bin/$toolset/debug*/my-exe.exe")
|
||
|
t.expect_addition("bin/$toolset/debug*/my-time.time")
|
||
|
|
||
|
t.expect_content_lines("bin/$toolset/debug*/my-time.time",
|
||
|
"user: *[0-9] seconds")
|
||
|
t.expect_content_lines("bin/$toolset/debug*/my-time.time",
|
||
|
"system: *[0-9] seconds")
|
||
|
t.expect_content_lines("bin/$toolset/debug*/my-time.time",
|
||
|
"clock: *[0-9] seconds")
|
||
|
|
||
|
t.cleanup()
|
||
|
|
||
|
|
||
|
###############################################################################
|
||
|
#
|
||
|
# boost_build_testing_support_timing_rule_with_spaces_in_names()
|
||
|
# --------------------------------------------------------------
|
||
|
#
|
||
|
###############################################################################
|
||
|
|
||
|
def boost_build_testing_support_timing_rule_with_spaces_in_names():
|
||
|
"""
|
||
|
Tests the target build timing rule provided by the Boost Build testing
|
||
|
support system when used with targets contining spaces in their names.
|
||
|
|
||
|
"""
|
||
|
t = BoostBuild.Tester(use_test_config=False)
|
||
|
|
||
|
t.write("aaa bbb.cpp", "int main() {}\n")
|
||
|
|
||
|
t.write("jamroot.jam", """\
|
||
|
import testing ;
|
||
|
exe "my exe" : "aaa bbb.cpp" ;
|
||
|
time "my time" : "my exe" ;
|
||
|
""")
|
||
|
|
||
|
t.run_build_system()
|
||
|
t.expect_addition("bin/$toolset/debug*/aaa bbb.obj")
|
||
|
t.expect_addition("bin/$toolset/debug*/my exe.exe")
|
||
|
t.expect_addition("bin/$toolset/debug*/my time.time")
|
||
|
|
||
|
t.expect_content_lines("bin/$toolset/debug*/my time.time", "user: *")
|
||
|
t.expect_content_lines("bin/$toolset/debug*/my time.time", "system: *")
|
||
|
|
||
|
t.cleanup()
|
||
|
|
||
|
|
||
|
###############################################################################
|
||
|
#
|
||
|
# main()
|
||
|
# ------
|
||
|
#
|
||
|
###############################################################################
|
||
|
|
||
|
basic_jam_action_test()
|
||
|
boost_build_testing_support_timing_rule()
|
||
|
boost_build_testing_support_timing_rule_with_spaces_in_names()
|