生成表达式用于在构建时对表达式进行求值。这些信息由于在撰写 CMakeLists.txt 文件时无法获得,因此被延迟到构建时。
生成表达式在很多基于 目标 (Target)
的上下文中可用。
生成表达式允许嵌套
条件表达式
条件表达式有两种语法:
$<condition:true_string>
$<IF:condition,true_string,false_string>
例如:
$<$<CONFIG:Debug>:DEBUG_MODE>
$<IF:$<CONFIG:Debug>,debug,minirelease>
查询目标信息
在查询目标信息时常用的几个表达式为:
表达式 | 作用 |
---|---|
$<TARGET_FILE:tgt> | 查询 tgt 二进制文件的绝对路径 |
$<TARGET_FILE_BASE_NAME:tgt> | tgt 没有前缀和后缀的名字 |
$<TARGET_FILE_PREFIX:tgt> | tgt 文件名的前缀(例如 lib) |
$<TARGET_FILE_SUFFIX:tgt> | tgt 文件的后缀名 |
$<TARGET_FILE_NAME:tgt> | tgt 二进制的文件名 |
$<TARGET_PROPERTY:tgt,prop> | tgt 的 prop 属性 |
$<TARGET_RUNTIME_DLLS:tgt> | tgt 依赖的动态库 |
$<INSTALL_PREFIX:tgt> | tgt 安装时的前缀 |
例如:我们将目标 main 的依赖的动态库拷贝到其二进制路径下:
find_package(foo REQUIRED)
add_executable(exe main.c)
target_link_libraries(exe PRIVATE foo::foo foo::bar)
add_custom_command(TARGET exe POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_RUNTIME_DLLS:exe> $<TARGET_FILE_DIR:exe>
COMMAND_EXPAND_LISTS
)
调试
由于生成表达式是在构建系统生成时求值,而不是在处理 CMakeLists.txt 文件时。因此无法使用命令 message() 查看它们的结构。
对它们调试的一种可行方法时添加一个自定义的目标
add_custom_target(admonitiondebug COMMAND ${CMAKE_COMMAND} -E echo "$<...>")
shell 命令 make admonitiondebug (在调用 cmake 后调用)将打印 $<…> 的结构。
另一种方式时将调试信息写到文件中:
file(GENERATE OUTPUT filename CONTENT "$<...>")