为了便携地表示目标配置的各个方面,例如调试和发布版本,或者单线程和多线程构建,Boost.Build 使用带有关联值的特性。例如,debug-symbols
特性可以具有 on
或 off
的值。一个属性只是一个 (特性,值) 对。当用户启动构建时,Boost.Build 会自动将请求的属性转换为适当的命令行标志,用于调用工具集组件,例如编译器和链接器。
有许多内置特性可以组合起来生成任意构建配置。以下命令构建项目的 release
版本,禁用内联并启用调试符号
b2 release inlining=off debug-symbols=on
命令行上的属性使用以下语法指定
feature-name
=feature-value
我们在 b2 调用中看到的 release
和 debug
只是指定 variant
特性的值的简写方式。例如,上面的命令也可以这样写
b2 variant=release inlining=off debug-symbols=on
variant
非常常用,因此被赋予了隐式特性的特殊状态—— Boost.Build 只会从它的值之一的名称中推断出它的身份。
可以在名为“特性和属性”的部分中找到特性的完整描述。
命令行上指定的属性集构成了一个构建请求——对构建请求的目标 (或如果没有明确请求目标,则为当前目录中的项目) 的所需属性的描述。构建目标实际使用的属性通常是构建请求和从项目 Jamroot
(及其其他 Jamfile,如名为“项目层次结构”的部分中所述) 中派生的属性的组合。例如,#include
的头文件的路径通常不是在命令行上指定的,而是在 Jamfile 中作为目标需求来描述,并自动与这些目标的构建请求组合。启用多线程编译是典型的目标需求的另一个示例。下面的 Jamfile 片段说明了这些需求是如何指定的。
exe hello : hello.cpp : <include>boost <threading>multi ;
当构建 hello
时,上面指定的两个需求将始终存在。如果 b2 命令行上给出的构建请求明确地与目标的需求相矛盾,那么目标的需求通常会覆盖 (或者在 <include>
这样的“自由”特性的情况下,[1] 增强) 构建请求。
<include>
特性的值相对于使用它的 Jamroot
的位置。
如果我们希望对另一个目标 hello2
使用相同的需求,我们可以简单地复制它们。但是,随着项目的增长,这种方法会导致 Jamfile 中出现大量重复的样板代码。幸运的是,有一种更好的方法。每个项目都可以指定一组属性,包括需求
project : requirements <include>/home/ghost/Work/boost <threading>multi ; exe hello : hello.cpp ; exe hello2 : hello.cpp ;
其效果就像我们为 hello
和 hello2
都指定了相同的需求。