生成表达式用于在构建时对表达式进行求值。这些信息由于在撰写 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 "$<...>")
Last moify: 2022-12-04 15:11:33
Build time:2025-07-18 09:41:42
Powered By asphinx