如何在 CMake 中检查列表是否包含特定条目?

问题描述 投票:0回答:4

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

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

CMake 不提供

contains
。获得所需结果的最佳/最简单方法是什么?

在CMake的wiki中,我发现了一个

LIST_CONTAINS
宏,但是wiki页面已经过时了。这仍然是最好的方法吗?还是 CMake 获得了新功能?

cmake
4个回答
94
投票

使用 CMake 3.3 或更高版本,

if
命令支持
IN_LIST
运算符,例如:

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

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

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

12
投票

更少的行数:

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

但是请参阅 @sakra 的

IN_LIST
语法以获得更现代的语法。


7
投票

我一直在使用像

if ("${PLATFORM}" MATCHES "^(os|ios|android|linux|win32)$")
这样的衬里来检查
PLATFORM
是否在列表中


4
投票

如果这里的目的是将一个值添加到列表中但仅当它尚未在列表中时,那么另一种方法是将其添加到列表中并立即再次删除可能的重复项:

list(APPEND            SOME_LIST "value")
list(REMOVE_DUPLICATES SOME_LIST)
© www.soinside.com 2019 - 2024. All rights reserved.