CMake下function详解

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功能的基本应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值