diff --git a/new/build-request.jam b/new/build-request.jam index 179884713..6e1347459 100644 --- a/new/build-request.jam +++ b/new/build-request.jam @@ -227,29 +227,45 @@ local rule convert-command-line-element ( e : feature-space ) # targets. rule directly-requested-properties-adjuster { + self.empty-request-requirements = ; + self.all-requests = [ new property-map ] ; rule add-requested-property-set ( property-set ) { local base = [ $(property-set).base ] ; - local ep = $(self.direct-request.$(base:J=-)) ; - if $(ep) && $(ep) != $(properties) - { - error "Conflicting direct build requests" $(ep) "and" $(properties) ; + if ! $(base) + { + self.empty-request-requirements = $(property-set) ; } else { - self.direct-request.$(base:J=-) = $(property-set) ; - } + $(self.all-requests).insert $(base) : $(property-set) ; + } } rule adjust ( property-set ) { local base = [ $(property-set).base ] ; - local ep = $(self.direct-request.$(base:J=-)) ; - if $(ep) + local extra ; + local result ; + + if $(self.empty-request-requirements) { - property-set = $(ep) ; + extra = $(self.empty-request-requirements) ; } - return $(property-set) ; + else + { + extra = [ $(self.all-requests).find $(base) ] ; + } + if $(extra) + { + result = [ $(property-set).add + [ property-set.create [ $(extra).free ] ] ] ; + } + else + { + result = $(property-set) ; + } + return $(result) ; } } diff --git a/new/targets.jam b/new/targets.jam index 148ac19f0..6a85c3938 100644 --- a/new/targets.jam +++ b/new/targets.jam @@ -265,7 +265,7 @@ rule main-target ( name : project ) rule set-property-adjuster ( property-adjuster ) { - self.direct-request-property-adjuster = $(property-adjuster) ; + self.property-adjuster = $(property-adjuster) ; } local rule select-alternatives ( property-set ) @@ -344,12 +344,6 @@ rule main-target ( name : project ) # Returns the result of calling 'generate' on that alternative. rule generate ( property-set ) { - if $(self.property-adjuster) - { - property-set = [ $(self.property-adjuster).adjust - $(property-set) ] ; - } - local all-property-sets = [ apply-default-build $(property-set) ] ; local result ; for local p in $(all-property-sets) @@ -361,6 +355,12 @@ rule main-target ( name : project ) local rule generate-really ( property-set ) { + if $(self.property-adjuster) + { + property-set = [ $(self.property-adjuster).adjust + $(property-set) ] ; + } + local best-alternatives = [ select-alternatives $(property-set) ] ; if ! $(best-alternatives) { diff --git a/new/virtual-target.jam b/new/virtual-target.jam index f9637b08e..40362f3b6 100644 --- a/new/virtual-target.jam +++ b/new/virtual-target.jam @@ -162,6 +162,8 @@ rule virtual-target ( name # Name of this target -- specifies the name of # Do anything only on the first invocation if ! $(self.made.$(name)) { self.made.$(name) = true ; + + virtual-target.register-actual-name $(name) : $(__name__) ; for local i in $(self.dependencies) { DEPENDS $(name) : [ $(i).actualize ] ; @@ -738,6 +740,21 @@ rule register ( target ) return $(result) ; } +rule register-actual-name ( actual-name : virtual-target ) +{ + if $(.actual.$(actual-name)) + { + errors.error "Duplicate name of actual target:" $(actual-name) + : "previous virtual target" [ $(.actual.$(actual-name)).str ] + : "another virtual target" [ $(virtual-target).str ] ; + } + else + { + .actual.$(actual-name) = $(virtual-target) ; + } +} + + # Traverses the dependency graph of 'target' and return all targets that will # be created before this one is created. If root of some dependency graph is # found during traversal, it's either included or not, dependencing of the diff --git a/v2/build/build-request.jam b/v2/build/build-request.jam index 179884713..6e1347459 100644 --- a/v2/build/build-request.jam +++ b/v2/build/build-request.jam @@ -227,29 +227,45 @@ local rule convert-command-line-element ( e : feature-space ) # targets. rule directly-requested-properties-adjuster { + self.empty-request-requirements = ; + self.all-requests = [ new property-map ] ; rule add-requested-property-set ( property-set ) { local base = [ $(property-set).base ] ; - local ep = $(self.direct-request.$(base:J=-)) ; - if $(ep) && $(ep) != $(properties) - { - error "Conflicting direct build requests" $(ep) "and" $(properties) ; + if ! $(base) + { + self.empty-request-requirements = $(property-set) ; } else { - self.direct-request.$(base:J=-) = $(property-set) ; - } + $(self.all-requests).insert $(base) : $(property-set) ; + } } rule adjust ( property-set ) { local base = [ $(property-set).base ] ; - local ep = $(self.direct-request.$(base:J=-)) ; - if $(ep) + local extra ; + local result ; + + if $(self.empty-request-requirements) { - property-set = $(ep) ; + extra = $(self.empty-request-requirements) ; } - return $(property-set) ; + else + { + extra = [ $(self.all-requests).find $(base) ] ; + } + if $(extra) + { + result = [ $(property-set).add + [ property-set.create [ $(extra).free ] ] ] ; + } + else + { + result = $(property-set) ; + } + return $(result) ; } } diff --git a/v2/build/targets.jam b/v2/build/targets.jam index 148ac19f0..6a85c3938 100644 --- a/v2/build/targets.jam +++ b/v2/build/targets.jam @@ -265,7 +265,7 @@ rule main-target ( name : project ) rule set-property-adjuster ( property-adjuster ) { - self.direct-request-property-adjuster = $(property-adjuster) ; + self.property-adjuster = $(property-adjuster) ; } local rule select-alternatives ( property-set ) @@ -344,12 +344,6 @@ rule main-target ( name : project ) # Returns the result of calling 'generate' on that alternative. rule generate ( property-set ) { - if $(self.property-adjuster) - { - property-set = [ $(self.property-adjuster).adjust - $(property-set) ] ; - } - local all-property-sets = [ apply-default-build $(property-set) ] ; local result ; for local p in $(all-property-sets) @@ -361,6 +355,12 @@ rule main-target ( name : project ) local rule generate-really ( property-set ) { + if $(self.property-adjuster) + { + property-set = [ $(self.property-adjuster).adjust + $(property-set) ] ; + } + local best-alternatives = [ select-alternatives $(property-set) ] ; if ! $(best-alternatives) { diff --git a/v2/build/virtual-target.jam b/v2/build/virtual-target.jam index f9637b08e..40362f3b6 100644 --- a/v2/build/virtual-target.jam +++ b/v2/build/virtual-target.jam @@ -162,6 +162,8 @@ rule virtual-target ( name # Name of this target -- specifies the name of # Do anything only on the first invocation if ! $(self.made.$(name)) { self.made.$(name) = true ; + + virtual-target.register-actual-name $(name) : $(__name__) ; for local i in $(self.dependencies) { DEPENDS $(name) : [ $(i).actualize ] ; @@ -738,6 +740,21 @@ rule register ( target ) return $(result) ; } +rule register-actual-name ( actual-name : virtual-target ) +{ + if $(.actual.$(actual-name)) + { + errors.error "Duplicate name of actual target:" $(actual-name) + : "previous virtual target" [ $(.actual.$(actual-name)).str ] + : "another virtual target" [ $(virtual-target).str ] ; + } + else + { + .actual.$(actual-name) = $(virtual-target) ; + } +} + + # Traverses the dependency graph of 'target' and return all targets that will # be created before this one is created. If root of some dependency graph is # found during traversal, it's either included or not, dependencing of the