Boost C++ 库

...世界上最受推崇和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

PrevUpHomeNext

构建时配置

有时您可能希望根据编译器支持的功能来控制是否构建某个构建目标。例如,假设您有一个测试文件 "test_constexpr_128.cpp",它需要以下三个关键功能才能构建

显然,我们知道如果编译器不支持这些功能,那么甚至尝试构建测试程序也是没有意义的。 主要优点是

回到我们的示例,测试用例可能在其 Jamfile 中通过 "run" 规则执行

run test_constexpr_128.cpp ;

我们现在需要使此目标依赖于必要的功能。我们可以通过首先在 Jamfile 的开头导入必要的规则来做到这一点

import path-to-config-lib/checks/config : requires ;

假设测试用例在通常的目录中

libs/yourlib/test

那么导入规则实际上将是

import ../../config/checks/config : requires ;

然后将 "requires" 规则调用添加到目标的需求部分

run test_constexpr_128.cpp
   : : : #requirements:
   [ requires cxx11_constexpr cxx11_user_defined_literals int128 ] ;

请注意,可以向 requires 规则添加多个参数,并且这些参数始终与 Boost.Config 宏名称相同,但采用小写形式,并删除了 boost_no_boost_has_ 前缀。您还可以使用任何 C++ 标准功能宏名称,并删除前导下划线(详见下文)。

在构建上述示例时,您将在构建过程的开始看到配置结果,例如 C++11 模式下的 GCC 给出

- Boost.Config Feature Check: int128 : yes
- Boost.Config Feature Check: cxx11_constexpr : yes
- Boost.Config Feature Check: cxx11_user_defined_literals : yes

如果您希望使构建依赖于 C++ 标准功能宏,您也可以指定这些宏,只需从名称中删除前导下划线即可。例如

[ requires cpp_constexpr ]

要求 C++11 风格的常量表达式。如果您想指定来自特定标准的宏,则在后面附加一个下划线,后跟标准年份的(2 位)数字,例如

[ requires cpp_constexpr_17 ]

对于 C++17 constexpr。如果您不指定标准,那么您将获得引入该宏的第一个版本。此外,每个宏版本升级只有特定于标准的规则,因此

[ requires cpp_if_constexpr_17 ]

可以正常工作,因为该宏是在 C++17 中引入的,并且与未版本化的名称相同,但是

[ requires cpp_if_constexpr_20 ]

将导致构建错误,因为 __cpp_if_constexpr 没有 C++20 版本升级。

这就是这个方便功能的所有内容,如果您在任何时候不确定可以传递给 "requires" 规则的功能测试名称,请在 libs/config/checks/Jamfiles.v2 中搜索您感兴趣的 Boost.Config 宏,功能检查的名称将跟随其后。

最后,此功能围绕 Boost.Build 内置规则 check-target-builds 构建,该规则可用于执行更通用的构建时功能测试。此库中的检查作为方便的简写形式提供,无需您自己编写测试用例。


PrevUpHomeNext