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_1_0.txt or http://www.boost.org/LICENSE_1_0.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()
|