如何在CMake中输出生成器表达式的结果?

Arn*_*rah 8 cmake

我有以下简单的CMake代码:

cmake_minimum_required(VERSION 3.1)

project(PrintGenerators)

set(TEST_OR_GENERATOR "$<$<OR:0,0,1>:YAY!>")

message(STATUS ${TEST_OR_GENERATOR}) # Print out the result of the build
Run Code Online (Sandbox Code Playgroud)

我希望这段代码可以打印出来YAY!,但事实并非如此.我改为$<$<OR:0,0,1>:YAY!>输出.如何在配置期间打印评估的生成器表达式的结果?

Tsy*_*rev 14

如何在配置期间打印评估的生成器表达式的结果?

你不能.生成器表达式适用于在配置阶段不完全已知的事物:它们依赖于构建类型,在多构造生成器的情况下,仅在构建阶段才知道它.

但是,您可以将生成器表达式的值保存到文件中,但该文件仅在配置阶段结束时写入:

file(GENERATE OUTPUT <filename> CONTENT <string-with-generator-expression>)
Run Code Online (Sandbox Code Playgroud)

有关详细说明,file(GENERATOR)请参阅文档.


Mar*_*ram 12

从文档中

由于生成器表达式是在生成构建系统期间而不是在处理CMakeLists.txt文件期间评估的,因此无法使用该message()命令检查其结果。

生成调试消息的一种可能方法是添加自定义目标,

add_custom_target(genexdebug COMMAND ${CMAKE_COMMAND} -E echo "$<...>")
Run Code Online (Sandbox Code Playgroud)

shell 命令make genexdebug(在执行 后调用cmake)将打印 的结果$<...>

另一种方法是将调试消息写入文件:

file(GENERATE OUTPUT filename CONTENT "$<...>")
Run Code Online (Sandbox Code Playgroud)


小智 6

您可以添加在构建时回显值的自定义命令.这就是我在需要时这样做的方式:

add_custom_command(TARGET mytarget POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E echo 
  "target dir = $<TARGET_FILE_DIR:mytarget>")
Run Code Online (Sandbox Code Playgroud)