使用CMake检查列表是否包含特定条目的最佳方法

usr*_*567 34 cmake

我想检查列表是否包含特定条目,如下面的代码片段:

macro(foo)
if ($(ARGN} contains "bar")
  ...
endif
endmacro()
Run Code Online (Sandbox Code Playgroud)

CMake不提供contains.获得理想结果的最佳/最简单方法是什么?

在CMake的wiki中,我找到了一个LIST_CONTAINS宏,但是wiki页面已经过时了.这仍然是最好的方式还是CMake获得了新功能?

sak*_*kra 54

使用CMake 3.3或更高版本,该if命令支持IN_LIST 运算符,例如:

if ("bar" IN_LIST _list)
 ...
endif()
Run Code Online (Sandbox Code Playgroud)

对于旧版本的CMake,您可以使用内置列表(FIND)功能:

list (FIND _list "bar" _index)
if (${_index} GREATER -1)
  ...
endif()
Run Code Online (Sandbox Code Playgroud)

  • 出于几个原因,我不建议这样做.在宏的范围内(根据OP),你必须复制`ARGN`或者这将无声地失败.此外,对于大型列表而言,这比我的回答慢得多. (2认同)
  • [宏观`的文档](http://www.cmake.org/cmake/help/v3.0/command/macro.html#macro-argument-caveats),特别是警告,解释了它.如果在`宏'中尝试`list(FIND ARGN"bar"_index)`,它总是将`_index`设置为-1,因为`ARGN`在这里不是正常变量. (2认同)

ste*_*ire 10

线路较少:

if (";${ARGN};" MATCHES ";bar;")
  #  ...
endif()
Run Code Online (Sandbox Code Playgroud)

但是请参阅IN_LIST@sakra 的语法以获得更现代的语法.


Jif*_*ang 6

我一直在使用一个班轮if ("${PLATFORM}" MATCHES "^(os|ios|android|linux|win32)$")来检查是否PLATFORM在列表中