[CMake翻译]添加生成器表达式(步骤10)

1,297 阅读1分钟

原文地址:cmake.org/cmake/help/…

原文作者:

发布时间:

生成器表达式在构建系统生成过程中被评估,以产生针对每个构建配置的信息。

生成器表达式被允许用于许多目标属性,如LINK_LIBRARIESINCLUDE_DIRECTORIESCOMPILE_DEFINITIONS等。它们也可以在使用命令来填充这些属性时使用,如 target_link_libraries()target_include_directories()target_compile_definitions()等。

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

有不同类型的生成器表达式,包括逻辑表达式、信息表达式和输出表达式。

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

生成器表达式的一个常见用法是有条件地添加编译器标志,例如语言级别或警告的标志。一个很好的模式是将这些信息关联到一个INTERFACE目标,允许这些信息传播。让我们从构造一个INTERFACE目标开始,并指定所需的C++标准级别为11,而不是使用CMAKE_CXX_STANDARD

所以下面的代码。

# specify the C++ standard
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED True)

将被替换为

add_library(tutorial_compiler_flags INTERFACE)
target_compile_features(tutorial_compiler_flags INTERFACE cxx_std_11)

接下来,我们为我们的项目添加我们想要的编译器警告标志。由于警告标志根据编译器的不同而不同,我们使用COMPILE_LANG_AND_ID生成器表达式来控制给定的语言和一组编译器ID应用哪些标志,如下所示。

set(gcc_like_cxx "$<COMPILE_LANG_AND_ID:CXX,ARMClang,AppleClang,Clang,GNU>")
set(msvc_cxx "$<COMPILE_LANG_AND_ID:CXX,MSVC>")
target_compile_options(tutorial_compiler_flags INTERFACE
  "$<${gcc_like_cxx}:$<BUILD_INTERFACE:-Wall;-Wextra;-Wshadow;-Wformat=2;-Wunused>>"
  "$<${msvc_cxx}:$<BUILD_INTERFACE:-W3>>"
)

从这里我们可以看到,警告标志被封装在BUILD_INTERFACE条件中。这样做是为了使我们安装的项目的消费者不会继承我们的警告标志。

练习:修改MathFunctions/CMakeLists.txt 使所有目标都有一个target_link_libraries() 调用tutorial_compiler_flags


www.deepl.com 翻译