【问题标题】:Cmake generator expressionsCmake 生成器表达式
【发布时间】:2017-09-13 20:41:04
【问题描述】:

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

【问题讨论】:

  • Can anybody explain it clearly - 太宽泛了。有人应该重复CMake documentation吗?还是其他手册?否则,请解释究竟是什么你不明白的,例如哪个表达式,或者哪个例子。
  • @Tsyvarev 我添加了部分的文档,我不明白
  • $<xxx:yy> 几乎占所有生成器表达式的一半。简而言之:如果生成器表达式xxx 被评估为TRUE(作为布尔值),则使用生成器表达式yy 的值。否则,使用空字符串。这种表达式的用处是:当左边的生成器表达式的值取决于配置选项,并且构建系统支持多配置(例如Visual Studio),那么这种表达式不能用if重写,因为具体配置不知道在这个阶段。

标签: c++ cmake


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 2021-11-26
    相关资源
    最近更新 更多