From 2e1e54778502684ffcdbcad3962acdfca3e85b47 Mon Sep 17 00:00:00 2001 From: Vladimir Prus Date: Mon, 17 Mar 2003 09:27:43 +0000 Subject: [PATCH] Better direct request handling. * new/build-request.jam (directly-requested-properties-adjuster): Redo. * new/targets.jam (main-target.generate-really): Adjust properties here. * new/virtual-target.jam (register-actual-name): New rule. (virtual-target.actualize-no-scanner): Call the above, to detected bugs, where two virtual target correspond to one Jam target name. [SVN r17955] --- new/build-request.jam | 36 ++++++++++++++++++++++++++---------- new/targets.jam | 14 +++++++------- new/virtual-target.jam | 17 +++++++++++++++++ v2/build/build-request.jam | 36 ++++++++++++++++++++++++++---------- v2/build/targets.jam | 14 +++++++------- v2/build/virtual-target.jam | 17 +++++++++++++++++ 6 files changed, 100 insertions(+), 34 deletions(-) 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