cmake - 确定提供给 cmake_parse_arguments() 的 one_value_keyword 是否没有值
问题描述
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 (>= 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`
推荐阅读
- javascript - e.preventDefault 在 javascript 中不起作用
- python - Python 语音识别在基于窗口的 GUI 应用程序中不起作用(它是一个带有隐藏控制台的 .exe 应用程序)
- ios - 如何在一个 ViewController 和另一个控制器之间共享核心数据(小部件)
- rest - 如何使用 apollo-datasource-rest 编写 Multipart-form POST REQUEST
- flutter - Flutter ontap 在模拟器中工作,但在移动设备中不一致
- c# - 从父组件传递的 Blazor Page Bootstrap 模型不显示
- nginx - 如何区分 nginx 中的 root 和所有其他子路由?
- javascript - Firebase 问题的登录身份验证
- node.js - JWT 授权失败
- python - 熊猫数据框组合