首页 > 解决方案 > 确定提供给 cmake_parse_arguments() 的 one_value_keyword 是否没有值

问题描述

文档在这里cmake_parse_arguments()

include(CMakeParseArguments)

function(func)
   set(options OPTION)
   set(oneValueArgs VALUE)
   set(multiValueArgs MULTIVALUE)
   cmake_parse_arguments(PARSE_ARGV 0 "" "${options}" "${oneValueArgs}" "${multiValueArgs}")

   if(NOT DEFINED _VALUE)
      set(_VALUE undefined)
   endif()
   message("_VALUE:${_VALUE}")
endfunction(func)

func()             ## undefined
func(VALUE)        ## undefined!!!
func(VALUE xxx)    ## xxx

cmake -P test.cmake

_VALUE:undefined
_VALUE:undefined
_VALUE:xxx

在函数体中如何确定它是用空VALUE还是没有VALUE调用的?
如何区分第一次和第二次通话?

标签: cmake

解决方案


在缺失值的情况下,CMake (>= 3.15) 在列表变量中添加对应的命名关键字<prefix>_KEYWORDS_MISSING_VALUES

这是您的问题的解决方案:

cmake_policy(VERSION 3.17)

function(foo)
    set(_options)
    set(_one_value_args VALUE)
    set(_multi_value_args)
    cmake_parse_arguments(
        PARSE_ARGV 0 _arg 
        "${_options}" 
        "${_one_value_args}" 
        "${_multi_value_args}"
      )

    if("VALUE" IN_LIST _arg_KEYWORDS_MISSING_VALUES)
        message(STATUS "VALUE: missed value")
    elseif(NOT DEFINED _arg_VALUE)
        message(STATUS "VALUE: undefined")
    else()
        message(STATUS "VALUE: got the value `${_arg_VALUE}`")
    endif()
endfunction()

foo()             ## undefined
foo(VALUE)        ## missed!!!
foo(VALUE bar)

输出:

$ cmake -P test.cmake
-- VALUE: undefined
-- VALUE: missed value
-- VALUE: got the value `bar`

推荐阅读