2
0
mirror of https://github.com/boostorg/build.git synced 2026-02-13 00:12:11 +00:00

feature.jam - rename is-subproperty and is-subfeature to avoid

confusion over semantics and signature.  Fixed a bug
              where they were misused.  Added compress-subproperties
              to work around probable misuse of
              build-request.expand-no-defaults.


targets.jam - use feature.compress-subproperties to work around
              probable misuse of build-request.expand-no-defaults.


project.jam - some code simplification, fixed a blatant typo,
              increased upper limit on arguments to the project rule.


[SVN r19716]
This commit is contained in:
Dave Abrahams
2003-08-20 21:56:49 +00:00
parent 5848167a20
commit 206de2a127
3 changed files with 86 additions and 31 deletions

View File

@@ -11,6 +11,7 @@ import regex ;
import set ;
import utility ;
import modules indirect ;
import assert : * ;
local rule setup ( )
{
@@ -694,7 +695,7 @@ rule expand-composites ( properties * )
# Return true iff f is an ordinary subfeature of the parent-property's
# feature, or if f is a subfeature fo the parent-property's feature
# specific to the parent-property's value
local rule is-subfeature ( parent-property f )
local rule is-subfeature-of ( parent-property f )
{
if subfeature in $($(f).attributes)
{
@@ -725,9 +726,9 @@ local rule is-subfeature ( parent-property f )
}
# as above, for subproperties
local rule is-subproperty ( parent-property p )
local rule is-subproperty-of ( parent-property p )
{
return [ is-subfeature $(parent-property) $(p:G) ] ;
return [ is-subfeature-of $(parent-property) $(p:G) ] ;
}
# Given a property, return the subset of features consisting of all
@@ -736,13 +737,13 @@ local rule is-subproperty ( parent-property p )
# property's value.
local rule select-subfeatures ( parent-property : features * )
{
return [ sequence.filter is-subfeature $(parent-property) : $(features) ] ;
return [ sequence.filter is-subfeature-of $(parent-property) : $(features) ] ;
}
# as above, for subproperties
local rule select-subproperties ( parent-property : properties * )
{
return [ sequence.filter is-subproperty $(parent-property) : $(properties) ] ;
return [ sequence.filter is-subproperty-of $(parent-property) : $(properties) ] ;
}
# Given a property set which may consist of composite and implicit
@@ -781,11 +782,7 @@ local rule move-subfeatures-to-the-end ( properties * )
local x2 ;
for local p in $(properties)
{
# Check if grist contains dash. If it is, this
# is possibly subfeature, so move it to the end
# FIXME: in general, this may be ordinary feature.
local g = $(p:G) ;
if [ MATCH "(-)" : $(g) ]
if subfeature in $($(p:G).attributes)
{
x2 += $(p) ;
}
@@ -867,6 +864,48 @@ rule minimize ( properties * )
return $(result) ;
}
# Combine all subproperties into their parent properties
#
# Requires: for every subproperty, there is a parent property. All
# features are explicitly expressed.
#
# This rule probably shouldn't be needed, but
# build-request.expand-no-defaults is being abused for unintended
# purposes and it needs help
rule compress-subproperties ( properties * )
{
local all-subs matched-subs result ;
for local p in $(properties)
{
if ! $(p:G)
{
assert.nonempty-variable p:G ; # expecting fully-gristed properties
}
if ! subfeature in $($(p:G).attributes)
{
local subs = [
sequence.insertion-sort
[ sequence.filter is-subproperty-of $(p) : $(properties) ]
] ;
matched-subs += $(subs) ;
local subvalues = -$(subs:G=:J=-) ;
subvalues ?= "" ;
result += $(p)$(subvalues) ;
}
else
{
all-subs += $(p) ;
}
}
assert.result true : set.equal $(all-subs) : $(matched-subs) ;
return $(result) ;
}
# given an ungristed string, finds the longest prefix which is a
# top-level feature name followed by a dash, and return a pair
# consisting of the parts before and after that dash. More

View File

@@ -260,10 +260,6 @@ local rule load-jamfile (
"Please consult the documentation at 'http://www.boost.org'." ;
}
# The module of the jamfile.
#
local jamfile-module = [ module-name [ path.parent $(jamfile-to-load[1]) ] ] ;
# Multiple Jamfiles found in the same place. Warn about this.
# And ensure we use only one of them.
#
@@ -272,10 +268,14 @@ local rule load-jamfile (
ECHO
"WARNING: Found multiple Jamfiles at this '"$(dir)"' location!"
"Loading the first one: '" [ path.basename $(jamfile-to-load[1]) ] "'." ;
jamfile-to-load = $(jamfile-to-load[1]) ;
}
jamfile-to-load = $(jamfile-to-load[1]) ;
# The module of the jamfile.
#
local jamfile-module = [ module-name [ path.parent $(jamfile-to-load) ] ] ;
# Initialize the jamfile module before loading.
#
initialize $(jamfile-module) : [ path.parent $(jamfile-to-load) ] ;
@@ -344,7 +344,7 @@ rule inherit-attributes ( project-module : project-root-module : parent-module ?
{
local attributes = $($(project-module).attributes) ;
local pattributes = [ attributes $(parent-module) ] ;
$(attributes).set parent : [ path.parent $(parent) ] ;
$(attributes).set parent : [ path.parent $(parent-module) ] ;
$(attributes).set default-build
: [ $(pattributes).get default-build ] ;
$(attributes).set requirements
@@ -561,7 +561,7 @@ rule use ( id : location )
module project-rules
{
rule project ( id ? : option1 * : option2 * : option3 * )
rule project ( id ? : options * : * )
{
import project ;
import path ;
@@ -574,17 +574,13 @@ module project-rules
$(attributes).set id : $(id) ;
}
if $(option1)
for n in 2 3 4 5 6 7 8 9
{
$(attributes).set $(option1[1]) : $(option1[2-]) ;
}
if $(option2)
{
$(attributes).set $(option2[1]) : $(option2[2-]) ;
}
if $(option3)
{
$(attributes).set $(option3[1]) : $(option3[2-]) ;
local option = $($(n)) ;
if $(option)
{
$(attributes).set $(option[1]) : $(option[2-]) ;
}
}
}

View File

@@ -449,8 +449,26 @@ class main-target : abstract-target
local result ;
if $(defaults-to-apply)
{
properties = [ build-request.expand-no-defaults
$(raw) $(defaults-to-apply) ] ;
properties = [
build-request.expand-no-defaults
# We have to compress subproperties here to prevent
# property lists like:
#
# <toolset>msvc <toolset-msvc:version>7.1 <threading>multi
#
# from being expanded into:
#
# <toolset-msvc:version>7.1/<threading>multi
# <toolset>msvc/<toolset-msvc:version>7.1/<threading>multi
#
# due to cross-product property combination. That may
# be an indication that
# build-request.expand-no-defaults is the wrong rule
# to use here.
[ feature.compress-subproperties $(raw) ]
$(defaults-to-apply)
] ;
if $(properties)
{
@@ -509,7 +527,9 @@ class main-target : abstract-target
# why it can't be build.
print.wrapped-text
"warning: skipped build of" [ full-name ]
"with properties" [ $(property-set).raw ] ;
"with properties" [ $(property-set).raw ]
"because no best-matching alternative could be found"
;
}
else if $(best-alternatives[2])
{