CMake TARGET_NAME生成器表达式

时间:2018-07-08 11:45:42

标签: cmake

CMake documentation describing generator expressions中有以下段落:

  

$<TARGET_NAME:...>

     

...标记为目标名称。 如果将目标导出到多个相关的导出集,这是必需的...必须是目标的文字名称-它不能包含生成器表达式。

我试图理解突出显示的部分。

首先,我想看看我是否正确理解了依赖导出集的概念。如果目标B取决于目标A,并且导出集 EXP_A是否包含目标A导出集 {{ 1}}包含目标EXP_B,则导出集 B取决于导出集 EXP_B。这是正确的吗?

为什么EXP_A是否需要将目标导出到多个从属导出集”?

谢谢。

1 个答案:

答案 0 :(得分:0)

我不确定“多个依赖导出集”是什么意思。我查看了他们的测试套件,找不到类似的东西。这也让我很困惑。

但是,我可以举一个例子,说明 $<TARGET_NAME:...> 确实做了一些事情。考虑:

cmake_minimum_required(VERSION 3.20)
project(test)

add_library(define_a INTERFACE)
target_compile_definitions(define_a INTERFACE A)

add_library(define_a_tgt INTERFACE)
target_compile_definitions(define_a_tgt INTERFACE "A_TGT=\"$<TARGET_NAME:define_a>\"")

include(GNUInstallDirs)

install(TARGETS define_a define_a_tgt EXPORT test)
install(
  EXPORT test
  DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/test
  FILE test-config.cmake
  NAMESPACE test::
)

这里,我们有两个愚蠢的 INTERFACE 库。第一个 define_a 只是将 -DA 传播到链接到它的目标。第二个,define_a_tgt 添加 A_TGT 的定义,使其等于包含目标 define_a 名称的 string

在构建界面中,这将扩展为简单的 define_a,但在导出后,CMake 会将 $<TARGET_NAME:define_a> 替换为 test::define_a(由于 NAMESPACE 参数为install(EXPORT)).

这有点做作,但它确实显示了一个实例,其中 CMake 还没有意识到正在命名目标(它会自动转换 target_link_libraries 目标,没有这个基因)。另一个例子是inside 其他生成器表达式(甚至在 target_link_libraries 中)。