【问题标题】:CMake macro : how to iterate over argumentsCMake 宏:如何迭代参数
【发布时间】:2017-03-08 22:13:55
【问题描述】:

灵感来自: https://cmake.org/cmake/help/v3.0/command/macro.html

我愿意:

macro(ARGS_TEST)
  message(WARNING "\nARGN: ${ARGN}\n")
  foreach(arg IN LISTS ARGN)
     message(WARNING "\n ARG : ${arg} \n")
  endforeach()
endmacro()

ARGS_TEST(test 1 2 3)

哪个打印:

ARGN: test;1;2;3

但此后什么都没有,这意味着似乎没有发生对 ARGN 的迭代。

我缺少什么?

回答以下问题: Passing a list to a cmake macro

显示如何将参数打印为列表,但不显示如何迭代它们

【问题讨论】:

  • 你错过了,在宏 ARGN 中是 not a normal variable。关于克服这个列表见这里:stackoverflow.com/questions/5248749/…
  • @Tsyvarev 是的,但我正在遵循文档中的示例 --;关于可能的重复,它似乎没有回答我的问题,它将列表转换为字符串而不是允许对其进行迭代(或者我无法理解答案?)
  • I am following the example from the doc - 如果你谈论最后一个例子,它使用宏调用函数内部。在这种情况下,宏从函数中获取ARGN 变量。仔细阅读。但是对于您的情况,重复项实际上是错误的,抱歉。

标签: macros cmake arguments iteration


【解决方案1】:

Macro argument aren't variables。因此,在这种情况下,ARGN 不会像其他列表一样被对待。我看到了解决此问题的两种方法:

在我对您的示例进行修改时,我制作了您的消息 STATUS 消息以简化我的测试。这也应该与 WARNING 一起使用。

第一种方法是让它成为一个函数:

function(ARGS_TEST_FUNCTION)
  message(STATUS "\nARGN: ${ARGN}\n")
  foreach(arg IN LISTS ARGN)
     message(STATUS "\n ARG : ${arg} \n")
  endforeach()
endfunction()

ARGS_TEST_FUNCTION(test 1 2 3)

就像这个 ARGN 是一个变量,并按预期扩展。如果您想在此循环中设置值,则需要使用 set 和 PARENT_SCOPE。如果您正在调用其他宏并且不知道它们打算设置的每个变量,则可能无法使用父作用域。

或者,我们可以自己进行扩展并告诉 foreach 我们正在传递一个列表:

macro(ARGS_TEST)
  message(STATUS "\nARGN: ${ARGN}\n")
  foreach(arg IN ITEMS ${ARGN})
     message(STATUS "\n ARG : ${arg} \n")
  endforeach()
endmacro()

ARGS_TEST(test 1 2 3)

这来自 CMake 文档中的 foreach page

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2010-12-24
    • 2011-02-24
    • 1970-01-01
    • 2015-08-15
    相关资源
    最近更新 更多