Step 4: Adding Generator Expressions

Generator expressions在构建系统生成期间进行评估,以生成特定于每个构建配置的信息。

Generator expressions在许多目标属性的上下文中都是允许的,例如LINK_LIBRARIES, INCLUDE_DIRECTORIES,COMPILE_DEFINITIONS和其他。它们还可以用于使用命令填充这些属性,例如 target_link_libraries(),target_include_directories(), target_compile_definitions()和别的。

Generator expressions 可用于启用条件链接、编译时使用的条件定义、条件包含目录等。条件可以基于构建配置、目标属性、平台信息或任何其他可查询信息。

有不同类型的 generator expressions包括逻辑、信息和输出表达式。

逻辑表达式用于创建条件输出。基本表达式是0和1表达式。A 的 < 0 : . . . > 结果为空字符串,而 <0:...>结果为空字符串,而 <0:...>结果为空字符串,而<1:…>的结果为 的内容…。它们也可以嵌套。

练习 1 - 使用生成器表达式添加编译器警告标志
常见用法 generator expressions有条件地添加编译器标志,例如语言级别或警告标志。一个很好的模式是将此信息与INTERFACE 允许此信息传播的目标相关联。

目标
在构建时添加编译器警告标志,但不针对已安装的版本添加。

有用的资源
cmake-generator-expressions(7)

cmake_minimum_required()

set()

target_compile_options()

要编辑的文件
CMakeLists.txt

入门
打开文件Step4/CMakeLists.txt并通过 完成。TODO 1TODO 4

首先,在顶层CMakeLists.txt文件中,我们需要设置 cmake_minimum_required()至3.15。在本练习中,我们将使用 CMake 3.15 中引入的生成器表达式。

接下来,我们为项目添加所需的编译器警告标志。由于警告标志因编译器而异,我们使用 COMPILE_LANG_AND_ID生成器表达式来控制在给定语言和一组编译器 ID 的情况下应用哪些标志。

构建并运行
创建一个名为的新目录Step4_build,运行cmake 可执行文件或cmake-gui配置项目,然后使用您选择的构建工具或从 构建目录中使用来构建它。cmake --build .

mkdir Step4_build
cd Step4_build
cmake …/Step4
cmake --build .
解决方案
更新cmake_minimum_required()至少需要 CMake 版本3.15:

TODO 1:单击显示/隐藏答案
TODO 1:CMakeLists.txt
cmake_minimum_required(VERSION 3.15)
接下来,我们确定系统当前使用哪个编译器进行构建,因为警告标志根据我们使用的编译器而有所不同。这是通过COMPILE_LANG_AND_ID生成器表达式完成的。我们将结果设置在变量中gcc_like_cxx,msvc_cxx如下所示:

TODO 2:单击显示/隐藏答案
TODO 2:CMakeLists.txt
set(gcc_like_cxx “ < C O M P I L E L A N G A N D I D : C X X , A R M C l a n g , A p p l e C l a n g , C l a n g , G N U , L C C > " ) s e t ( m s v c c x x " <COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU,LCC>") set(msvc_cxx " <COMPILELANGANDID:CXX,ARMClang,AppleClang,Clang,GNU,LCC>")set(msvccxx"<COMPILE_LANG_AND_ID:CXX,MSVC>”)
接下来,我们为项目添加所需的编译器警告标志。使用我们的变量gcc_like_cxx和msvc_cxx,我们可以使用另一个生成器表达式,仅当变量为真时才应用相应的标志。我们使用target_compile_options()将这些标志应用到我们的界面库。

TODO 3:单击显示/隐藏答案
TODO 3:CMakeLists.txt
target_compile_options(tutorial_compiler_flags INTERFACE
< < <{gcc_like_cxx}:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>”
< < <{msvc_cxx}:-W3>”
)
最后,我们只希望在构建期间使用这些警告标志。我们已安装项目的使用者不应继承我们的警告标志。为了指定这一点,我们使用条件将 TODO 3 中的标志包装在生成器表达式中 BUILD_INTERFACE。生成的完整代码如下所示:

TODO 4:单击显示/隐藏答案
TODO 4:CMakeLists.txt
target_compile_options(tutorial_compiler_flags INTERFACE
< < <{gcc_like_cxx}: < B U I L D I N T E R F A C E : − W a l l ; − W e x t r a ; − W s h a d o w ; − W f o r m a t = 2 ; − W u n u s e d > > " " <BUILD_INTERFACE:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>>" " <BUILDINTERFACE:Wall;Wextra;Wshadow;Wformat=2;Wunused>>""< m s v c c x x : {msvc_cxx}: msvccxx:<BUILD_INTERFACE:-W3>>”
)

  • 13
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值