Boost logo

Boost-Build :

Subject: Re: [Boost-build] What is _message_
From: aaron_at_[hidden]
Date: 2016-06-03 10:24:22


> How does the syntax:
>
> _message_(/check/predef//predef_check_cc_$(key))
>
> apply to a Boost Build variable ? I thought Boost Build variables (
> which are list of strings ) had to use [n] to access a string in the list.
 
The Jam language doesn't have a specific data structure for something
like a hashmap (dicationary, associative array, etc), so it's a common
convention to use "variable variables" to facilitate the same functionality.
 
For example:
 
variable-name = x ;
 
# this sets the variable named "x"
$(variable-name) = some list of values ;
 
# now, read from the variable named "x"
echo $(x) ;
 
# outputs: some list of values
 
The use of variable variables is often used for caching expensive
calculations. E.g.
 
rule my-expensive-rule ( targets * )
{
    # it is conventional to prefix the variable variable with
    # a string literal so that it's easy to search for where the
    # variable variable is being used.
    local key = $(.my-expensive-rule-cache-$(targets)) ;
    # this checks to see if the variable name exists in the current
    # module's namespace. if the variable has never been declared
    # then the expansion evaluates to a null-like value.
    if ! $(key)
    {
        # note that the variable name stored in "key" is
        # creating a variable that is global here
        $(key) = [ my-expensive-rule-really $(targets) ] ;
    }
 
    # note the double dollar signs here: $(key) returns the name
    # of the variable and $($(key)) returns the value of the variable
    # name stored in "key"
    return $($(key)) ;
}
 
Hope that helps,
Aaron



Boost-Build list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk