So far we have only considered examples with one project, with
one user-written Boost.Jam file, Jamroot
. A typical
large codebase would be composed of many projects organized into a tree.
The top of the tree is called the project root.
Every subproject is defined by a file called Jamfile
in a descendant directory of the project root. The parent project of a
subproject is defined by the nearest Jamfile
or
Jamroot
file in an ancestor directory. For example,
in the following directory layout:
top/ | +-- Jamroot | +-- app/ | | | +-- Jamfile | `-- app.cpp | `-- util/ | +-- foo/ . | . +-- Jamfile . `-- bar.cpp
the project root is top/
. The projects in
top/app/
and top/util/foo/
are
immediate children of the root project.
When we refer to a “Jamfile,” set in normal
type, we mean a file called either
Jamfile
or
Jamroot
. When we need to be more
specific, the filename will be set as
“Jamfile
” or
“Jamroot
.”
Projects inherit all attributes (such as requirements)
from their parents. Inherited requirements are combined with
any requirements specified by the subproject.
For example, if top/Jamroot
has
<include>/home/ghost/local
in its requirements, then all of its subprojects will have it in their requirements, too. Of course, any project can add include paths to those specified by its parents. [2] More details can be found in the section called “Projects”.
Invoking b2 without explicitly specifying
any targets on the command line builds the project rooted in the
current directory. Building a project does not automatically
cause its subprojects to be built unless the parent project's
Jamfile explicitly requests it. In our example,
top/Jamroot
might contain:
build-project app ;
which would cause the project in top/app/
to be built whenever the project in top/
is
built. However, targets in top/util/foo/
will be built only if they are needed by targets in
top/
or top/app/
.
[2] Many features will be overridden, rather than added-to, in subprojects. See the section called “Feature Attributes” for more information