cmake函式引數解析

2021-08-11 17:06:55 字數 3324 閱讀 9060

**: 

最近在遷移公司的make系統到cmake上,發現cmake的function引數很奇怪。例如,如果我們向乙個function傳遞list作為引數,在function中,形參會變成如下狀況:

set(src)  

function(tst_arguments src_list)

message("src_list = "$)

endfunction()

message("src = "$)

tst_arguments($)

==== output ====

src = a.cppb.cppc.cppd.cpp

src_list = a.cpp

很奇怪的是,這裡的$在function外是完整的4個元素,而在function卻只剩下了頭乙個元素(可能跟list的定長有關)。如果我們要傳給function以n個原始檔組成的list,這樣顯然不行。

一種簡單的解決方法是使用argv,argc配合,他們的含義如同c/c++中main的argv和argc,分別代表引數和引數個數,使用如下方法解析引數:

function(tst_arguments src_list)  

message("argc = "$)

message("argv = "$)

set(index 0)

while(index less $)

message("arg = "$})

math(expr index "$ + 1")

endwhile()

endfunction()

tst_arguments($)

==== output ====

argc = 4

argv = a.cppb.cppc.cppd.cpp

arg = a.cpp

arg = b.cpp

arg = c.cpp

arg = d.cpp

當然,你也可以使用cmake的foreach迴圈遍歷引數。這招對付只有乙個list的引數時十分有效,但是在出現多個引數的情況就很麻煩,如下:

#  

#假設函式link_lib將src_list中的原始檔鏈結成庫,根據type制定是鏈結靜態庫還是動態庫

# function(link_lib src_list type)

message("argc = "$)

message("argv = "$)

#以下根據引數的實際情做了操作,手動處理,以保證正確獲取src_list和type

set(index 0)

math(expr max "$ - 1")

while(index less $)

#do something to link

math(expr index "$ + 1")

endwhile()

endfunction()

link_lib($ , so)

==== output ====

argc = 5

argv = a.cppb.cppc.cppd.cppso

原來,arg把兩個引數混在了一起,雖然後面我們使用while進行了特殊處理,但是這對於cmake的函式不具備普遍性,移植起來很麻煩。

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

include (cmakeparsearguments)  #必須包含這個cmake檔案才能使用cmake_parse_arguments

cmake_parse_arguments(args...)

首先,prefix是乙個字首,等會兒在引用引數的時候會提到,是乙個列表,裡面可以包含一些你感興趣的keyword,隨後可以通過它來看看你所需要的keyword是否被設定。

是乙個單值引數的keyword列表。

是乙個多值引數的keyword列表(如list),下面舉個例子,看看如何使用它們,首先定義所需要的函式,由於引數是由

cmake_parse_arguments來解析的,所以在函式宣告中就不需要定義引數了:

function(tst_arguments)  

cmake_parse_arguments(

test "isset" "name;command;baseline"

"argslist"

$ )

message("test_default_args is $ from $")

message("test_name is $")

message("test_command is $")

message("test_argslist is $")

message("test_baseline is $")

message("test_isset is $")

endfunction(tst_arguments)

這裡的字首是test,

我們設定單值引數的keyword(name;command;baseline),這將在隨後的函式呼叫中註明keyword和value的關係,我們設定多值引數的keyword("argslist"),呼叫函式:

test_arguments(  

name

testiso

command

"runme"

argslist

$ baseline

"/home/sakaue/iwork"

isset

)

==== output ====

test_default_args is from name;testiso;command;runme;argslist;a.cpp;b.cpp;c.cpp;d.cpp;baseline;/home/sakaue/iwork

test_name is testiso

test_command is runme

test_argslist is a.cpp;b.cpp;c.cpp;d.cpp

test_baseline is /home/sakaue/iwork

test_isset is true

cmake函式引數解析

最近在遷移公司的make系統到cmake上,發現cmake的function引數很奇怪。例如,如果我們向乙個function傳遞list作為引數,在function中,形參會變成如下狀況 set src function tst arguments src list message src list...

CMake中函式引數問題

cmake中function函式的定義 function arg1 arg2 arg3 command1 args 命令語句 command2 args function 系統為我們提供了一些特殊的變數 變數說明 ar 是乙個下標,0指向第乙個引數,累加 ar 所有的定義時要求傳入的引數 argn ...

CMAKE引數參考

cmake引數參考 make install prefix mysql的安裝路徑 default charset 預設的伺服器編碼,default collation 也是關於編碼的 mysql datadir data目錄 mysql tcp port tcp ip埠,3306 mysql uni...