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>)

3.5 版中新增: 此命令在本机中实现。之前,已在 CMakeParseArguments 模块中进行定义。

此命令用于宏或函数中。该命令处理提供给该宏或函数的参数,并定义一组变量,其中包含各个选项的值。

第一个签名读取 <args>... 中传递的参数。它可以在 macro()function() 中使用。

3.7 版中新增: PARSE_ARGV 签名仅用于 function() 正文中。在这种情况下,要解析的参数来自调用函数的 ARGV# 变量。解析从 <N> 第个参数开始,其中 <N> 是一个无符号整数。这使得这些值可以包含 ; 之类的特殊字符。

<options> 参数包含各个函数或宏的所有选项。这些是后面不带值的关键字,就像 install() 命令的 OPTIONAL 关键字一样。

<one_value_keywords> 参数包含此函数或宏中所有后跟一个值的关键字,就像 install() 命令的 DESTINATION 关键字一样。

<multi_value_keywords> 参数包含此函数或宏中所有后跟一个以上值的关键字,就像 install() 命令的 TARGETSFILES 关键字一样。

版本 3.5 中发生更改:所有关键字都必须唯一。每个关键字只能在任意 <options><one_value_keywords><multi_value_keywords> 中指定一次。如果违反唯一性,将发出警告。

完成后,cmake_parse_arguments 将考虑 <options><one_value_keywords><multi_value_keywords> 中列出的每个关键字,这些关键字由给定的 <prefix> 以及 "_" 和相应关键字的名称组成。对于 <one_value_keywords><multi_value_keywords>,这些变量将分别保存自参数列表中的相应值,或者在未给定相关关键字时保持未定义的状态(策略 CMP0174 也能影响 <one_value_keywords> 的行为)。对于 <options> 关键字,这些变量始终会被定义,并且当关键字存在时将被设置为 TRUE,而当关键字不存在时将被设置为 FALSE

所有剩余参数都收集在变量 <prefix>_UNPARSED_ARGUMENTS 中,如果所有参数都被识别,此变量将保持未定义的状态。事后可以检查此变量,以查看是用未识别的参数调用宏或函数的。

在版本 3.15 中添加:完全未给定值的 <one_value_keywords><multi_value_keywords> 将收集在变量 <prefix>_KEYWORDS_MISSING_VALUES 中,如果所有关键字都已接收值,此变量将保持未定义的状态。可以检查此变量,以查看是否有关键字未提供任何值。

在版本 3.31 中发生更改:如果 <one_value_keyword> 后面紧跟一个空字符串作为其值,策略 CMP0174 将控制对应的 <prefix>_<keyword> 变量是否会被定义。

请谨慎选择一个 <prefix>,以避免与现有变量名称冲突。如果在函数中使用,通常适合使用前缀 arg。有一个非常强大的约定,即所有关键字都完全大写,因此此前缀导致形式为 arg_SOME_KEYWORD 的变量。这使代码更具可读性,并且最大程度地降低了与缓存变量发生冲突的可能性,而缓存变量也有完全大写的有力约定。

function(my_install)
    set(options OPTIONAL FAST)
    set(oneValueArgs DESTINATION RENAME)
    set(multiValueArgs TARGETS CONFIGURATIONS)
    cmake_parse_arguments(PARSE_ARGV 0 arg
        "${options}" "${oneValueArgs}" "${multiValueArgs}"
    )

    # The above will set or unset variables with the following names:
    #   arg_OPTIONAL
    #   arg_FAST
    #   arg_DESTINATION
    #   arg_RENAME
    #   arg_TARGETS
    #   arg_CONFIGURATIONS
    #
    # The following will also be set or unset:
    #   arg_UNPARSED_ARGUMENTS
    #   arg_KEYWORDS_MISSING_VALUES

在宏内部使用时,arg 可能不是合适的前缀,因为代码将影响调用范围。如果在同一范围内的另一个宏在其对 cmake_parse_arguments() 的调用中也调用 arg,并且如果两个宏之间有任何常用关键字,则后调用的变量会覆盖或删除前调用的变量。因此,建议在 <prefix> 中包含宏名称的唯一内容,例如 arg_lowercase_macro_name

macro(my_install)
    set(options OPTIONAL FAST)
    set(oneValueArgs DESTINATION RENAME)
    set(multiValueArgs TARGETS CONFIGURATIONS)
    cmake_parse_arguments(arg_my_install
        "${options}" "${oneValueArgs}" "${multiValueArgs}"
        ${ARGN}
    )
    # ...
endmacro()

macro(my_special_install)
    # NOTE: Has the same keywords as my_install()
    set(options OPTIONAL FAST)
    set(oneValueArgs DESTINATION RENAME)
    set(multiValueArgs TARGETS CONFIGURATIONS)
    cmake_parse_arguments(arg_my_special_install
        "${options}" "${oneValueArgs}" "${multiValueArgs}"
        ${ARGN}
    )
    # ...
endmacro()

假设以上宏像这样依次调用

my_install(TARGETS foo bar DESTINATION bin OPTIONAL blub CONFIGURATIONS)
my_special_install(TARGETS barry DESTINATION sbin RENAME FAST)

在两个调用后,以下描述将设置或取消设置的变量

arg_my_install_OPTIONAL = TRUE
arg_my_install_FAST = FALSE # was not present in call to my_install
arg_my_install_DESTINATION = "bin"
arg_my_install_RENAME <UNSET> # was not present
arg_my_install_TARGETS = "foo;bar"
arg_my_install_CONFIGURATIONS <UNSET> # was not present
arg_my_install_UNPARSED_ARGUMENTS = "blub" # nothing expected after "OPTIONAL"
arg_my_install_KEYWORDS_MISSING_VALUES = "CONFIGURATIONS" # value was missing

arg_my_special_install_OPTIONAL = FALSE # was not present
arg_my_special_install_FAST = TRUE
arg_my_special_install_DESTINATION = "sbin"
arg_my_special_install_RENAME <UNSET> # value was missing
arg_my_special_install_TARGETS = "barry"
arg_my_special_install_CONFIGURATIONS <UNSET> # was not present
arg_my_special_install_UNPARSED_ARGUMENTS <UNSET>
arg_my_special_install_KEYWORDS_MISSING_VALUES = "RENAME"

关键字终止值列表。如果在 <one_value_keyword> 后直接给出一个关键字,则该前一个 <one_value_keyword> 不接收任何值,并将关键字添加到 <prefix>_KEYWORDS_MISSING_VALUES 变量中。在上例中,对 my_special_install() 的调用紧随 FAST 关键字之后直接包含 RENAME 关键字。在这种情况下,FAST 终止对 RENAME 关键字的处理。将 arg_my_special_install_FAST 设置为 TRUE,取消设置 arg_my_special_install_RENAME,并且 arg_my_special_install_KEYWORDS_MISSING_VALUES 包含值 RENAME

另请参见