如何在 CMake 中评估循环生成器表达式?
How are circular generator expressions evaluated in CMake?
考虑以下示例:
cmake_minimum_required(VERSION 3.21)
project(test)
add_executable(foo foo.cpp)
target_compile_definitions(foo
PRIVATE "FOO$<TARGET_PROPERTY:bar,COMPILE_DEFINITIONS>")
add_executable(bar bar.cpp)
target_compile_definitions(bar
PRIVATE "BAR$<TARGET_PROPERTY:foo,COMPILE_DEFINITIONS>")
如您所见,foo
的 COMPILE_DEFINITIONS
的值取决于 bar
的 COMPILE_DEFINITIONS
的值,反之亦然。您会期望 foo
的值发散为无限字符串:FOOBARFOOBARFOOBAR...
.
但是,这会将 -DFOOBAR
放在 foo.cpp
的命令行上,将 -DBARFOO
放在 bar.cpp
的命令行上。
为什么这不是错误?
虽然没有记录此行为(至少在撰写本文时,当 CMake 3.21 是最新的时),生成器表达式评估器会跟踪它是否已经看到生成器表达式并将循环表达式扩展为空字符串。
考虑以下示例:
cmake_minimum_required(VERSION 3.21)
project(test)
add_executable(foo foo.cpp)
target_compile_definitions(foo
PRIVATE "FOO$<TARGET_PROPERTY:bar,COMPILE_DEFINITIONS>")
add_executable(bar bar.cpp)
target_compile_definitions(bar
PRIVATE "BAR$<TARGET_PROPERTY:foo,COMPILE_DEFINITIONS>")
如您所见,foo
的 COMPILE_DEFINITIONS
的值取决于 bar
的 COMPILE_DEFINITIONS
的值,反之亦然。您会期望 foo
的值发散为无限字符串:FOOBARFOOBARFOOBAR...
.
但是,这会将 -DFOOBAR
放在 foo.cpp
的命令行上,将 -DBARFOO
放在 bar.cpp
的命令行上。
为什么这不是错误?
虽然没有记录此行为(至少在撰写本文时,当 CMake 3.21 是最新的时),生成器表达式评估器会跟踪它是否已经看到生成器表达式并将循环表达式扩展为空字符串。