2013-07-25 38 views
1

如何將列表列表傳遞給CMake宏?如何將列表列表傳遞給CMake宏

如果我做

MACRO(Exclude_From_List) 
    FOREACH(arg ${ARGN}) 
    MESSAGE(${arg}) 
    ENDFOREACH() 
ENDMACRO() 

,並調用它像

EXCLUDE_FROM_LIST("${List1}" "${List2}" EXCLUDE "ToRemove") 

我會失去我仍然需要宏觀後的名單。我只想從包含條目的每個列表中刪除模式列表(在本例中爲ToRemove)。

謝謝!

回答

1

這裏的問題是,您需要將列表名稱的列表傳遞到macro而不是列表中包含的值。

通過執行("${List1}" "${List2}" ...),您正在創建一個連接內容List1List2的單個大列表。

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)