生成表达式
生成表达式用于在构建时对表达式进行求值。这些信息由于在撰写 CMakeLists.txt 文件时无法获得,因此被延迟到构建时。
生成表达式在很多基于 目标 的上下文中可用。
生成表达式允许嵌套
布尔生成表达式
布尔生成表达式的求值结果为 0 或 1 。它们一般在 条件生成表达式 中使用。
查询目标信息
在查询目标信息时常用的几个表达式为:
表达式名 |
作用 |
|---|---|
$<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 "$<...>")