如何编写具有多个参数组的cmake函数?

upd*_*liu 9 cmake

例如,我想my_add_lib用以下语法编写一个函数:

my_add_lib(NAME <name>
           SRCS [src1 [src2 ...]]
           DEPS [dependency1 [dependancy2 ...]]])
Run Code Online (Sandbox Code Playgroud)

如何实现这些"参数组"?

jul*_*ulp 18

CMake提供了CMakeParseArguments模块,可以为您进行参数解析.例:

include(CMakeParseArguments)

function(my_add_lib)
    cmake_parse_arguments(
        PARSED_ARGS # prefix of output variables
        "" # list of names of the boolean arguments (only defined ones will be true)
        "NAME" # list of names of mono-valued arguments
        "SRCS;DEPS" # list of names of multi-valued arguments (output variables are lists)
        ${ARGN} # arguments of the function to parse, here we take the all original ones
    )
    # note: if it remains unparsed arguments, here, they can be found in variable PARSED_ARGS_UNPARSED_ARGUMENTS
    if(NOT PARSED_ARGS_NAME)
        message(FATAL_ERROR "You must provide a name")
    endif(NOT PARSED_ARGS_NAME)
    message("Provided sources are:")
    foreach(src ${PARSED_ARGS_SRCS})
        message("- ${src}")
    endforeach(src)
endfunction(my_add_lib)
Run Code Online (Sandbox Code Playgroud)

从CMake 3.5开始,cmake_parse_arguments变成内置命令(用C++而不是CMake编写):include(CMakeParseArguments)不再需要,但是,目前,文件CMakeParseArguments.cmake保持为空以保持兼容性.

  • 如果像我一样,您正在将现有函数转换为使用“cmake_parse_arguments()”,您可能会犯与我相同的错误,并忘记从函数签名中删除该函数以前的参数。在这种情况下,“${ARGN}”将不是调用者传入的参数。相反,对我来说,这是我指定给“cmake_parse_arguments()”的参数名称和我后来在函数体内分配给原始参数的变量名称的奇怪混搭。 (2认同)