我已经努力了很长时间去理解CMake中类似 generator expressions,例如$<xxx:yy>
的好处以及何时如何使用它们。
有人能够用一些示例来清晰地解释吗?
提前致谢。
我已经努力了很长时间去理解CMake中类似 generator expressions,例如$<xxx:yy>
的好处以及何时如何使用它们。
有人能够用一些示例来清晰地解释吗?
提前致谢。
CMake首先解析项目中的CMakeLists.txt文件 - 称为“配置阶段” - 然后生成构建环境 - 称为“生成阶段”。
因此,生成器表达式仅用于生成器才能知道的所有内容:
以下是我在项目中使用生成器表达式的示例:
将文件复制到可执行文件旁边(在多配置环境中,您不能仅使用像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>"
)
add_custom_command(
TARGET myBinary
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy
"${CMAKE_CURRENT_SOURCE_DIR}/myTest.txt"
"$<TARGET_FILE_DIR:myBinary>/myTest.txt"
)
区分例如DEBUG
或RELEASE
配置
add_compile_options("$<$<CONFIG:DEBUG>:/MDd>")
对于CMake,你能通过`add_compiler_flags()`命令修改发布/调试编译器标志吗?
使用`TARGET_PROPERTY`生成器表达式,您可以做很多事情,例如:
file(GENERATE
OUTPUT "includes.txt"
CONTENT "$<TARGET_PROPERTY:motor,INCLUDE_DIRECTORIES>\n"
)
CMAKE_CURRENT_BINARY_DIR
”,为什么? - Shlomo Gottlieb
$<xxx:yy>
几乎占了生成器表达式的一半用法。简而言之,如果生成器表达式xxx
被计算为真(布尔值),则使用生成器表达式yy
的值。否则,将使用空字符串。这种表达式的有用性在于:当左侧生成器表达式的值取决于配置选项,并且构建系统支持多配置(例如 Visual Studio)时,这种表达式无法用if
重写,因为此阶段不知道具体的配置。 - Tsyvarev