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>>”
)