代码之家  ›  专栏  ›  技术社区  ›  Alex Reinking

如何在CMake中计算循环生成器表达式?

  •  0
  • Alex Reinking  · 技术社区  · 3 年前

    考虑下面的例子:

    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>")
    

    正如你所看到的 COMPILE_DEFINITIONS 对于 foo 取决于 编译定义 对于 bar 反之亦然。你会期待它的价值 要发散到无限长的字符串: FOOBARFOOBARFOOBAR... .

    然而,这让 -DFOOBAR 在…上 foo.cpp 的命令行和 -DBARFOO 在…上 bar.cpp 是的。

    为什么这不是一个错误?

    0 回复  |  直到 3 年前
        1
  •  2
  •   Alex Reinking    3 年前

    尽管没有记录这种行为(至少在编写时,当CMake 3.21为当前版本时),生成器表达式计算器会跟踪是否已经看到生成器表达式,并将循环表达式扩展为空字符串。

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