Определите, было ли слово one_value_keyword, предоставленное для cmake_parse_arguments (), задано без значения - PullRequest
0 голосов
/ 02 мая 2020

Документация здесь 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 или без ЗНАЧЕНИЯ?
Как устранить неоднозначность первого и второго вызовов?

1 Ответ

1 голос
/ 02 мая 2020

В случае пропущенного значения 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`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...