CMake - 我应该如何删除以空格分隔的列表中的重复项?

ein*_*ica 4 list cmake duplicates

'适当的' CMake 列表允许

list(REMOVE_DUPLICATES my_list_name)
Run Code Online (Sandbox Code Playgroud)

但这不适用于“列表”,它只是一个以空格分隔的字符串,例如CMAKE_C_FLAGS. 在此类列表中避免重复的最佳/最简单方法是什么?

Cin*_*its 5

这并不是一种不需要先将字符串更改为列表的方法。

使用separate_arguments这样做:

cmake_minimum_required(VERSION 2.6)

set(ARGS "foo baz bawk bawk bawk")
message(STATUS "args: ${ARGS}")
# args: foo baz bawk bawk bawk

set(ARG_LIST ${ARGS})
separate_arguments(ARG_LIST)
message(STATUS "arg list: ${ARG_LIST}")
# arg list: foo;baz;bawk;bawk;bawk

list(REMOVE_DUPLICATES ARG_LIST)
message(STATUS "arg list: ${ARG_LIST}")
# arg list: foo;baz;bawk

# little utility function to join the list back into a string
function(JOIN VALUES GLUE OUTPUT)
  string (REGEX REPLACE "([^\\]|^);" "\\1${GLUE}" _TMP_STR "${VALUES}")
  string (REGEX REPLACE "[\\](.)" "\\1" _TMP_STR "${_TMP_STR}") #fixes escaping
  set (${OUTPUT} "${_TMP_STR}" PARENT_SCOPE)
endfunction()

JOIN("${ARG_LIST}" " " ARGS)
message(STATUS "args: ${ARGS}")
# args: foo baz bawk
Run Code Online (Sandbox Code Playgroud)

想要函数?好的:

function(REMOVE_DUPES ARG_STR OUTPUT)
  set(ARG_LIST ${ARG_STR})
  separate_arguments(ARG_LIST)
  list(REMOVE_DUPLICATES ARG_LIST)
  string (REGEX REPLACE "([^\\]|^);" "\\1 " _TMP_STR "${ARG_LIST}")
  string (REGEX REPLACE "[\\](.)" "\\1" _TMP_STR "${_TMP_STR}") #fixes escaping
  set (${OUTPUT} "${_TMP_STR}" PARENT_SCOPE)
endfunction()

set(ARGS "foo baz bawk bawk bawk fiz")
message(STATUS "args: ${ARGS}")
REMOVE_DUPES(ARGS DEDUPLICATED)
message(STATUS "args: ${DEDUPLICATED}")
Run Code Online (Sandbox Code Playgroud)