e5d385d390
* property-set now considers <conditional> to be conditional * property.evaluate-conditionals-in-context now handles indirect conditionals as well. This is the correct behavior for all places where evaluate-conditionals-in-context is currently used. * Indirect conditionals now translate paths relative to the project in which they were defined, not relative to the current project. * usage-requirements no longer use targets.evaluate-requirements, as the iterative algorithm is completely unnecessary (It's also wrong, since the new features shouldn't be applied to the evaluation context). * indirect conditionals are removed from the property set when they are evaluated, just list regular conditionals. (This is a consequence of passing them through evaluate-conditionals-in-context) * This also allows non-free features in usage-requirements to "work" again (for some definition of work).
164 lines
4.1 KiB
Python
164 lines
4.1 KiB
Python
#!/usr/bin/python
|
|
|
|
# Copyright 2003 Dave Abrahams
|
|
# Copyright 2002, 2003, 2004 Vladimir Prus
|
|
# Distributed under the Boost Software License, Version 1.0.
|
|
# (See accompanying file LICENSE_1_0.txt or copy at
|
|
# http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
import BoostBuild
|
|
|
|
def test_basic():
|
|
t = BoostBuild.Tester(use_test_config=False)
|
|
|
|
t.write("jamroot.jam", "lib a : a.cpp : <include>. ;")
|
|
t.write("a.cpp", """\
|
|
#include <a.h>
|
|
void
|
|
# ifdef _WIN32
|
|
__declspec(dllexport)
|
|
# endif
|
|
foo() {}
|
|
""")
|
|
t.write("a.h", "//empty file\n")
|
|
t.write("d/jamfile.jam", "exe b : b.cpp ..//a ;")
|
|
t.write("d/b.cpp", """\
|
|
void foo();
|
|
int main() { foo(); }
|
|
""")
|
|
t.run_build_system(subdir="d")
|
|
|
|
# Path features with condition.
|
|
t.write("jamroot.jam", "lib a : a.cpp : <variant>debug:<include>. ;")
|
|
t.rm("bin")
|
|
t.run_build_system(subdir="d")
|
|
|
|
|
|
# Path features with condition in usage requirements.
|
|
t.write("jamroot.jam", """\
|
|
lib a : a.cpp : <include>. : : <variant>debug:<include>. ;
|
|
""")
|
|
t.write("d/b.cpp", """\
|
|
#include <a.h>
|
|
void foo();
|
|
int main() { foo(); }
|
|
""")
|
|
t.rm("d/bin")
|
|
t.run_build_system(subdir="d")
|
|
|
|
t.cleanup()
|
|
|
|
|
|
def test_absolute_paths():
|
|
"""
|
|
Test that absolute paths inside requirements are ok. The problems
|
|
appeared only when building targets in subprojects.
|
|
|
|
"""
|
|
t = BoostBuild.Tester(use_test_config=False)
|
|
|
|
t.write("jamroot.jam", "build-project x ;")
|
|
t.write("x/jamfile.jam", """\
|
|
local pwd = [ PWD ] ;
|
|
project : requirements <include>$(pwd)/x/include ;
|
|
exe m : m.cpp : <include>$(pwd)/x/include2 ;
|
|
""")
|
|
t.write("x/m.cpp", """\
|
|
#include <h1.hpp>
|
|
#include <h2.hpp>
|
|
int main() {}
|
|
""")
|
|
t.write("x/include/h1.hpp", "\n")
|
|
t.write("x/include2/h2.hpp", "\n")
|
|
|
|
t.run_build_system()
|
|
t.expect_addition("x/bin/$toolset/debug*/m.exe")
|
|
|
|
t.cleanup()
|
|
|
|
|
|
def test_ordered_paths():
|
|
"""Test that "&&" in path features is handled correctly."""
|
|
|
|
t = BoostBuild.Tester(use_test_config=False)
|
|
|
|
t.write("jamroot.jam", "build-project sub ;")
|
|
t.write("sub/jamfile.jam", "exe a : a.cpp : <include>../h1&&../h2 ;")
|
|
t.write("sub/a.cpp", """\
|
|
#include <header.h>
|
|
int main() { return OK; }
|
|
""")
|
|
t.write("h2/header.h", "int const OK = 0;\n")
|
|
t.run_build_system()
|
|
t.expect_addition("sub/bin/$toolset/debug*/a.exe")
|
|
|
|
t.cleanup()
|
|
|
|
|
|
def test_paths_set_by_indirect_conditionals():
|
|
t = BoostBuild.Tester(use_test_config=False)
|
|
|
|
header = "child_dir/folder_to_include/some_header.h"
|
|
|
|
t.write("jamroot.jam", """
|
|
build-project child_dir ;
|
|
rule attach-include-parent ( properties * )
|
|
{
|
|
return <include>another_folder ;
|
|
}
|
|
# requirements inherited from a parent project will bind paths
|
|
# relative to the project that actually names the rule.
|
|
project : requirements <conditional>@attach-include-parent ;
|
|
""")
|
|
t.write("child_dir/jamfile.jam", """\
|
|
import remote/remote ;
|
|
|
|
# If we set the <include>folder_to_include property directly, it will work
|
|
obj x1 : x.cpp : <conditional>@attach-include-local ;
|
|
obj x2 : x.cpp : <conditional>@remote.attach-include-remote ;
|
|
|
|
rule attach-include-local ( properties * )
|
|
{
|
|
return <include>folder_to_include ;
|
|
}
|
|
""")
|
|
t.write("child_dir/remote/remote.jam", """\
|
|
rule attach-include-remote ( properties * )
|
|
{
|
|
return <include>folder_to_include ;
|
|
}
|
|
""")
|
|
t.write("child_dir/x.cpp", """\
|
|
#include <some_header.h>
|
|
#include <header2.h>
|
|
int main() {}
|
|
""")
|
|
t.write(header, "int some_func();\n")
|
|
t.write("another_folder/header2.h", "int f2();\n")
|
|
t.write("child_dir/folder_to_include/jamfile.jam", "")
|
|
|
|
expected_x1 = "child_dir/bin/$toolset/debug*/x1.obj"
|
|
expected_x2 = "child_dir/bin/$toolset/debug*/x2.obj"
|
|
|
|
t.run_build_system()
|
|
t.expect_addition(expected_x1)
|
|
t.expect_addition(expected_x2)
|
|
|
|
t.touch(header)
|
|
t.run_build_system(subdir="child_dir")
|
|
t.expect_touch(expected_x1)
|
|
t.expect_touch(expected_x2)
|
|
|
|
t.touch(header)
|
|
t.run_build_system([".."], subdir="child_dir/folder_to_include")
|
|
t.expect_touch(expected_x1)
|
|
t.expect_touch(expected_x2)
|
|
|
|
t.cleanup()
|
|
|
|
|
|
test_basic()
|
|
test_absolute_paths()
|
|
test_ordered_paths()
|
|
test_paths_set_by_indirect_conditionals()
|