CMake生成器表达式未被评估

时间:2016-02-29 08:45:35

标签: cmake

由于以下警告:

CMake Error at test/CMakeLists.txt:29 (get_target_property):
  The LOCATION property may not be read from target "my_exe".  Use the
  target name directly with add_custom_command, or use the generator
  expression $<TARGET_FILE>, as appropriate.

这是来自这样的行的结果:

get_target_property(my_exe_path my_exe LOCATION)

与文档中推荐的一样,我尝试使用这样的生成器表达式:

add_executable(my_exe_path main.cpp)
message("path to executable: $<TARGET_FILE:my_exe_path>")

TARGET_FILE未被评估

path to executable: $<TARGET_FILE:my_exe>

我正在使用CMake 3.4并将cmake_minimum_required(VERSION 3.4)添加到我的CMakeLists.txt,所以我做错了什么?

2 个答案:

答案 0 :(得分:12)

这是一种打印生成器表达式值的快捷方法:

add_custom_target(print
        ${CMAKE_COMMAND} -E echo $<1:hello> $<0:world>
    )

在此示例中,如果您运行cmake .然后make print,您将看到&#34; hello&#34; (在输出中没有引号)。

但是,如果您只使用message($<1:hello> $<0:world>),则会看到&#34; $<1:hello> $<0:world>&#34;作为输出(再次,没有引号)。

答案 1 :(得分:5)

当生成器表达式存储在配置阶段时(执行相应的CMake命令时), 生成器表达式的评估构建阶段执行。

这就是为什么message()命令以非解除引用的形式打印生成器表达式的原因:生成器表达式表示的值在此阶段不知道

此外,CMake本身从不取消引用生成器表达式。相反,它会在构建文件中生成适当的字符串,然后由构建实用程序makeVisual Studio等)进行解释。

请注意,并非每个 CMake 命令都接受 生成器表达式。对于特定命令,生成器表达式的每种可能用法都在documentation中描述为明确。此外,不同的CMake 命令流不同的选项不同的策略关于使用生成器表达式

例如,命令流

add_test(NAME <name> COMMAND <executable>)

接受<{1}}选项的生成器表达式,

但命令流

COMMAND

没有按&#39;!吨

政策差异的另一个例子:

add_test(<name> <executable>)

在此命令中,流install(DIRECTORY <dir> DESTINATION <dest>) 允许表达式生成器表达式,但不允许DESTINATION选项。

再次,仔细阅读文档