到目前为止,我们只考虑了一个项目、一个用户编写的 Boost.Jam 文件(Jamroot
)的示例。一个典型的大的代码库将由许多组织成树状结构的项目组成。树的顶端称为项目根目录。每个子项目由项目根目录的子目录中的名为Jamfile
的文件定义。子项目的父项目由祖先目录中最近的Jamfile
或Jamroot
文件定义。例如,在以下目录布局中
top/ | +-- Jamroot | +-- app/ | | | +-- Jamfile | `-- app.cpp | `-- util/ | +-- foo/ . | . +-- Jamfile . `-- bar.cpp
项目根目录是top/
。 top/app/
和top/util/foo/
中的项目是根项目的直接子项目。
当我们提到“Jamfile”(以普通字体设置)时,指的是名为Jamfile
或Jamroot
的文件。当我们需要更具体时,文件名将设置为“Jamfile
”或“Jamroot
”。
项目从其父项目继承所有属性(例如需求)。继承的需求与子项目指定的任何需求相结合。例如,如果top/Jamroot
具有
<include>/home/ghost/local
在其需求中,则其所有子项目也将将其包含在其需求中。当然,任何项目都可以向其父项目指定的那些路径中添加包含路径。[2]更多详细信息可以在名为“项目”的部分中找到。
在命令行上未明确指定任何目标的情况下调用b2将构建以当前目录为根的项目。构建项目不会自动导致其子项目被构建,除非父项目的 Jamfile 明确请求构建。在我们的示例中,top/Jamroot
可能包含
build-project app ;
这将导致top/app/
中的项目在top/
中的项目构建时被构建。但是,top/util/foo/
中的目标只有在top/
或top/app/
中的目标需要时才会被构建。