# builtin.jam modules. They are shown in the diagram to give the big picture.
import "class" : new ;
+import feature ;
import path ;
+import property-set ;
import sequence ;
import set ;
+import toolset ;
import type ;
import utility ;
.always = 1 ;
}
+ rule fail-expected ( )
+ {
+ .fail-expected = 1 ;
+ }
+
# Generates all the actual targets and sets up build actions for this
# target.
#
ALWAYS $(actual-name) ;
}
+ if $(.fail-expected)
+ {
+ FAIL_EXPECTED $(actual-name) ;
+ }
+
if ! $(scanner)
{
return $(actual-name) ;
errors.error "method should be defined in derived classes" ;
}
+ # Returns additional properties that are relevant for this target
+ # beyond those required by the action.
+ #
+ rule relevant ( )
+ {
+ return [ property-set.empty ] ;
+ }
+
# implementation
rule actualize-no-scanner ( )
{
{
local ps1 = [ $(a1).properties ] ;
local ps2 = [ $(a2).properties ] ;
- local p1 = [ $(ps1).base ] [ $(ps1).free ] [ set.difference
- [ $(ps1).dependency ] : [ $(ps1).incidental ] ] ;
- local p2 = [ $(ps2).base ] [ $(ps2).free ] [ set.difference
- [ $(ps2).dependency ] : [ $(ps2).incidental ] ] ;
+ local relevant = [ toolset.relevant [ $(a1).action-name ] ] ;
+ relevant = [ $(relevant).add [ $(target).relevant ] ] ;
+ local p1 = [ $(ps1).relevant $(relevant) ] ;
+ local p2 = [ $(ps2).relevant $(relevant) ] ;
if $(p1) = $(p2)
{
result = $(t) ;
if $(action1) && $(action2)
{
local p1 = [ $(action1).properties ] ;
- p1 = [ $(p1).raw ] ;
local p2 = [ $(action2).properties ] ;
+ # Only show features that are relevant for either target.
+ local relevant = [ $(p1).get <relevant> ] [ $(p2).get <relevant> ] ;
+ relevant = [ feature.expand-relevant $(relevant) ] ;
+ # The presence of relevant can potentially mess things up,
+ # so we always need to show it.
+ relevant += relevant ;
+ relevant = [ property-set.create <relevant>$(relevant) ] ;
+ p1 = [ $(p1).relevant $(relevant) ] ;
+ p2 = [ $(p2).relevant $(relevant) ] ;
+ p1 = [ $(p1).raw ] ;
p2 = [ $(p2).raw ] ;
properties-removed = [ set.difference $(p1) : $(p2) ] ;
properties-removed ?= "none" ;
rule all-target-directories ( target-type ? )
{
- if ! $(self.target-directories)
+ if ! $(self.target-directories.$(target-type:E=))
{
compute-target-directories $(target-type) ;
}
- return $(self.target-directories) ;
+ return $(self.target-directories.$(target-type:E=)) ;
}
rule compute-target-directories ( target-type ? )
{
result += [ $(d).all-target-directories $(target-type) ] ;
}
- self.target-directories = $(result) ;
+ self.target-directories.$(target-type:E=) = $(result) ;
}
}