【问题标题】:How to pass a list with one empty element in cmake?如何在cmake中传递一个包含一个空元素的列表?
【发布时间】:2015-10-05 23:15:07
【问题描述】:

我有一个 cmake 函数,它需要一个列表作为它的参数之一。在 cmake 中,列表由一个字符串表示,列表元素用分号分隔。我可以将一个空列表传递为"",将一个元素的列表传递为"foo",并将多个元素的列表传递为"foo1;foo2;foo3"。即使将两个空元素的列表作为";" 传递也可以按预期工作。但是如何传递一个只有一个空元素的列表呢?

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

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

其中涵盖了类似的问题,但我找不到任何后续行动。

那么,是否可以传递一个只有一个空元素的列表,如果可以,怎么做?

【问题讨论】:

  • 空列表和具有一个空元素的列表具有相同的表示。如果要区分两者,则需要找到特定于用例的解决方案。你的用例是什么?

标签: list cmake representation


【解决方案1】:

您可以添加表示参数名称的额外参数。这是 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`

如您所见,有一个零参数的情况和一个空参数的情况。

【讨论】:

  • 您可能希望使用ParseArguments module 来避免手动解析参数字符串。
  • 这是一个有用的模式,但在将多个列表传递给函数的情况下它不起作用。但是,在我的情况下,只有一个参数必须能够接受一个空元素的列表作为参数,因此我可以通过仅在该参数上使用您的模式来完成这项工作。因此,接受。
  • @ruslo 你是对的。对不起,我误解了FOO的意义。
猜你喜欢
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
  • 2016-06-25
  • 1970-01-01
  • 2012-08-01
  • 2017-11-15
  • 2018-04-19
相关资源
最近更新 更多