如何在cmake中传递一个包含空元素的列表?

时间:2015-07-16 13:19:50

标签: list cmake representation

我有一个cmake函数,它希望列表作为其参数之一。在cmake中,列表由一个字符串表示,列表元素由semicola分隔。我可以将空列表作为"",将一个元素列表作为"foo",将多个元素列表作为例如"foo1;foo2;foo3"。即使传递两个空元素的列表";"也能正常工作。但是如何使用一个空元素传递列表?

我用Google搜索了一下,发现了这篇文章:

http://public.kitware.com/pipermail/cmake-developers/2013-July/007738.html

涉及类似的问题,但我找不到任何后续行动。

那么,甚至可以传递一个只有一个空元素的列表,如果是这样,怎么样?

1 个答案:

答案 0 :(得分:4)

您可以添加表示参数名称的额外参数。这是CMake中广泛使用的模式:

# usage: foo(FOO arg0 arg1 arg2 ...)

function(foo)
  list(LENGTH ARGV x)
  # check first is FOO here
  math(EXPR argn "${x} - 1")

  if(argn EQUAL 0)
    message("argn: 0 |")
    return()
  endif()

  set(output)
  foreach(index RANGE 1 ${argn})
    list(GET ARGV ${index} current)
    set(output "${output} `${current}`")
  endforeach()

  message("argn: ${argn} | argv:${output}")
endfunction()

foo(FOO)
foo(FOO "")
foo(FOO "1")
foo(FOO "1" "")
foo(FOO "1" "abc")

结果:

argn: 0 |
argn: 1 | argv: ``
argn: 1 | argv: `1`
argn: 2 | argv: `1` ``
argn: 2 | argv: `1` `abc`

正如你所看到的,有一个零参数和一个空参数的情况。