######################################## 生成表达式 ######################################## .. seealso:: - `cmake-generator-expressions(7) `_ - `digikam-plugins-demo/CMakeLists.txt `_ 生成表达式用于在构建时对表达式进行求值。这些信息由于在撰写 CMakeLists.txt 文件时无法获得,因此被延迟到构建时。 生成表达式在很多基于 :abbr:`目标 (Target)` 的上下文中可用。 生成表达式允许嵌套 布尔生成表达式 ============================= 布尔生成表达式的求值结果为 ``0`` 或 ``1`` 。它们一般在 条件生成表达式_ 中使用。 .. _条件生成表达式: https://cmake.org/cmake/help/latest/manual/cmake-generator-expressions.7.html#conditional-generator-expressions 查询目标信息 **************************************** 在查询目标信息时常用的几个表达式为: +------------------------------+-------------------------------+ | 表达式名 | 作用 | +==============================+===============================+ | $ | 查询 tgt 二进制文件的绝对路径 | +------------------------------+-------------------------------+ | $ | tgt 没有前缀和后缀的名字 | +------------------------------+-------------------------------+ | $ | tgt 文件名的前缀(例如 lib) | +------------------------------+-------------------------------+ | $ | tgt 文件的后缀名 | +------------------------------+-------------------------------+ | $ | tgt 二进制的文件名 | +------------------------------+-------------------------------+ | $ | tgt 的 prop 属性 | +------------------------------+-------------------------------+ | $ | tgt 依赖的动态库 | +------------------------------+-------------------------------+ | $ | tgt 安装时的前缀 | +------------------------------+-------------------------------+ 例如:我们将目标 *main* 的依赖的动态库拷贝到其二进制路径下: .. code-block:: cmake 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 $ $ COMMAND_EXPAND_LISTS ) 调试 **************************************** 由于生成表达式是在构建系统生成时求值,而不是在处理 *CMakeLists.txt* 文件时。因此无法使用命令 *message()* 查看它们的结构。 对它们调试的一种可行方法时添加一个自定义的目标 .. code-block:: cmake add_custom_target(admonitiondebug COMMAND ${CMAKE_COMMAND} -E echo "$<...>") shell 命令 *make admonitiondebug* (在调用 *cmake* 后调用)将打印 *$<...>* 的结构。 另一种方式时将调试信息写到文件中: .. code-block:: cmake file(GENERATE OUTPUT filename CONTENT "$<...>")