В случае пропущенного значения 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`