Boost C++ Libraries

PrevUpHomeNext

第 3 章 概述

目录

概念
Boost.Jam 语言
配置
调用
声明目标
项目
构建流程

本节将提供使用 Boost.Build 创建您自己的项目所需的信息。这里提供的信息是比较高级别的,请参阅第 5 章,参考以及在线帮助系统以获取低级别文档(请参阅 --help)。

Boost.Build 包含两个部分:一个具有自己的解释型语言的构建引擎,以及用该语言实现的 Boost.Build 本身。当您在命令行上键入 b2 时,事件链如下所示

  1. Boost.Build 可执行文件尝试查找 Boost.Build 模块并加载顶级模块。具体过程在名为“初始化”的部分中描述

  2. 顶级模块加载用户定义的配置文件,user-config.jamsite-config.jam,这些文件定义可用的工具集。

  3. 读取当前目录中的 Jamfile。这反过来可能会导致读取其他 Jamfile。结果,将创建一个项目树,其中包含项目内部的目标。

  4. 最后,使用命令行上指定的构建请求,Boost.Build 决定应构建哪些目标以及如何构建。该信息将传递回 Boost.Jam,Boost.Jam 负责实际运行计划的构建操作命令。

因此,要能够成功使用 Boost.Build,您只需要了解四件事

概念

Boost.Build 有一些独特概念,在本节中将介绍这些概念。解释这些概念的最佳方法是与更经典的构建工具进行比较。

使用任何版本的 make 时,您直接指定目标和用于从其他目标创建它们的命令。以下示例使用硬编码的编译器调用命令从 a.c 创建 a.o

a.o: a.c
    g++ -o a.o -g a.c

这是一个相当低级别的描述机制,很难根据使用的编译器和操作系统调整命令、选项和创建的目标集。

为了提高可移植性,大多数现代构建系统提供了一组可以在构建描述文件中使用的高级函数。考虑以下示例

add_program ("a", "a.c")

这是一个函数调用,它创建了从源文件 a.c 创建可执行文件所需的目标。根据配置的属性,可能会使用不同的命令行。但是,add_program 是更高级别的,但相当薄弱的级别。所有目标在解析构建描述时立即创建,这使得无法执行多变体构建。通常,任何构建属性的更改都需要对构建树进行完全重新配置。

为了支持真正的多变体构建,Boost.Build 引入了 元目标的概念,这是一个在解析构建描述时创建的对象,可以稍后使用特定的构建属性来生成实际目标。

考虑以下示例

exe a : a.cpp ;

解析此声明时,Boost.Build 会创建一个元目标,但尚未决定必须创建哪些文件或必须使用哪些命令。解析完所有构建文件后,Boost.Build 会考虑命令行上请求的属性。假设您使用以下命令调用了 Boost.Build

b2 toolset=gcc toolset=msvc

在这种情况下,元目标将被调用两次,一次使用 toolset=gcc,一次使用 toolset=msvc。这两个调用都将生成具体的目标,这些目标将具有不同的扩展名并使用不同的命令行。

另一个关键概念是 构建属性。构建属性是一个影响构建过程的变量。它可以在命令行上指定,并在调用元目标时传递。虽然所有构建工具都具有类似的机制,但 Boost.Build 的区别在于它要求所有构建属性都必须预先声明,并提供一组具有可移植语义的大量属性。

最后一个概念是 属性传播。Boost.Build 不要求每个元目标都使用相同的属性调用。相反,将使用命令行上指定的属性调用“顶级”元目标。每个元目标都可以选择增加或覆盖某些属性(特别是使用要求机制,请参阅名为“要求”的部分)。然后,使用修改后的属性调用依赖关系元目标,并生成具体的目标,这些目标随后在构建过程中使用。当然,依赖关系元目标可能反过来修改构建属性并拥有自己的依赖关系。

有关要求和概念的更深入说明,请参阅SYRCoSE 2009 Boost.Build 文章


PrevUpHomeNext