热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CMake语法—函数(解析参数PARSE_ARGV)

目录CMake语法—函数(解析参数PARSE_ARGV)1CMake函数解析参数PARSE_ARGV示例1.1CMakeLists.txt1.2执行CMake配置脚本1.3目录结构

目录
  • CMake语法—函数(解析参数 PARSE_ARGV)
    • 1 CMake函数解析参数PARSE_ARGV示例
      • 1.1 CMakeLists.txt
      • 1.2 执行CMake配置脚本
      • 1.3 目录结构
    • 2 结果
      • 2.1 环境说明
      • 2.2 运行结果
      • 2.3 结论
        • 2.3.1 cmake_parse_arguments 命令定义2
        • 2.3.2 PARSE_ARGV 这种形式只能应用于函数体中(PS:相对于宏而言,后期会梳理宏与函数的区别)
        • 2.3.3 N 是个无符号整型数值


CMake语法—函数(解析参数 PARSE_ARGV)


1 CMake函数解析参数PARSE_ARGV示例


1.1 CMakeLists.txt

cmake_minimum_required(VERSION 3.18)
# 设置工程名称
set(PROJECT_NAME KAIZEN)
# 设置工程版本号
set(PROJECT_VERSION "1.0.0.10" CACHE STRING "默认版本号")
# 工程定义
project(${PROJECT_NAME}
LANGUAGES CXX C
VERSION ${PROJECT_VERSION}
)
# 打印开始日志
message(STATUS "\n##########BEGIN_TEST")
# 定义函数
function(deploy)
set(options opt1 opt2 opt3)
set(oneValueArgs oneV1 oneV2 oneV3)
set(multiValueArgs multV1 multV2)

message(STATUS "ARGN: ${ARGN}")
message(STATUS "options: ${options}")
message(STATUS "oneValueArgs: ${oneValueArgs}")
message(STATUS "multiValueArgs: ${multiValueArgs}")

message(STATUS "\n----begin----PARSE_ARGV 0")
cmake_parse_arguments(PARSE_ARGV 0 Zero "${options}" "${oneValueArgs}" "${multiValueArgs}")
message(STATUS "Zero_opt1: ${Zero_opt1}")
message(STATUS "Zero_opt2: ${Zero_opt2}")
message(STATUS "Zero_opt3: ${Zero_opt3}")

message(STATUS "Zero_oneV1: ${Zero_oneV1}")
message(STATUS "Zero_oneV2: ${Zero_oneV2}")
message(STATUS "Zero_oneV3: ${Zero_oneV3}")
message(STATUS "Zero_multV1: ${Zero_multV1}")
message(STATUS "Zero_multV2: ${Zero_multV2}")

message(STATUS "Zero_KEYWORDS_MISSING_VALUES: ${Zero_KEYWORDS_MISSING_VALUES}")
message(STATUS "Zero_UNPARSED_ARGUMENTS: ${Zero_UNPARSED_ARGUMENTS}")
message(STATUS "----end----PARSE_ARGV 0")
message(STATUS "\n----begin----PARSE_ARGV 4")
cmake_parse_arguments(PARSE_ARGV 4 Four "${options}" "${oneValueArgs}" "${multiValueArgs}")
message(STATUS "Four_opt1: ${Four_opt1}")
message(STATUS "Four_opt2: ${Four_opt2}")
message(STATUS "Four_opt3: ${Four_opt3}")

message(STATUS "Four_oneV1: ${Four_oneV1}")
message(STATUS "Four_oneV2: ${Four_oneV2}")
message(STATUS "Four_oneV3: ${Four_oneV3}")
message(STATUS "Four_multV1: ${Four_multV1}")
message(STATUS "Four_multV2: ${Four_multV2}")

message(STATUS "Four_KEYWORDS_MISSING_VALUES: ${Four_KEYWORDS_MISSING_VALUES}")
message(STATUS "Four_UNPARSED_ARGUMENTS: ${Four_UNPARSED_ARGUMENTS}")
message(STATUS "----end----PARSE_ARGV 4")

