Cmake生成器表达式

48

我已经努力了很长时间去理解CMake中类似 generator expressions,例如$<xxx:yy> 的好处以及何时如何使用它们。 有人能够用一些示例来清晰地解释吗? 提前致谢。


有人能清楚地解释一下吗?“太宽泛了。应该有人重复CMake文档(https://cmake.org/cmake/help/v3.9/manual/cmake-generator-expressions.7.html)吗?或者其他手册?否则,请解释您不理解的**具体内容**,例如哪个表达式或哪个示例。” - Tsyvarev
3
@Tsyvarev,我添加了那部分我不理解的文档。 - Mauri
6
$<xxx:yy> 几乎占了生成器表达式的一半用法。简而言之,如果生成器表达式 xxx 被计算为真(布尔值),则使用生成器表达式 yy 的值。否则,将使用空字符串。这种表达式的有用性在于:当左侧生成器表达式的值取决于配置选项,并且构建系统支持多配置(例如 Visual Studio)时,这种表达式无法用 if 重写,因为此阶段不知道具体的配置。 - Tsyvarev
1个回答

44

CMake首先解析项目中的CMakeLists.txt文件 - 称为“配置阶段” - 然后生成构建环境 - 称为“生成阶段”。

因此,生成器表达式仅用于生成器才能知道的所有内容:

  • 目标输出的名称和路径(主要用于交叉编译和多配置环境下)
  • 或者更一般地,任何目标属性,生成器通过混合编译器/链接器调用来进行评估

以下是我在项目中使用生成器表达式的示例:

  1. 将文件复制到可执行文件旁边(在多配置环境中,您不能仅使用像CMAKE_CURRENT_BINARY_DIR这样的变量)

add_custom_command(
    TARGET library1 
    POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E copy
        "$<TARGET_FILE:library1>"
        "$<TARGET_FILE_DIR:mainProject>/$<TARGET_FILE_NAME:library1>"
)

CMake后期构建事件: 复制编译好的库

add_custom_command(
    TARGET myBinary 
    POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy  
                     "${CMAKE_CURRENT_SOURCE_DIR}/myTest.txt" 
                     "$<TARGET_FILE_DIR:myBinary>/myTest.txt"
)

如何将外部测试文件添加到CMake项目中

  • 区分例如DEBUGRELEASE配置

  • add_compile_options("$<$<CONFIG:DEBUG>:/MDd>")
    

    对于CMake,你能通过`add_compiler_flags()`命令修改发布/调试编译器标志吗?

    在跨平台的CMake项目中设置编译器标志的现代方法

  • 使用`TARGET_PROPERTY`生成器表达式,您可以做很多事情,例如:

    file(GENERATE 
        OUTPUT "includes.txt" 
        CONTENT "$<TARGET_PROPERTY:motor,INCLUDE_DIRECTORIES>\n"
    )
    

    CMake不会捕获链接库的INTERFACE_INCLUDE_DIRECTORIES


  • 3
    在第1点中,您说“在多配置环境中,您不能仅使用变量CMAKE_CURRENT_BINARY_DIR”,为什么? - Shlomo Gottlieb

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接