天天看點

cmake函數參數解析

          近期在遷移公司的make系統到cmake上。發現cmake的function參數非常奇怪。比如,假設我們向一個function傳遞list作為參數,在function中,形參會變成例如以下狀況:

非常奇怪的是,這裡的${SRC}在function外是完整的4個元素。而在function卻僅僅剩下了頭一個元素(可能跟list的定長有關)。

假設我們要傳給function以n個源檔案組成的list,這樣顯然不行。

          一種簡單的解決方法是使用ARGV。ARGC配合,他們的含義如同C/C++中main的argv和argc。分别代表參數和參數個數。使用例如以下方法解析參數:

當然,你也能夠使用cmake的foreach循環周遊參數。這招對付僅僅有一個list的參數時十分有效。可是在出現多個參數的情況就非常麻煩。例如以下:

原來,ARG把兩個參數混在了一起,盡管後面我們使用while進行了特殊處理,可是這對于cmake的函數不具備普遍性。移植起來非常麻煩。

決定版的solution是使用cmake的cmake_parse_arguments來解析函數參數,它有點像解析一個map鍵值對。首先看下它的函數原型:

首先,prefix是一個字首。等會兒在引用參數的時候會提到,<option>是一個清單。裡面能夠包括一些你感興趣的KeyWord,随後能夠通過它來看看你所須要的KeyWord是否被設定。<one_value_keywords>是一個單值參數的KeyWord清單。<multi_value_keywords>是一個多值參數的KeyWord清單(如list),以下舉個樣例,看看怎樣使用它們,首先定義所須要的函數,因為參數是由CMAKE_PARSE_ARGUMENTS來解析的,是以在函數聲明中就不須要定義參數了:

這裡的字首是TEST,<one_value_keywords>我們設定單值參數的KeyWord(NAME;COMMAND;BASELINE)。這将在随後的函數調用中注明KeyWord和Value的關系,<multi_value_keywords>我們設定多值參數的KeyWord("ARGSLIST"),調用函數:

能夠看見,這裡調用時的參數傳遞如同map一樣<NAME ,testiso_${datafile} >,<COMMAND , "RunMe">,<ARGSLIST , ${SRC}>等等。在函數中。使用 字首+KeyWord 來調用Value,這樣比自己解析參數友善很多,并且也不會在還有list參數時和其它類型函數混在一起的情況。

很多其它訊息參考:http://www.cmake.org/cmake/help/v3.0/module/CMakeParseArguments.html?highlight=cmake_parse_arguments

繼續閱讀