The feature module
A feature is a typed variable that can be used to parametrize the build process. A given feature variable may hold one or multiple values. It may be restricted to a pre-defined set of possible values, or it may be free. Most values are simple strings, though they may be interpreted as a path.
attributes
Attribute flags are used to indicate how to interpret feature values.
-
multi The feature may take multiple values.
-
path Values are interpreted as a path. By default, this is taken to be relative to the directory containing the issuing fabscript.
-
incidental Incidental values are not considered when matching two feature values.
The feature class
Constructor
-
feature() -
feature(name) -
feature(name, values) -
feature(name, attributes) -
feature(name, values, attributes) -
feature(name, **subfeatures) Construct a new feature.
- Parameters
name (string) -- the feature's name
values (list) -- list of valid values
attributes (int) -- attributes
subfeatures (features) -- subfeatures
A feature normally takes a name, optional attributes, as well as a possible set of valid values. If no values are given, the feature's range of values is unrestricted.
Call operator
-
__call__(*values) Create a feature variable with the given values. (These need to match the values the feature was constructed with.)
- Parameters
values -- initial values of the feature variable
The value class
Operators
-
__ior__(self, value) Add the given value to this variable (if it isn't already present). In addition to the above rules for constructing a new feature variable, this is only valid if the multi attribute is set for this feature. Trying to add a value to a feature variable without it will result in an error.
-
__eq__(self, other) Return True if other has or is the same value as self.
The set class
Class methods
-
__getattr__(feature) Return a condition expression that
Constructor
-
set() -
set(*values) Construct a feature set from the given values.
Methods
A set is a dictionary-like type and provides a similar interface:
-
keys()
-
values()
-
items()
Operators
-
__getattr__() For convenience, variables in a set can be accessed using simple attribute access syntax. If feature include is present in set s, s['include'] and s.include give access to it.
The condition.expr classes
-
class
expr Base class to construct condition expressions.

All relational operators are supported, and will result in compound expressions.
Examples
Assuming the following features are defined:
from faber.feature import *
include = feature('include', multi|path|incidental)
link = feature('link', values=('shared', 'static'))
target = feature('target', os=feature(), arch=feature())
it is possible to define values for them globally per command-line arguments:
faber include=search include=path link=shared target.os=Linux
These feature values are added to all artefact feature sets by default (but may be overwritten or added to by artefact-specific values:
greet = library('greet', 'greet.cpp', features=link('static'))
Artefacts may be conditionalized using condition expressions:
greet = library('greet', 'greet.cpp', condition=set.define.contains('HAS_FEATURE'))



