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

时间:2014-04-27 12:02:29

标签: cmake

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

macro(foo)
if ($(ARGN} contains "bar")
  ...
endif
endmacro()

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

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

4 个答案:

答案 0 :(得分:49)

使用CMake 3.3或更高版本,if命令支持IN_LIST operator,例如:

if ("bar" IN_LIST _list)
 ...
endif()

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

list (FIND _list "bar" _index)
if (${_index} GREATER -1)
  ...
endif()

答案 1 :(得分:10)

更少的行:

if (";${ARGN};" MATCHES ";bar;")
  #  ...
endif()

但请参阅@sakra的IN_LIST语法,了解更现代的语法。

答案 2 :(得分:2)

我一直在使用if ("${PLATFORM}" MATCHES "^(os|ios|android|linux|win32)$")之类的内衬来检查列表中是否有PLATFORM

答案 3 :(得分:1)

如果此处的意图是将值添加到列表,但仅当它尚未在列表中时,则另一种方法是将其添加到列表中,然后立即再次删除可能的重复项:

list(APPEND            SOME_LIST "value")
list(REMOVE_DUPLICATES SOME_LIST)