This is preliminary version intended to document everything implemeneted but not yet ready for any practical use.
TODO: give a name and describe the property set joined with slashes. I use the term "property path" somewhere below.
Boost.Build extends Jam's command line in two ways. First, command line arguments can be used not only to specify targets to build, but also to specify build variants or arbitrary build request. Second, there are additional command line options.
<feature-name>=<feature-value>[","<feature-value>]*
For each specified value, a propertry with that value and the
specified feature name is added to the set.
target1 debug gcc/runtime-link=dynamic,static
would cause target called target1 to be rebuild in debug mode,
except that for gcc, both dynamically and statically linked binaries
would be created.
TODO: should allow
target1 debug gcc,borland/runtime-link=static
to work.
All of the Boost.Build options start with the "--" prefix. They are described in the following table.
| Option | Description |
|---|---|
| --debug | Enables internal checks. |
| --dump-projects | Cause the project structure to be output. |
Boost.Build considers every software it build as organized into projects, which corresponds to a single Jamfile. The project are organized in a hierarchical structure, so for each project we can talk about parent project, which is always unique and a number of subprojects. (TODO: project root).
For each project, there are several attributes.
Project id is used to denote the project from other project. Each project id is a hierarchical path, such as "boost/thread". When project-id need to be referred from other projects there are two alternatives:
Source location specifies directory where sources for the project are located.
Project requirements are requirements that apply to all the targets in the projects as well as all subprojects.
Default build is the build request that should be used when no build request is specified explicitly.
The default values for those attributes are given in the table below. In order to affect them, Jamfile may call the project rule. The rule has this syntax:
project id : <attributes> ;
Here, attributes is a sequence of (attribute-name, attribute-value)
pairs. The list of attribute names along with its handling is shown in
the table below. For example, it it possible to write:
project tennis
: requirements <threading>multi
: default-build release
;
| Attribute | Name for the 'project' rule | Default value | Handling by the 'project' rule |
|---|---|---|---|
| Project id | none | none | Assigned from the first parameter of the 'project' rule. It is assumed to denote absolute project id. |
| Source location | source-location | The location of jamfile for the project | Sets to the passed value |
| Requirements | requirements | The parent's requirements | The parent's requirements are refined with the passed requirement and the result is used as the project requirements. |
| Default build | default-build | TODO | Sets to the passed value |
There are three kinds of project relationships.
First is parent-child. This relationship is established implicitly: parent directories of a project are searched, and the first found Jamfile is assumed to define the parent project. The parent-child relationship affects only attribute values for the child project.
Second is build relationship. Some project may request to recursively build other projects. Those project need not be child projects. The build-project rule is used for that:
build-project src ;
The third kind is the 'use' relationship. In means that one project uses targets from another. It is possible to just refer to target in other projects using target id. However, if target id uses project id, it is required that the project id is known. The use-project rule is employed to guarantee that.
use-project ( id : location )
It loads the project at the specified location, which makes its project
id available in the project which invokes the rule. It is required that
the id parameter passed to the use-project rule be
equal to the id that the loaded project declared. At this moment, the
id paremeter should be absolute project id.
Main target is a named entity which can be build, for example a named executable file. To declare a main target, user invokes some of the main target rules, passing it things like list of source and requirement.
It is possible to have different list of sources for different toolsets, therefore it is possible to invoce main target rules several times for a single main target. For example:
exe a.exe : a_gcc.cpp : <toolset> ;
exe a.exe : a.cpp ;
Each call to the 'exe' rule defines a new main target
alternative for the main target a.exe. In this case, the
first alternative will be used for the gcc toolset, while the
second alternative will be used in other cases. TODO: document the exact
selection method under "Build process" below.
Target identifier is used to denote a target. It is described by the following grammar:
target-id -> project-reference local-target-name
project-reference -> [jamfile-location] [ "@" [project-id] ]
jamfile-location -> pathname
project-id -> pathname
local-target-name -> identifier
For example, valid target ids might be:
a
lib/b
@/boost/thread
/home/ghost/build/lr_library@parser/lalr1
To map the target id into target, the project where that target is
contained is first found:
Target reference is used to specify a source target, and may additionally specify desired properties for that target. It has this syntax:
target-reference -> target-id [ "/" requested-properties ]
requested-properties -> property-path
For example,
exe compiler : compiler.cpp libs/cmdline/<optimization>space ;
would cause the version of cmdline library, optimized to space,
to be linked in even if the compile executable is build with
speed optimization.
Target reference may have the same form as a pathname, for example lib/a. In order to determine if this is target reference or pathname, it is checked if there's a jamfile in the specified path. If there is one, it is loaded and if the specified target is declared by that project it is used. Otherwise, we just treat the target reference as file name.
The build works in this way. On startup, the project in the current directory is read. As the result a tree of projects is constructed. After that, the build request is constructed from the command line. Then, the steps are:
The dependency graph constructed for each target is build of so called "virtual targets", which do not yet correspond to jam's targets. It is therefore converted to jam's dependency graph which is then build.
The paths for build targets are determined with a method having two properties. First, non-free features are represented in path. Second, free features are not represented in path (because that would make them overly long), but two targets with different free features are never mixed. Each project has a base directory for all its target.
Path for each target is relative to the base and has two components. The first component represents all non-free features used to build the target. If the set of free properties used to build the target is equal to the set of free properties in the project's requirements, then the second component is empty. Otherwise, the second part has the form "main_target-<name>", where "name" is the name of main target which build required the current target.
For example, we might have these paths:
debug/optimization-off
debug/main-target-a
Last modified: July 7, 2002
© Copyright Vladimir Prus 2002. Permission to copy, use, modify, sell and distribute this document is granted provided this copyright notice appears in all copies. This document is provided ``as is'' without express or implied warranty, and with no claim as to its suitability for any purpose.