如何使用CMake生成器表达式$ <target_file:tgt>?</target_file:tgt>

时间:2015-02-24 10:07:14

标签: cmake

我无法理解我做错了什么。 我总是得到字符串$<TARGET_FILE:tgt1>而不是图书馆的路径。

我创建了虚拟项目。

这是我的根CMakeLists.txt

cmake_minimum_required (VERSION 3.0) # also tried 2.8 with the same result
set(PROJECT_NAME CMP0026)

add_subdirectory(src)

set(TGT_PATH $<TARGET_FILE:tgt1>)
message(STATUS "${TGT_PATH}")

这是我的src / CMakeLists.txt

add_library(tgt1 a.c)

文件a.c已创建且为空

我尝试了以下生成器:Visual Studio 2013 Win64,Ninja和MingW Makefile。我从最后两个使用Android工具链,从here

下载

我希望最后一个message(STATUS命令可以打印到库的完整路径。但是,所有变体都会打印字符串$<TARGET_FILE:tgt1>

1 个答案:

答案 0 :(得分:40)

在配置时不评估生成器表达式(当CMake解析CMakeLists,执行add_target()message()等命令时)。此时,生成器表达式只是一个文字字符串 - 字符$后跟<,然后T,然后......

生成器表达式的评估发生在 generate 时(这就是为什么它们被称为“生成器表达式”)。在解析和处理所有CMake代码之后生成时间,并且CMake开始对其中的数据进行操作以生成构建系统文件。只有然后才能获得评估生成器表达式所需的所有信息。

因此,您只能将生成器表达式用于生成时或之后发生的事情(例如构建时)。一个人为的例子是:

add_custom_target(
  GenexDemo
  COMMAND ${CMAKE_COMMAND} -E echo "$<TARGET_FILE:tgt1>"
  VERBATIM
)

在配置时,CMake会将文字字符串$<TARGET_FILE:tgt1>记录为COMMAND的参数。然后在生成时(当每个配置知道tgt1的位置并且保证不再更改时),它将替换它用​​于生成器表达式。