message(STATUS "\n----begin----PARSE_ARGV 7")
cmake_parse_arguments(PARSE_ARGV 7 Seven "${options}" "${oneValueArgs}" "${multiValueArgs}")
message(STATUS "Seven_opt1: ${Seven_opt1}")
message(STATUS "Seven_opt2: ${Seven_opt2}")
message(STATUS "Seven_opt3: ${Seven_opt3}")

message(STATUS "Seven_oneV1: ${Seven_oneV1}")
message(STATUS "Seven_oneV2: ${Seven_oneV2}")
message(STATUS "Seven_oneV3: ${Seven_oneV3}")
message(STATUS "Seven_multV1: ${Seven_multV1}")
message(STATUS "Seven_multV2: ${Seven_multV2}")

message(STATUS "Seven_KEYWORDS_MISSING_VALUES: ${Seven_KEYWORDS_MISSING_VALUES}")
message(STATUS "Seven_UNPARSED_ARGUMENTS: ${Seven_UNPARSED_ARGUMENTS}")
message(STATUS "----end----PARSE_ARGV 7")
endfunction()
# 调用形式一(标准)
message(STATUS "----begin----调用形式一")
deploy(opt1 opt2 opt3 oneV1 abc oneV2 def oneV3 xyz multV1 kaizen baidu git multV2 C++ Java Python)
message(STATUS "----end----调用形式一")
# 调用形式二(标准但顺序不同)
message(STATUS "\n")
message(STATUS "----begin----调用形式二")
deploy(multV1 kaizen baidu git oneV1 abc opt1 oneV2 baidu opt2 oneV3 beijing opt3 multV2 C++ Java)
message(STATUS "----end----调用形式二")
# 打印结束日志
message(STATUS "##########END_TEST\n")

1.2 执行CMake配置脚本

@echo off
set currentDir=%~dp0
set buildDir=%currentDir%
set cmakeOutputDir=%currentDir%\build
cmake -S %buildDir% -B %cmakeOutputDir% -G"Visual Studio 16 2019" -T v140 -A x64
pause

1.3 目录结构

folder



  • learn_cmake:为根目录

  • build:为CMake配置输出目录(在此例中即生成sln解决方案的地方)

  • cmake_config.bat:执行CMake配置过程的脚本(双击直接运行)

  • CMakeLists.txt:CMake脚本


2 结果


2.1 环境说明

本地安装VS版本:Visual Studio 2019(2015工具集)

CMake版本:3.18.2

F:\learn_cmake
λ cmake --version
cmake version 3.18.2
CMake suite maintained and supported by Kitware (kitware.com/cmake).

2.2 运行结果

