diff options
Diffstat (limited to '')
-rw-r--r-- | src/boost/tools/build/test/path_features.py | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/src/boost/tools/build/test/path_features.py b/src/boost/tools/build/test/path_features.py new file mode 100644 index 000000000..59af7fd8a --- /dev/null +++ b/src/boost/tools/build/test/path_features.py @@ -0,0 +1,163 @@ +#!/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.txt or copy at +# https://www.bfgroup.xyz/b2/LICENSE.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() |