⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 property-set.jam

📁 C++的一个好库。。。现在很流行
💻 JAM
字号:
#  Copyright (C) Vladimir Prus 2002. Permission to copy, use, modify, sell and
#  distribute this software is granted provided this copyright notice appears in
#  all copies. This software is provided "as is" without express or implied
#  warranty, and with no claim as to its suitability for any purpose.

import "class" : new ;
import feature ;
import property ;
import sequence ;

# Class for storing a set of properties.
# - there's 1<->1 correspondence between identity and value. No
#   two instances of the class are equal. To maintain this property,
#   the 'property-set.create' rule should be used to create new instances.
#   Instances are immutable.
# 
# - each property is classified with regard to it's effect on build
#   results. Incidental properties have no effect on build results, from
#   Boost.Build point of view. Others are either free, or non-free, which we
#   call 'base'. Each property belong to exactly one of those categories and
#   it's possible to get list of properties in each category.
#
#   In addition, it's possible to get list of properties with specific
#   attribute.
#
# - several operations, like and refine and as-path are provided. They all use
#   caching whenever possible.
#
class property-set 
{
    import feature ;
    import property-set ;
    import property ;
    import set ;
    import path ;
    import errors ;
            
    rule __init__ ( raw-properties * )
    {        
        self.raw = $(raw-properties) ;
        
        for local p in $(raw-properties)
        {
            if ! $(p:G)
            {
                errors.error "Invalid property: '$(p)'" ;                                    
            }
                        
            local att = [ feature.attributes $(p:G) ] ;        
            # A feature can be both incidental and free,
            # in which case we add it to incidental.
            if incidental in $(att)
            {
                self.incidental += $(p) ;
            }
            else if free in $(att)
            {
                self.free += $(p) ;
            }
            else 
            {
                self.base += $(p) ;
            }
        
            if dependency in $(att)
            {
                self.dependency += $(p) ;
            }
            else
            {
                self.non-dependency += $(p) ;
            }
            
            if [ MATCH (:) : $(p:G=) ]            
            {
                self.conditional += $(p) ;
            }
            else
            {
                self.non-conditional += $(p) ;
            }
            
                                    
            if propagated in $(att)
            {
                self.propagated += $(p) ;
            }                        
            if link-incompatible in $(att)
            {
                self.link-incompatible += $(p) ;
            }                                
        }
        
    }
    
    
    # Returns Jam list of stored properties
    rule raw ( )
    {
        return $(self.raw) ;
    }
    
    # Returns properties that are neither incidental nor free
    rule base ( )
    {
        return $(self.base) ;
    }
    
    
    # Returns free properties which are not dependency properties
    rule free ( )
    {
        return $(self.free) ;
    }
    
    # Returns dependency properties
    rule dependency ( )
    {
        return $(self.dependency) ;
    }
    
    rule non-dependency ( )
    {
        return $(self.non-dependency) ;
    }
    
    rule conditional ( )
    {
        return $(self.conditional) ;
    }
        
    rule non-conditional ( )
    {
        return $(self.non-conditional) ;
    }
              
    # Returns incidental properties
    rule incidental ( )
    {
        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)
        {
            self.propagated-ps = [ property-set.create $(self.propagated) ] ;
        }
        return $(self.propagated-ps) ;
    }                   
    
    rule link-incompatible ( )
    {
        if ! $(self.link-incompatible-ps)
        {
            self.link-incompatible-ps = 
              [ property-set.create $(self.link-incompatible) ] ;
        }
        return $(self.link-incompatible-ps) ;
    }
    
    
    rule run-actions ( )
    {
        if ! $(self.run)
        {
            self.run = [ property-set.create [ feature.run-actions $(self.raw) ] ] ;
        }
        return $(self.run) ;
    }
    
    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 $(self.base) ] ;
        }        
        return $(self.as-path) ;
    }        
    
    # Computes the target path that should be used for 
    # target with these properties.
    # Returns a list of
    #   - the computed path
    #   - if the path is relative to build directory, a value of
    #     'true'. 
    rule target-path ( )
    {
        if ! $(self.target-path)
        {    
            # The <location> feature can be used to explicitly
            # change the location of generated targetsv
            local l = [ get <location> ] ;
            if $(l)
            {
                self.target-path = $(l) ;
            }
            else
            {
                local p = [ as-path ] ;                           
                # Really, an ugly hack. Boost regression test system requires
                # specific target paths, and it seems that changing it to handle
                # other directory layout is really hard. For that reason,
                # we teach V2 to do the things regression system requires.
                # The value o '<location-prefix>' is predended to the path.
                local prefix = [ get <location-prefix> ] ;            
                if $(prefix)
                {
                    self.target-path = [ path.join $(prefix) $(p) ] ;
                }   
                else
                {
                    self.target-path = $(p) ;
                }                
                # The path is relative to build dir.
                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 link-incompatible-with ( ps )
    {
        if ! $(.li.$(ps))
        {
            local li1 = [ $(__name__).link-incompatible ] ;
            local li2 = [ $(ps).link-incompatible ] ;            
            if [ set.equal $(li1) : $(li2) ] 
            {
                .li.$(ps) = false ;
            }
            else
            {
                .li.$(ps) = true ;
            }            
        }    
        if $(.li.$(ps)) = true
        {
            return true ;
        }
        else
        {
            return ;
        }                
    }
    

    
    # Returns all values of 'feature'.
    rule get ( feature )
    {
        if ! $(self.map-built)
        {
            # For each feature, create member var and assign all
            # values to it. Since all regular member vars start with
            # 'self', there will be no conflicts between names.
            self.map-built = true ;
            for local v in $(self.raw)
            {
                $(v:G) += $(v:G=) ;
            }            
        }
        
        return $($(feature)) ;
    }
    
}

# Creates new 'property-set' instance for the given raw properties,
# or returns an already existing ones.
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 ;

# Creates new 'property-set' instances after checking
# that all properties are valid and converting incidental
# properties into gristed form.
rule create-with-validation ( raw-properties * )
{
    property.validate $(raw-properties) ;
    
    return [ create [ property.make $(raw-properties) ] ] ;
}

# Creates a property-set from the input given by the user, in the
# context of 'jamfile-module' at 'location'
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) ] ;
    specification = 
      [ property.expand-subfeatures-in-conditions $(specification) ] ;                
    specification = [ property.make $(specification) ] ;            
    result = [ property-set.create $(specification) ] ;            
    return $(result) ;
}



# Returns property-set with empty set of properties.
rule empty ( )
{
    if ! $(.empty)
    {
      .empty = [ create ] ;
    }
    
    return $(.empty) ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -