如何在 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>")

如您所见,fooCOMPILE_DEFINITIONS 的值取决于 barCOMPILE_DEFINITIONS 的值,反之亦然。您会期望 foo 的值发散为无限字符串:FOOBARFOOBARFOOBAR....

但是,这会将 -DFOOBAR 放在 foo.cpp 的命令行上,将 -DBARFOO 放在 bar.cpp 的命令行上。

为什么这不是错误?

虽然没有记录此行为(至少在撰写本文时,当 CMake 3.21 是最新的时),生成器表达式评估器会跟踪它是否已经看到生成器表达式并将循环表达式扩展为空字符串。

此行为在此处实现:https://github.com/Kitware/CMake/blob/688b647238a5345398788ee99e2e7e53e27eaf05/Source/cmGeneratorExpressionNode.cxx#L1495-L1497