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

mrfwxfqh  于 2022-12-13  发布在  其他
关注(0)|答案(4)|浏览(213)

我有以下简单的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

我希望这段代码能输出YAY!,但实际上没有。我得到的是$<$<OR:0,0,1>:YAY!>作为输出。我如何在配置过程中输出计算后的生成器表达式的结果?

m1m5dgzv

m1m5dgzv1#

如何在配置期间打印计算的生成器表达式的结果?
不能。生成器表达式用于在配置阶段不完全知道的情况:它们取决于构建类型,在多配置generators的情况下,只有在 * 构建阶段 * 才知道构建类型。
但是,您可以将生成器表达式的值保存到文件中,但仅在配置阶段结束时才会写入该文件:

file(GENERATE OUTPUT <filename> CONTENT <string-with-generator-expression>)

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

ckocjqey

ckocjqey2#

您可以添加一个自定义命令,在构建时响应该值。当我需要它时,我是这样做的:

add_custom_command(TARGET mytarget POST_BUILD
  COMMAND ${CMAKE_COMMAND} -E echo 
  "target dir = $<TARGET_FILE_DIR:mytarget>")
kt06eoxx

kt06eoxx3#

来自文档
由于生成器表达式是在生成buildsystem期间计算的,而不是在处理CMakeLists.txt文件期间计算的,因此无法使用message()命令检查其结果。
生成调试消息的一种可能方法是添加自定义目标,

add_custom_target(genexdebug COMMAND ${CMAKE_COMMAND} -E echo "$<...>")

shell命令make genexdebug(在执行cmake之后调用)将打印$<...>的结果。
另一种方法是将调试消息写入文件:

file(GENERATE OUTPUT filename CONTENT "$<...>")
zxlwwiss

zxlwwiss4#

由于生成器表达式是在生成buildsystem期间计算的,而不是在处理CMakeLists.txt文件期间计算的,因此无法使用message()命令检查其结果。生成调试消息的一种可能方法是使用file(GENERATE)将调试消息写入文件:

file(GENERATE OUTPUT filename CONTENT "$<...>")

reference

相关问题