我长时间尝试了解generator expressions的好处,例如$<xxx:yy>
在CMake中的好处,何时以及如何使用它们。
任何人都可以通过一些例子清楚地解释清楚。
非常感谢提前
答案 0 :(得分:17)
CMake首先解析项目中的CMakeLists.txt
文件 - 名为&#34;配置阶段&#34; - 然后它会生成您的构建环境 - 命名为&#34; Generation Phase&#34;。
所以基本上生成器表达式只适用于生成器可以知道的所有内容:
以下是我在项目中使用生成器表达式的示例:
复制可执行文件旁边的文件(在多配置环境中,您只能使用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"
)
区分,例如DEBUG
或RELEASE
配置
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
使用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