如何将列表列表传递给CMake宏?
如果我这样做
MACRO(Exclude_From_List)
FOREACH(arg ${ARGN})
MESSAGE(${arg})
ENDFOREACH()
ENDMACRO()
并将其称为
EXCLUDE_FROM_LIST("${List1}" "${List2}" EXCLUDE "ToRemove")
我将丢失宏后仍需要的列表。我只想要从包含该条目的每个列表中删除一个模式列表(在本例中为ToRemove)。
谢谢!
答案 0 :(得分:1)
此处的问题是您需要将列表名称列表传递到macro
而不是列表中包含的值。
通过执行("${List1}" "${List2}" ...)
,您将创建List1
和List2
的连锁内容的单个大列表。
您的macro
应该更像这样:
MACRO(Exclude_From_List)
# Split inputs into list of list variable names and items to be removed
SET(FoundExclude FALSE)
FOREACH(arg ${ARGN})
IF(FoundExclude)
LIST(APPEND ToBeRemoved ${arg})
ELSEIF(${arg} STREQUAL "EXCLUDE")
SET(FoundExclude TRUE)
ELSE()
LIST(APPEND ListNames ${arg})
ENDIF()
ENDFOREACH()
MESSAGE("Removing ${ToBeRemoved} from lists named ${ListNames}")
FOREACH(ListName ${ListNames})
# Ensure the variable is actually valid
IF(DEFINED ${ListName})
LIST(REMOVE_ITEM ${ListName} ${ToBeRemoved})
ENDIF()
ENDFOREACH()
ENDMACRO()
然后你可以像这样使用它:
SET(List1 A B C D E F)
SET(List2 F E D C B A)
SET(List3 1 2 3 4 5 6)
SET(List4 "")
SET(List5)
Exclude_From_List(List1 List2 List3 List4 List5 EXCLUDE A D F)