CMake下function详解
文章目录
CMake中的function类似编程语言的函数,允许我们将一系列复杂的命令封装起来,方便调用与重复使用。
其基本的语法如下:
function(<name> [<arg1> ...])
<commands>
endfunction([<name>])
<name>:表示定义的函数名,通过这个名字来调用整个函数,
[<arg1>…]表示函数的参数,可以省略
<commands>就是函数中的具体命令组合,这些命令组合可以使用传进来的参数。
endfunction()表示整个函数以及定义完成,其中括号里可填,可不填,如果要填的话,其名字必须与function中定义的函数名一致。
简单function的使用
下面定义了一个最简单的function:
function(my_function)
message(STATUS "print my function")
endfunction()
这个function非常简单,只是输出打印一句话,我们调用这个函数,看看结果:
my_function()
结果为:
print my function
结果符合预期;
在function中传入参数
假设现在我们要在function中传入参数,并把这个参数打印出来,该怎么做呢?
这里产生了两个问题:
1.function外部如何传入参数?
2.function内部如何获得与解析这个参数?
function外部传入参数
function外部传入参数的方法很简单,就是在调用函数的时候将所需的参数填入括号中,但并不是随意填写的,需要根据你function的具体定义,获取参数的方式,来填写参数内容。
function内部获取与解析参数
在function函数头声明变量名
我们将my_function稍加变化:
function(my_function2 need_print)
message(STATUS "print my fucntion2:${need_print}")
endfunction(my_function2)
在函数名后面跟着一个变量need_print,然后外部调用这个函数
my_function2(hello_world)
最后结果为:
print my fucntion2:hello_world
确实输出了我们传入的参数。
如果我们想要输入两个参数,就在function函数头中再添加一个变量,如下:
function(my_function2 need_print need_print2)
message(STATUS "print my fucntion2:${need_print} ${need_print2}")
endfunction(my_function2)
此时调用函数变为:
my_function2(hello_world hi_cmake)
输出为:
print my fucntion2:hello_world hi_cmake
如果此时我们在调用过程中只输入一个参数,结果会如何?
my_function2(hello_world)
此时CMake过程将会报错:
CMake Error at cmke_function_test/CMakeLists.txt:3 (my_function2):
my_function2 Function invoked with incorrect arguments for function named:
my_function2
提示我们发送了参数数量不对的错误。
如果我们在调用过程中输入了三个参数呢?
my_function2(hello_world wow hi_cmake)
结果为:
print my fucntion2:hello_world wow
并未发生错误,只是使用了前两个参数。
因此,可以得出以下结论,当调用function时,传入的参数个数不能小于fucntion定义过程声明的变量个数。
利用cmake_parse_arguments来进行参数调用
cmake_parse_arguments
主要用来解析函数或者轰的参数
基本的语法为:
cmake_parse_arguments(<prefix> <options> <one_value_keywords>
<multi_value_keywords> <args>...)
或者
cmake_parse_arguments(PARSE_ARGV <N> <prefix> <options>
<one_value_keywords> <multi_value_keywords>)
<prefix>是解析后的变量前缀,会通过下划线与其他Key名相连;
<options>表明当前Key名都是option类型的
<one_value_keywords>表明当前Key名中只存在一个变量
<multi_value_keywords>表面当前Key名中可存在多个变量
具体例子如下:
function(my_function2 FunctionTarget)
set(options ENABLE_PRINT EANBLE_SHOW)
set(oneValueArgs PRINT_VALUE)
set(multiValueArgs SUB_VALUES DEFUALT_VALUES)
message(STATUS "function target:${FunctionTarget}")
cmake_parse_arguments(FUNC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
message(STATUS "ENABLE_PRINT:${FUNC_ENABLE_PRINT}")
message(STATUS "ENABLE_SHOW:${FUNC_EANBLE_SHOW}")
message(STATUS "PRINT_VALUE:${FUNC_PRINT_VALUE}")
foreach(sub ${FUNC_SUB_VALUES})
message(STATUS "sub value:${sub}")
endforeach()
foreach(default ${FUNC_DEFUALT_VALUES})
message(STATUS "default value:${default}")
endforeach()
endfunction(my_function2 FunctionTarget)
假设我们如下调用函数:
my_function2(test_function
ENABLE_PRINT
EANBLE_SHOW
PRINT_VALUE helloworld
SUB_VALUES one two three
DEFUALT_VALUES ha wa gou so )
可以得到如下输出:
-- input value is helloworld
-- function target:test_function
-- ENABLE_PRINT:TRUE
-- ENABLE_SHOW:TRUE
-- PRINT_VALUE:helloworld
-- sub value:one
-- sub value:two
-- sub value:three
-- default value:ha
-- default value:wa
-- default value:gou
-- default value:so
可以看到我们输入的参数都被解析出来了。
接下来我们对调用稍作修改:
my_function2(test_function test_function_again
ENABLE_PRINT
PRINT_VALUE helloworld
SUB_VALUES one two three
DEFUALT_VALUES ha wa gou so )
得到如下输出:
-- input value is helloworld
-- function target:test_function
-- ENABLE_PRINT:TRUE
-- ENABLE_SHOW:FALSE
-- PRINT_VALUE:helloworld
-- sub value:one
-- sub value:two
-- sub value:three
-- default value:ha
-- default value:wa
-- default value:gou
-- default value:so
可以看到第二个输入test_function_again直接被忽略了
而options中未被输入的ENABLE_SHOW,其默认值变成了FALSE,所以对于options选项,缺省值将被设置为FALSE。
在使用cmake_parse_arguments过程中,我们可以使用<prex>_UNPARSED_ARGUMENTS来获取那些没有被解析出来的值。
我们在my_funtion2中增加下面一句:
message(STATUS "UnParsed Arguement:${FUNC_UNPARSED_ARGUMENTS}")
输出为:
-- UnParsed Arguement:test_function_again
可以看到原来没有被获取的输入test_function_again,被捕获了。
以上就是对CMake中function功能的基本应用。