Cmake生成器表达式

时间:2017-09-13 20:41:05

标签: c++ cmake

我长时间尝试了解generator expressions的好处,例如$<xxx:yy>在CMake中的好处,何时以及如何使用它们。 任何人都可以通过一些例子清楚地解释清楚。 非常感谢提前

1 个答案:

答案 0 :(得分:17)

CMake首先解析项目中的CMakeLists.txt文件 - 名为&#34;配置阶段&#34; - 然后它会生成您的构建环境 - 命名为&#34; Generation Phase&#34;。

所以基本上生成器表达式只适用于生成器可以知道的所有内容:

  • 目标输出的名称和路径(主要在交叉编译和多配置环境中)
  • 或者更一般地说,生成器评估的任何目标属性将编译器/链接器调用混合在一起

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

  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 post-build-event: copy compiled libraries

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

    how do I add external test files to a cmake project

  2. 区分,例如DEBUGRELEASE配置

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

    For Cmake, can you modify the release/debug compiler flags with `add_compiler_flags()` command?

    Modern way to set compiler flags in cross-platform cmake project

  3. 使用TARGET_PROPERTY生成器表达式,您可以执行很多操作,例如

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

    CMake doesn't pick up INTERFACE_INCLUDE_DIRECTORIES of linked library