]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/tools/build/test/indirect_conditional.py
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / tools / build / test / indirect_conditional.py
1 #!/usr/bin/python
2
3 # Copyright (C) 2006. Vladimir Prus
4 # Distributed under the Boost Software License, Version 1.0.
5 # (See accompanying file LICENSE_1_0.txt or copy at
6 # http://www.boost.org/LICENSE_1_0.txt)
7
8 import BoostBuild
9
10 def test_basic():
11 t = BoostBuild.Tester(use_test_config=False)
12
13 t.write("jamroot.jam", """\
14 exe a1 : a1.cpp : <conditional>@a1-rule ;
15 rule a1-rule ( properties * )
16 {
17 if <variant>debug in $(properties)
18 {
19 return <define>OK ;
20 }
21 }
22
23 exe a2 : a2.cpp : <conditional>@$(__name__).a2-rule
24 <variant>debug:<optimization>speed ;
25 rule a2-rule ( properties * )
26 {
27 if <optimization>speed in $(properties)
28 {
29 return <define>OK ;
30 }
31 }
32
33 exe a3 : a3.cpp :
34 <conditional>@$(__name__).a3-rule-1
35 <conditional>@$(__name__).a3-rule-2 ;
36 rule a3-rule-1 ( properties * )
37 {
38 if <optimization>speed in $(properties)
39 {
40 return <define>OK ;
41 }
42 }
43 rule a3-rule-2 ( properties * )
44 {
45 if <variant>debug in $(properties)
46 {
47 return <optimization>speed ;
48 }
49 }
50 """)
51
52 t.write("a1.cpp", "#ifdef OK\nint main() {}\n#endif\n")
53 t.write("a2.cpp", "#ifdef OK\nint main() {}\n#endif\n")
54 t.write("a3.cpp", "#ifdef OK\nint main() {}\n#endif\n")
55
56 t.run_build_system()
57
58 t.expect_addition("bin/$toolset/debug*/a1.exe")
59 t.expect_addition("bin/$toolset/debug/optimization-speed*/a2.exe")
60 t.expect_addition("bin/$toolset/debug/optimization-speed*/a3.exe")
61
62 t.cleanup()
63
64 def test_inherit():
65 """Tests that paths etc. are handled correctly when an indirect
66 conditional is inherited by a subproject."""
67 t = BoostBuild.Tester(use_test_config=False)
68 t.write("Jamroot.jam", """
69 import feature ;
70 import indirect ;
71 exe d1 : d1.cpp ;
72 explicit d1 ;
73 project : requirements <conditional>@c1 ;
74 build-project subdir ;
75 feature.feature myrule : : free ;
76 rule c1 ( properties * )
77 {
78 return <dependency>d1 <include>include <myrule>@parent-generate ;
79 }
80 rule parent-generate ( project name : property-set : sources * )
81 {
82 return $(sources) ;
83 }
84 rule my-generate ( project name : property-set : sources * )
85 {
86 local r = [ $(property-set).get <myrule> ] ;
87 r = [ MATCH @(.*) : $(r) ] ;
88 return [ indirect.call
89 $(r) $(project) $(name) : $(property-set) : $(sources) ] ;
90 }
91 """)
92 t.write("d1.cpp", "int main(){}\n")
93 t.write("subdir/Jamfile", """
94 generate srcs : main.cpp : <generating-rule>@my-generate ;
95 exe main : srcs ;
96 """)
97 t.write("include/a.h", "")
98 t.write("subdir/main.cpp", "#include <a.h>\nint main() {}\n")
99 t.run_build_system()
100 t.expect_addition("bin/$toolset/debug*/d1.obj")
101 t.expect_addition("bin/$toolset/debug*/d1.exe")
102 t.expect_addition("subdir/bin/$toolset/debug*/main.obj")
103 t.expect_addition("subdir/bin/$toolset/debug*/main.exe")
104 t.expect_nothing_more()
105 t.cleanup()
106
107 def test_glob_in_indirect_conditional():
108 """
109 Regression test: project-rules.glob rule run from inside an indirect
110 conditional should report an error as it depends on the 'currently loaded
111 project' concept and indirect conditional rules get called only after all
112 the project modules have already finished loading.
113
114 """
115 t = BoostBuild.Tester(use_test_config=False)
116
117 t.write("jamroot.jam", """\
118 use-project /library-example/foo : util/foo ;
119 build-project app ;
120 """)
121 t.write("app/app.cpp", "int main() {}\n");
122 t.write("app/jamfile.jam", "exe app : app.cpp /library-example/foo//bar ;")
123 t.write("util/foo/bar.cpp", """\
124 #ifdef _WIN32
125 __declspec(dllexport)
126 #endif
127 void foo() {}
128 """)
129 t.write("util/foo/jamfile.jam", """\
130 rule print-my-sources ( properties * )
131 {
132 ECHO My sources: ;
133 ECHO [ glob *.cpp ] ;
134 }
135 lib bar : bar.cpp : <conditional>@print-my-sources ;
136 """)
137
138 t.run_build_system(status=1)
139 t.expect_output_lines(["My sources:", "bar.cpp"], False)
140 t.expect_output_lines("error: Reference to the project currently being "
141 "loaded requested when there was no project module being loaded.")
142
143 t.cleanup()
144
145
146 test_basic()
147 test_inherit()
148 test_glob_in_indirect_conditional()