CMake宏:如何迭代参数

时间:2017-03-08 22:13:56

标签: macros cmake arguments iteration

从以下方面获取灵感: 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

显示了如何将参数作为列表打印,而不是如何迭代它们

1 个答案:

答案 0 :(得分:2)

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