热门标签 | 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个实参开始, 后面所有实参均视为有效实参,前面的实参全部忽略掉。



推荐阅读
  • 探索偶数次幂二项式系数的求和方法及其数学意义 ... [详细]
  • 本文介绍了UUID(通用唯一标识符)的概念及其在JavaScript中生成Java兼容UUID的代码实现与优化技巧。UUID是一个128位的唯一标识符,广泛应用于分布式系统中以确保唯一性。文章详细探讨了如何利用JavaScript生成符合Java标准的UUID,并提供了多种优化方法,以提高生成效率和兼容性。 ... [详细]
  • 设计实战 | 10个Kotlin项目深度解析:首页模块开发详解
    设计实战 | 10个Kotlin项目深度解析:首页模块开发详解 ... [详细]
  • 在Python多进程编程中,`multiprocessing`模块是不可或缺的工具。本文详细探讨了该模块在多进程管理中的核心原理,并通过实际代码示例进行了深入分析。文章不仅总结了常见的多进程编程技巧,还提供了解决常见问题的实用方法,帮助读者更好地理解和应用多进程编程技术。 ... [详细]
  • 本文深入探讨了使用Puppet进行软件包分发与管理的方法。首先介绍了fpm这一跨平台的软件包制作工具,其简便的操作流程使得软件包的创建变得轻松快捷。fpm的项目地址为:https://github.com/jordansissel/fpm。通过结合Puppet和fpm,可以实现高效、可靠的软件包管理和部署。 ... [详细]
  • 通过使用CIFAR-10数据集,本文详细介绍了如何快速掌握Mixup数据增强技术,并展示了该方法在图像分类任务中的显著效果。实验结果表明,Mixup能够有效提高模型的泛化能力和分类精度,为图像识别领域的研究提供了有价值的参考。 ... [详细]
  • 本文深入解析了Python在处理HTML过滤时的实现方法及其应用场景。通过具体实例,详细介绍了如何利用Python代码去除HTML字符串中的标签和其他无关信息,确保内容的纯净与安全。此外,文章还探讨了该技术在网页抓取、数据清洗等领域的实际应用,为开发者提供了宝贵的参考。 ... [详细]
  • 本文全面解析了 gRPC 的基础知识与高级应用,从 helloworld.proto 文件入手,详细阐述了如何定义服务接口。例如,`Greeter` 服务中的 `SayHello` 方法,该方法在客户端和服务器端的消息交互中起到了关键作用。通过实例代码,读者可以深入了解 gRPC 的工作原理及其在实际项目中的应用。 ... [详细]
  • 在MFC框架中,存在多个全局函数,用于在不同对象间获取信息或创建新对象。其中,`afxGetApp`函数尤为关键,它能够帮助开发者轻松获取当前应用程序的实例指针。本文将详细解析`afxGetApp`函数的内部机制及其在MFC应用程序中的具体应用场景,探讨其在提升代码可维护性和灵活性方面的优势。此外,还将介绍其他常用全局函数如`AfxWinInit()`和`AfxBeginThread()`的功能和使用方法,为开发者提供全面的参考。 ... [详细]
  • 本文详细探讨了Zebra路由软件中的线程机制及其实际应用。通过对Zebra线程模型的深入分析,揭示了其在高效处理网络路由任务中的关键作用。文章还介绍了线程同步与通信机制,以及如何通过优化线程管理提升系统性能。此外,结合具体应用场景,展示了Zebra线程机制在复杂网络环境下的优势和灵活性。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 字节码开发笔记:深入解析与应用技巧 ... [详细]
  • 深入解析 Vue 中的 Axios 请求库
    本文深入探讨了 Vue 中的 Axios 请求库,详细解析了其核心功能与使用方法。Axios 是一个基于 Promise 的 HTTP 客户端,支持浏览器和 Node.js 环境。文章首先介绍了 Axios 的基本概念,随后通过具体示例展示了如何在 Vue 项目中集成和使用 Axios 进行数据请求。无论你是初学者还是有经验的开发者,本文都能为你解决 Vue.js 相关问题提供有价值的参考。 ... [详细]
  • 在 Windows 10 环境中,通过配置 Visual Studio Code (VSCode) 实现基于 Windows Subsystem for Linux (WSL) 的 C++ 开发,并启用智能代码提示功能。具体步骤包括安装 VSCode 及其相关插件,如 CCIntelliSense、TabNine 和 BracketPairColorizer,确保在 WSL 中顺利进行开发工作。此外,还详细介绍了如何在 Windows 10 中启用和配置 WSL,以实现无缝的跨平台开发体验。 ... [详细]
  • 在HDU 1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。 ... [详细]
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社区 版权所有