summaryrefslogtreecommitdiffstats
path: root/src/boost/tools/build/test/indirect_conditional.py
blob: 4d8373cb1f3fabed32c7fc3d3c318435b64155fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/usr/bin/python

# Copyright (C) 2006. 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", """\
exe a1 : a1.cpp : <conditional>@a1-rule ;
rule a1-rule ( properties * )
{
    if <variant>debug in $(properties)
    {
        return <define>OK ;
    }
}

exe a2 : a2.cpp : <conditional>@$(__name__).a2-rule
    <variant>debug:<optimization>speed ;
rule a2-rule ( properties * )
{
    if <optimization>speed in $(properties)
    {
        return <define>OK ;
    }
}

exe a3 : a3.cpp :
    <conditional>@$(__name__).a3-rule-1
    <conditional>@$(__name__).a3-rule-2 ;
rule a3-rule-1 ( properties * )
{
    if <optimization>speed in $(properties)
    {
        return <define>OK ;
    }
}
rule a3-rule-2 ( properties * )
{
    if <variant>debug in $(properties)
    {
        return <optimization>speed ;
    }
}
""")

    t.write("a1.cpp", "#ifdef OK\nint main() {}\n#endif\n")
    t.write("a2.cpp", "#ifdef OK\nint main() {}\n#endif\n")
    t.write("a3.cpp", "#ifdef OK\nint main() {}\n#endif\n")

    t.run_build_system()

    t.expect_addition("bin/$toolset/debug*/a1.exe")
    t.expect_addition("bin/$toolset/debug/optimization-speed*/a2.exe")
    t.expect_addition("bin/$toolset/debug/optimization-speed*/a3.exe")

    t.cleanup()

def test_inherit():
    """Tests that paths etc. are handled correctly when an indirect
    conditional is inherited by a subproject."""
    t = BoostBuild.Tester(use_test_config=False)
    t.write("Jamroot.jam", """
import feature ;
import indirect ;
exe d1 : d1.cpp ;
explicit d1 ;
project : requirements <conditional>@c1 ;
build-project subdir ;
feature.feature myrule : : free ;
rule c1 ( properties * )
{
  return <dependency>d1 <include>include <myrule>@parent-generate ;
}
rule parent-generate ( project name : property-set : sources * )
{
  return $(sources) ;
}
rule my-generate ( project name : property-set : sources * )
{
  local r = [ $(property-set).get <myrule> ] ;
  r = [ MATCH @(.*) : $(r) ] ;
  return [ indirect.call
    $(r) $(project) $(name) : $(property-set) : $(sources) ] ;
}
""")
    t.write("d1.cpp", "int main(){}\n")
    t.write("subdir/Jamfile", """
generate srcs : main.cpp : <generating-rule>@my-generate ;
exe main : srcs ;
""")
    t.write("include/a.h", "")
    t.write("subdir/main.cpp", "#include <a.h>\nint main() {}\n")
    t.run_build_system()
    t.expect_addition("bin/$toolset/debug*/d1.obj")
    t.expect_addition("bin/$toolset/debug*/d1.exe")
    t.ignore_addition("bin/*/d1.rsp")
    t.expect_addition("subdir/bin/$toolset/debug*/main.obj")
    t.expect_addition("subdir/bin/$toolset/debug*/main.exe")
    t.ignore_addition("subdir/bin/*/main.rsp")
    t.expect_nothing_more()
    t.cleanup()

def test_glob_in_indirect_conditional():
    """
      Regression test: project-rules.glob rule run from inside an indirect
    conditional should report an error as it depends on the 'currently loaded
    project' concept and indirect conditional rules get called only after all
    the project modules have already finished loading.

    """
    t = BoostBuild.Tester(use_test_config=False)

    t.write("jamroot.jam", """\
use-project /library-example/foo : util/foo ;
build-project app ;
""")
    t.write("app/app.cpp", "int main() {}\n");
    t.write("app/jamfile.jam", "exe app : app.cpp /library-example/foo//bar ;")
    t.write("util/foo/bar.cpp", """\
#ifdef _WIN32
__declspec(dllexport)
#endif
void foo() {}
""")
    t.write("util/foo/jamfile.jam", """\
rule print-my-sources ( properties * )
{
    ECHO My sources: ;
    ECHO [ glob *.cpp ] ;
}
lib bar : bar.cpp : <conditional>@print-my-sources ;
""")

    t.run_build_system(status=1)
    t.expect_output_lines(["My sources:", "bar.cpp"], False)
    t.expect_output_lines("error: Reference to the project currently being "
        "loaded requested when there was no project module being loaded.")

    t.cleanup()


test_basic()
test_inherit()
test_glob_in_indirect_conditional()