Boost C++ 库

...全球最受推崇和设计精良的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ 编码标准

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++ 标准功能宏名称,并去除开头的下划线(参见下文)。

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

- 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 样式的常量表达式。如果您想指定来自特定标准的宏,那么您需要在后面追加一个下划线,然后是标准的(两位数字)年份,例如

[ requires cpp_constexpr_17 ]

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

[ 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