# cmake_parse_arguments

# 作用

解析cmake中传入给macro/function的参数

命令的使用格式:

cmake_parse_arguments(<prefix> <options> <one_value_keywords>
                      <multi_value_keywords> <args>...)
  • <prefix>表示给变量添加的前缀
  • <options>是变量的类型,可选参数
  • <one_value_keywords>是变量类型,单值变量
  • <multi_value_keywords>是变量类型,多值变量
  • <args>...可变参数,没有被前面几种变量类型捕获的变量都会放在这里

# 示例

function(test_cmake_parse NAME)
    set(options SLOW FAST)
    set(oneValueArgs DESTINATION DIRECTORY)
    set(multiValueArgs TARGETS VARS)
    cmake_parse_arguments(_TEST "EXCLUDE" "" "" ${ARGN})
    cmake_parse_arguments(_TYPE "STATIC;SHARED;MODULE" "" "" ${ARGN})
    cmake_parse_arguments(_STD "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

    message(STATUS "TESTING___ ${_TEST_EXCLUDE}")
    message(STATUS "_TYPE ${_TYPE_SHARED}")
    message(STATUS "_STD_SLOW ${_STD_SLOW}")
    message(STATUS "_STD_FAST ${_STD_FAST}")
    message(STATUS "_STD_DESTINATION ${_STD_DESTINATION}")
    message(STATUS "_STD_DIRECTORY ${_STD_DIRECTORY}")
    message(STATUS "_STD_TARGETS ${_STD_TARGETS}")
    message(STATUS "_STD_VARS ${_STD_VARS}")
endfunction()
test_cmake_parse(PROJ EXCLUDE SHARED SLOW FAST DESTINATION tmp DIRECTORY "/home/user" TARGETS for bar)

# -- TESTING___ TRUE
# -- _TYPE TRUE
# -- _STD_SLOW TRUE
# -- _STD_FAST TRUE
# -- _STD_DESTINATION tmp
# -- _STD_DIRECTORY /home/user
# -- _STD_TARGETS for;bar
# -- _STD_VARS 

如上,定义了cmake函数,从上面的定义可以看出,通过cmake_parse_arguments的作用就是负责定义函数或宏的参数,并根据定义解析传入的参数,同时给变量添加函数内的命名前缀。

能够解析的参数有三种类型,可选项,类似bool类型,单值类型变量和多值类型,没有解析到的参数都将放入其后所跟的最优一个参数上。

cmake_parse_arguments还能自动给变量添加前缀名,如上面定义的_TYPE_SHARED_STD_FAST等。