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
|
#!/usr/bin/python
# Copyright 2003 Vladimir Prus
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt)
import BoostBuild
t = BoostBuild.Tester(arguments=["--config="], pass_toolset=0)
t.write("source.input", "")
t.write("test-properties.jam", """
import feature : feature ;
import generators ;
import toolset ;
import type ;
# We're not using the toolset at all, and we want to
# suppress toolset initialization to avoid surprises.
feature.extend toolset : null ;
type.register CHECK : check ;
type.register INPUT : input ;
feature expected-define : : free ;
feature unexpected-define : : free ;
toolset.flags test-properties DEFINES : <define> ;
toolset.flags test-properties EXPECTED : <expected-define> ;
toolset.flags test-properties UNEXPECTED : <unexpected-define> ;
generators.register-standard test-properties.check : INPUT : CHECK ;
rule check ( target : source : properties * )
{
local defines = [ on $(target) return $(DEFINES) ] ;
for local macro in [ on $(target) return $(EXPECTED) ]
{
if ! ( $(macro) in $(defines) )
{
EXIT expected $(macro) for $(target) in $(properties) : 1 ;
}
}
for local macro in [ on $(target) return $(UNEXPECTED) ]
{
if $(macro) in $(defines)
{
EXIT unexpected $(macro) for $(target) in $(properties) : 1 ;
}
}
}
actions check
{
echo okay > $(<)
}
""")
t.write("jamfile.jam", """
import test-properties ;
# See if default value of composite feature 'cf' will be expanded to
# <define>CF_IS_OFF.
check a : source.input : <expected-define>CF_IS_OFF ;
# See if subfeature in requirements in expanded.
check b : source.input : <cf>on-1
<expected-define>CF_1 <unexpected-define>CF_IS_OFF ;
# See if conditional requirements are recursively expanded.
check c : source.input : <toolset>null:<variant>release
<variant>release:<define>FOO <expected-define>FOO
;
# Composites specified in the default build should not
# be expanded if they are overridden in the the requirements.
check d : source.input : <cf>on <unexpected-define>CF_IS_OFF : <cf>off ;
# Overriding a feature should clear subfeatures and
# apply default values of subfeatures.
check e : source.input : <cf>always
<unexpected-define>CF_IS_OFF <expected-define>CF_2 <unexpected-define>CF_1
: <cf>on-1 ;
# Subfeatures should not be changed if the parent feature doesn't change
check f : source.input : <cf>on <expected-define>CF_1 : <cf>on-1 ;
# If a subfeature is not specific to the value of the parent feature,
# then changing the parent value should not clear the subfeature.
check g : source.input : <fopt>off <expected-define>FOPT_2 : <fopt>on-2 ;
# If the default value of a composite feature adds an optional
# feature which has a subfeature with a default, then that
# default should be added.
check h : source.input : <expected-define>CX_2 ;
# If the default value of a feature is used, then the
# default value of its subfeatures should also be used.
check i : source.input : <expected-define>SF_1 ;
# Subfeatures should be expanded when listed in a
# target reference.
check j-impl : source.input : <expected-define>CF_1 ;
explicit j-impl ;
alias j : j-impl/<cf>on-1 ;
""")
t.write("jamroot.jam", """
import feature ;
feature.feature cf : off on always : composite incidental ;
feature.compose <cf>off : <define>CF_IS_OFF ;
feature.subfeature cf on : version : 1 2 : composite optional incidental ;
feature.compose <cf-on:version>1 : <define>CF_1 ;
feature.subfeature cf always : version : 1 2 : composite incidental ;
feature.compose <cf-always:version>1 : <define>CF_2 ;
feature.feature fopt : on off : optional incidental ;
feature.subfeature fopt : version : 1 2 : composite incidental ;
feature.compose <fopt-version>2 : <define>FOPT_2 ;
feature.feature cx1 : on : composite incidental ;
feature.feature cx2 : on : optional incidental ;
feature.subfeature cx2 on : sub : 1 : composite incidental ;
feature.compose <cx1>on : <cx2>on ;
feature.compose <cx2-on:sub>1 : <define>CX_2 ;
feature.feature sf : a : incidental ;
feature.subfeature sf a : sub : 1 : composite incidental ;
feature.compose <sf-a:sub>1 : <define>SF_1 ;
""")
t.expand_toolset("jamfile.jam")
t.run_build_system()
t.expect_addition(["bin/debug/a.check",
"bin/debug/b.check",
"bin/null/release/c.check",
"bin/debug/d.check",
"bin/debug/e.check",
"bin/debug/f.check",
"bin/debug/g.check",
"bin/debug/h.check",
"bin/debug/i.check"])
t.cleanup()
|