在您描述了目标后,您希望 Boost.Build 运行正确的工具并创建所需的目标。本节将描述两件事:如何指定要构建的内容,以及主目标是如何构建的。
需要注意的最重要的一点是,在 Boost.Build 中,与其他构建工具不同,您声明的目标并不对应于特定的文件。您在 Jamfile 中声明的内容更像是一个“元目标”。根据您在命令行上指定的属性,每个元目标将生成一组对应于请求属性的实际目标。同一个元目标很可能用不同的属性构建多次,生成不同的文件。
这意味着对于 Boost.Build,您无法直接从 Jamfile 中获取构建变体。用户可能请求多个变体,并且每个目标都可以使用不同的属性构建。
命令行指定要构建的目标以及使用哪些属性。例如
b2 app1 lib1//lib1 toolset=gcc variant=debug optimization=full
将使用指定的属性构建两个目标,“app1” 和 “lib1//lib1”。您可以使用目标标识符引用任何目标并指定任意属性。某些属性非常常见,对于这些属性,可以省略属性名称。例如,以上可以写成
b2 app1 lib1//lib1 gcc debug optimization=full
完整的语法(有一些额外的快捷方式)在名为“调用”的部分中进行了描述。
当您直接或间接请求构建具有特定要求的主目标时,将执行以下步骤。提供了一些简要说明,更多详细信息在名为“构建流程”的部分中给出。
应用默认构建。如果目标的 default-build 属性指定了构建请求中不存在的功能的值,则会添加该值。
选择要使用的主目标替代方案。对于每个替代方案,我们查看在替代方案的要求和构建请求中都存在多少个属性。选择匹配属性数量最多的替代方案。
确定“通用”属性。构建请求使用目标的要求进行细化。要求中的条件属性也将被处理。最后,添加功能的默认值。
构建源列表和依赖属性引用的目标。源列表和属性可以使用目标引用引用其他目标。对于每个引用,我们获取所有传播的属性,通过目标引用中指定的显式属性对其进行细化,并将生成的属性作为构建请求传递给其他目标。
将构建依赖项时产生的使用要求添加到“通用”属性中。当在先前步骤中构建依赖项时,它们会返回创建的“实际”目标集和使用要求。使用要求将添加到通用属性中,生成的属性集将用于构建当前目标。
使用生成器构建目标。为了将源代码转换为所需的类型,Boost.Build 使用“生成器”——对应于编译器和链接器等工具的对象。每个生成器声明它可以生成哪种类型的目标以及它需要哪种类型的源代码。使用此信息,Boost.Build 确定必须运行哪些生成器才能从特定源代码生成特定目标。当生成器运行时,它们会返回“实际”目标。
计算要返回的使用要求。展开使用要求中的条件属性并返回结果。