构建过程的总体概述已在用户文档中给出。本节提供更多细节和一些特定规则。
概括地说,使用特定属性构建目标包括以下步骤
应用默认构建,
选择要使用的主要目标备选方案,
确定“公共”属性,
构建源列表和依赖属性引用的目标,
将构建依赖项时产生的使用需求添加到“公共”属性中,
使用生成器构建目标,
计算要返回的使用需求。
当存在多个备选方案时,必须选择其中一个。过程如下
“公共”属性是一个人为定义的术语。这些是从中派生依赖项的构建请求和构建目标的属性的中间属性集。
由于默认构建和备选方案已处理,因此我们只有两个输入:构建请求和需求。以下是关于公共属性的规则。
非自由特性只能有一个值
需求中的非条件属性始终存在于公共属性中。
构建请求中的属性存在于公共属性中,除非 (2) 另有说明。
如果构建请求或需求(非条件或条件)包含可扩展属性(复合属性或指定子特性值的属性),则其行为等效于将所有扩展属性显式添加到构建请求或需求中。
如果需求包含条件属性,并且该属性的条件在公共属性的上下文中为真,则条件属性也应在公共属性中。
如果此处其他规则未给出特性的值,则其在公共属性中具有默认值。
这些规则是声明性的,它们没有指定如何计算公共属性。但是,它们为用户提供了足够的信息。重点在于处理条件需求。条件可以通过构建请求中的属性、非条件需求,甚至可以通过另一个条件属性来满足。例如,以下示例按预期工作
exe a : a.cpp : <toolset>gcc:<variant>release <variant>release:<define>FOO ;
几个因素决定了具体文件目标的位置。项目中的所有文件都构建在 bin 目录下,除非 build-dir 项目属性将其覆盖。在 bin 下是一个路径,该路径取决于用于构建每个目标的属性。此路径由所有非自由、非偶然属性唯一确定。例如,给定一个包含以下属性集:<toolset>gcc <toolset-gcc:version>4.6.1 <variant>debug <warnings>all <define>_DEBUG <include>/usr/local/include <link>static
,路径将为 gcc-4.6.1/debug/link-static。<warnings> 是一个偶然特性,<define> 和 <include> 是自由特性,因此它们不影响路径。
有时,Boost.Build 生成的路径可能变得过长。有一些命令行选项可以帮助解决此问题。--abbreviate-paths 将每个元素缩减到不超过五个字符。例如,link-static 变成 lnk-sttc。--hash 选项使用 MD5 哈希将路径缩减到单个目录。
有两个特性会影响构建目录。<location> 特性完全覆盖默认构建目录。例如,
exe a : a.cpp : <location>. ;
将 a
生成的所有文件构建在 Jamfile 的目录中。通常不建议这样做,因为它排除了变体构建。
<location-prefix> 特性在项目构建目录下向路径添加前缀。例如,
exe a : a.cpp : <location-prefix>subdir ;
将在 bin/subdir/gcc-4.6.1/debug 中创建 a
的文件