| |
| |
| |
| |
|
|
| import "class" : new ; |
| import feature ; |
| import path ; |
| import project ; |
| import property ; |
| import sequence ; |
| import set ; |
| import option ; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| class property-set |
| { |
| import errors ; |
| import feature ; |
| import path ; |
| import property ; |
| import property-set ; |
| import set ; |
| |
| rule __init__ ( raw-properties * ) |
| { |
| self.raw = $(raw-properties) ; |
|
|
| for local p in $(raw-properties) |
| { |
| if ! $(p:G) |
| { |
| errors.error "Invalid property: '$(p)'" ; |
| } |
| } |
| } |
|
|
| |
| |
| rule raw ( ) |
| { |
| return $(self.raw) ; |
| } |
|
|
| rule str ( ) |
| { |
| return "[" $(self.raw) "]" ; |
| } |
|
|
| |
| |
| rule base ( ) |
| { |
| if ! $(self.base-initialized) |
| { |
| init-base ; |
| } |
| return $(self.base) ; |
| } |
|
|
| |
| |
| rule free ( ) |
| { |
| if ! $(self.base-initialized) |
| { |
| init-base ; |
| } |
| return $(self.free) ; |
| } |
|
|
| |
| |
| rule dependency ( ) |
| { |
| if ! $(self.dependency-initialized) |
| { |
| init-dependency ; |
| } |
| return $(self.dependency) ; |
| } |
|
|
| rule non-dependency ( ) |
| { |
| if ! $(self.dependency-initialized) |
| { |
| init-dependency ; |
| } |
| return $(self.non-dependency) ; |
| } |
|
|
| rule conditional ( ) |
| { |
| if ! $(self.conditional-initialized) |
| { |
| init-conditional ; |
| } |
| return $(self.conditional) ; |
| } |
|
|
| rule non-conditional ( ) |
| { |
| if ! $(self.conditional-initialized) |
| { |
| init-conditional ; |
| } |
| return $(self.non-conditional) ; |
| } |
|
|
| |
| |
| rule incidental ( ) |
| { |
| if ! $(self.base-initialized) |
| { |
| init-base ; |
| } |
| return $(self.incidental) ; |
| } |
|
|
| rule refine ( ps ) |
| { |
| if ! $(self.refined.$(ps)) |
| { |
| local r = [ property.refine $(self.raw) : [ $(ps).raw ] ] ; |
| if $(r[1]) != "@error" |
| { |
| self.refined.$(ps) = [ property-set.create $(r) ] ; |
| } |
| else |
| { |
| self.refined.$(ps) = $(r) ; |
| } |
| } |
| return $(self.refined.$(ps)) ; |
| } |
|
|
| rule expand ( ) |
| { |
| if ! $(self.expanded) |
| { |
| self.expanded = [ property-set.create [ feature.expand $(self.raw) ] ] ; |
| } |
| return $(self.expanded) ; |
| } |
|
|
| rule expand-composites ( ) |
| { |
| if ! $(self.composites) |
| { |
| self.composites = [ property-set.create |
| [ feature.expand-composites $(self.raw) ] ] ; |
| } |
| return $(self.composites) ; |
| } |
|
|
| rule evaluate-conditionals ( context ? ) |
| { |
| context ?= $(__name__) ; |
| if ! $(self.evaluated.$(context)) |
| { |
| self.evaluated.$(context) = [ property-set.create |
| [ property.evaluate-conditionals-in-context $(self.raw) : [ $(context).raw ] ] ] ; |
| } |
| return $(self.evaluated.$(context)) ; |
| } |
|
|
| rule propagated ( ) |
| { |
| if ! $(self.propagated-ps) |
| { |
| local result ; |
| for local p in $(self.raw) |
| { |
| if propagated in [ feature.attributes $(p:G) ] |
| { |
| result += $(p) ; |
| } |
| } |
| self.propagated-ps = [ property-set.create $(result) ] ; |
| } |
| return $(self.propagated-ps) ; |
| } |
|
|
| rule add-defaults ( ) |
| { |
| if ! $(self.defaults) |
| { |
| self.defaults = [ property-set.create |
| [ feature.add-defaults $(self.raw) ] ] ; |
| } |
| return $(self.defaults) ; |
| } |
|
|
| rule as-path ( ) |
| { |
| if ! $(self.as-path) |
| { |
| self.as-path = [ property.as-path [ base ] ] ; |
| } |
| return $(self.as-path) ; |
| } |
|
|
| |
| |
| |
| |
| |
| rule target-path ( ) |
| { |
| if ! $(self.target-path) |
| { |
| |
| |
| local l = [ get <location> ] ; |
| if $(l) |
| { |
| self.target-path = $(l) ; |
| } |
| else |
| { |
| local p = [ as-path ] ; |
| p = [ property-set.hash-maybe $(p) ] ; |
| |
| |
| |
| |
| |
| |
| local prefix = [ get <location-prefix> ] ; |
| if $(prefix) |
| { |
| self.target-path = [ path.join $(prefix) $(p) ] ; |
| } |
| else |
| { |
| self.target-path = $(p) ; |
| } |
| if ! $(self.target-path) |
| { |
| self.target-path = . ; |
| } |
| |
| self.target-path += true ; |
| } |
| } |
| return $(self.target-path) ; |
| } |
|
|
| rule add ( ps ) |
| { |
| if ! $(self.added.$(ps)) |
| { |
| self.added.$(ps) = [ property-set.create $(self.raw) [ $(ps).raw ] ] ; |
| } |
| return $(self.added.$(ps)) ; |
| } |
|
|
| rule add-raw ( properties * ) |
| { |
| return [ add [ property-set.create $(properties) ] ] ; |
| } |
|
|
| |
| |
| rule get ( feature ) |
| { |
| if ! $(self.map-built) |
| { |
| |
| |
| |
| self.map-built = true ; |
| for local v in $(self.raw) |
| { |
| $(v:G) += $(v:G=) ; |
| } |
| } |
| return $($(feature)) ; |
| } |
| |
| |
|
|
| rule init-base ( ) |
| { |
| for local p in $(self.raw) |
| { |
| local att = [ feature.attributes $(p:G) ] ; |
| |
| |
| if incidental in $(att) |
| { |
| self.incidental += $(p) ; |
| } |
| else if free in $(att) |
| { |
| self.free += $(p) ; |
| } |
| else |
| { |
| self.base += $(p) ; |
| } |
| } |
| self.base-initialized = true ; |
| } |
|
|
| rule init-dependency ( ) |
| { |
| for local p in $(self.raw) |
| { |
| local att = [ feature.attributes $(p:G) ] ; |
|
|
| if dependency in $(att) |
| { |
| self.dependency += $(p) ; |
| } |
| else |
| { |
| self.non-dependency += $(p) ; |
| } |
| } |
| self.dependency-initialized = true ; |
| } |
|
|
| rule init-conditional ( ) |
| { |
| for local p in $(self.raw) |
| { |
| if [ MATCH (:) : $(p:G=) ] |
| { |
| self.conditional += $(p) ; |
| } |
| else |
| { |
| self.non-conditional += $(p) ; |
| } |
| } |
| self.conditional-initialized = true ; |
| } |
| } |
|
|
|
|
| |
| |
| |
| rule create ( raw-properties * ) |
| { |
| raw-properties = [ sequence.unique |
| [ sequence.insertion-sort $(raw-properties) ] ] ; |
|
|
| local key = $(raw-properties:J=-:E=) ; |
|
|
| if ! $(.ps.$(key)) |
| { |
| .ps.$(key) = [ new property-set $(raw-properties) ] ; |
| } |
| return $(.ps.$(key)) ; |
| } |
| NATIVE_RULE property-set : create ; |
|
|
|
|
| |
| |
| |
| rule create-with-validation ( raw-properties * ) |
| { |
| property.validate $(raw-properties) ; |
| return [ create [ property.make $(raw-properties) ] ] ; |
| } |
|
|
|
|
| |
| |
| |
| rule create-from-user-input ( raw-properties * : jamfile-module location ) |
| { |
| local specification = [ property.translate-paths $(raw-properties) |
| : $(location) ] ; |
| specification = [ property.translate-indirect $(specification) |
| : $(jamfile-module) ] ; |
| local project-id = [ project.attribute $(jamfile-module) id ] ; |
| project-id ?= [ path.root $(location) [ path.pwd ] ] ; |
| specification = [ property.translate-dependencies |
| $(specification) : $(project-id) : $(location) ] ; |
| specification = |
| [ property.expand-subfeatures-in-conditions $(specification) ] ; |
| specification = [ property.make $(specification) ] ; |
| return [ property-set.create $(specification) ] ; |
| } |
|
|
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| rule refine-from-user-input ( parent-requirements : specification * : |
| project-module : location ) |
| { |
| if ! $(specification) |
| { |
| return $(parent-requirements) ; |
| } |
| else |
| { |
| local add-requirements ; |
| local remove-requirements ; |
|
|
| for local r in $(specification) |
| { |
| local m = [ MATCH "^-(.*)" : $(r) ] ; |
| if $(m) |
| { |
| remove-requirements += $(m) ; |
| } |
| else |
| { |
| add-requirements += $(r) ; |
| } |
| } |
|
|
| if $(remove-requirements) |
| { |
| |
| |
| |
| local ps = [ property-set.create-from-user-input |
| $(remove-requirements) : $(project-module) $(location) ] ; |
|
|
| parent-requirements = [ property-set.create |
| [ set.difference [ $(parent-requirements).raw ] |
| : [ $(ps).raw ] ] ] ; |
| specification = $(add-requirements) ; |
| } |
|
|
| local requirements = [ property-set.create-from-user-input |
| $(specification) : $(project-module) $(location) ] ; |
|
|
| return [ $(parent-requirements).refine $(requirements) ] ; |
| } |
| } |
|
|
|
|
| |
| |
| rule empty ( ) |
| { |
| if ! $(.empty) |
| { |
| .empty = [ create ] ; |
| } |
| return $(.empty) ; |
| } |
|
|
| if [ option.get hash : : yes ] = yes |
| { |
| rule hash-maybe ( path ? ) |
| { |
| path ?= "" ; |
| return [ MD5 $(path) ] ; |
| } |
| } |
| else |
| { |
| rule hash-maybe ( path ? ) |
| { |
| return $(path) ; |
| } |
| } |
|
|
|
|