-- Selecting Windows SDK version 10.0.18362.0 to target Windows 10.0.17763.
-- The CXX compiler identification is MSVC 19.0.24245.0
-- The C compiler identification is MSVC 19.0.24245.0
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio 14.0/VC/bin/amd64/cl.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
--
##########BEGIN_TEST
-- ----begin----调用形式一
-- ARGN: opt1;opt2;opt3;oneV1;abc;oneV2;def;oneV3;xyz;multV1;kaizen;baidu;git;multV2;C++;Java;Python
-- options: opt1;opt2;opt3
-- oneValueArgs: oneV1;oneV2;oneV3
-- multiValueArgs: multV1;multV2
--
----begin----PARSE_ARGV 0
-- Zero_opt1: TRUE
-- Zero_opt2: TRUE
-- Zero_opt3: TRUE
-- Zero_oneV1: abc
-- Zero_oneV2: def
-- Zero_oneV3: xyz
-- Zero_multV1: kaizen;baidu;git
-- Zero_multV2: C++;Java;Python
-- Zero_KEYWORDS_MISSING_VALUES:
-- Zero_UNPARSED_ARGUMENTS:
-- ----end----PARSE_ARGV 0
--
----begin----PARSE_ARGV 4
-- Four_opt1: FALSE
-- Four_opt2: FALSE
-- Four_opt3: FALSE
-- Four_oneV1:
-- Four_oneV2: def
-- Four_oneV3: xyz
-- Four_multV1: kaizen;baidu;git
-- Four_multV2: C++;Java;Python
-- Four_KEYWORDS_MISSING_VALUES:
-- Four_UNPARSED_ARGUMENTS: abc
-- ----end----PARSE_ARGV 4
--
----begin----PARSE_ARGV 7
-- Seven_opt1: FALSE
-- Seven_opt2: FALSE
-- Seven_opt3: FALSE
-- Seven_oneV1:
-- Seven_oneV2:
-- Seven_oneV3: xyz
-- Seven_multV1: kaizen;baidu;git
-- Seven_multV2: C++;Java;Python
-- Seven_KEYWORDS_MISSING_VALUES:
-- Seven_UNPARSED_ARGUMENTS:
-- ----end----PARSE_ARGV 7
-- ----end----调用形式一
--
-- ----begin----调用形式二
-- ARGN: multV1;kaizen;baidu;git;oneV1;abc;opt1;oneV2;baidu;opt2;oneV3;beijing;opt3;multV2;C++;Java
-- options: opt1;opt2;opt3
-- oneValueArgs: oneV1;oneV2;oneV3
-- multiValueArgs: multV1;multV2
--
----begin----PARSE_ARGV 0
-- Zero_opt1: TRUE
-- Zero_opt2: TRUE
-- Zero_opt3: TRUE
-- Zero_oneV1: abc
-- Zero_oneV2: baidu
-- Zero_oneV3: beijing
-- Zero_multV1: kaizen;baidu;git
-- Zero_multV2: C++;Java
-- Zero_KEYWORDS_MISSING_VALUES:
-- Zero_UNPARSED_ARGUMENTS:
-- ----end----PARSE_ARGV 0
--
----begin----PARSE_ARGV 4
-- Four_opt1: TRUE
-- Four_opt2: TRUE
-- Four_opt3: TRUE
-- Four_oneV1: abc
-- Four_oneV2: baidu
-- Four_oneV3: beijing
-- Four_multV1:
-- Four_multV2: C++;Java
-- Four_KEYWORDS_MISSING_VALUES:
-- Four_UNPARSED_ARGUMENTS:
-- ----end----PARSE_ARGV 4
--
----begin----PARSE_ARGV 7
-- Seven_opt1: FALSE
-- Seven_opt2: TRUE
-- Seven_opt3: TRUE
-- Seven_oneV1:
-- Seven_oneV2: baidu
-- Seven_oneV3: beijing
-- Seven_multV1:
-- Seven_multV2: C++;Java
-- Seven_KEYWORDS_MISSING_VALUES:
-- Seven_UNPARSED_ARGUMENTS:
-- ----end----PARSE_ARGV 7
-- ----end----调用形式二
-- ##########END_TEST
-- Configuring done
-- Generating done
-- Build files have been written to: F:/learn_cmake/build
请按任意键继续. . .

2.3 结论


2.3.1 cmake_parse_arguments 命令定义2

cmake_parse_arguments(PARSE_ARGV


)

2.3.2 PARSE_ARGV 这种形式只能应用于函数体中(PS:相对于宏而言,后期会梳理宏与函数的区别)

2.3.3 N 是个无符号整型数值

从示例程序输出结果可知:

当 N==0 时,从第1个实参开始,后面所有实参均视为有效实参,前面的实参全部忽略掉。

当 N==4 时,从第5个实参开始,后面所有实参均视为有效实参,前面的实参全部忽略掉。

当 N==7 时,从第8个实参开始, 后面所有实参均视为有效实参,前面的实参全部忽略掉。



推荐阅读
  • 在Kubernetes上部署JupyterHub的步骤和实验依赖
    本文介绍了在Kubernetes上部署JupyterHub的步骤和实验所需的依赖,包括安装Docker和K8s,使用kubeadm进行安装,以及更新下载的镜像等。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 安装mysqlclient失败解决办法
    本文介绍了在MAC系统中,使用django使用mysql数据库报错的解决办法。通过源码安装mysqlclient或将mysql_config添加到系统环境变量中,可以解决安装mysqlclient失败的问题。同时,还介绍了查看mysql安装路径和使配置文件生效的方法。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了使用Python根据字典中的值进行排序的方法,并给出了实验结果。通过将字典转化为记录项,可以按照字典中的值进行排序操作。实验结果显示,按照值进行排序后的记录项为[('b', 2), ('a', 3)]。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
author-avatar
手机用户2502916905
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有