CMake语法—函数(解析参数)
目录
- CMake语法—函数(解析参数)
- 1 CMake函数解析参数示例
- 2 运行结果
- 2.1 环境说明
- 2.2 运行结果
- 2.3 结论
- 2.3.1 cmake_parse_arguments 命令定义
- 2.3.2 prefix:参数前缀
- 2.3.3 options: 选项
- 2.3.4 one_value_keywords
- 2.3.5 multi_value_keywords
- 2.3.6 args:一般传入${AGRN}即可
- 2.3.7 调用函数时,实参没有顺序要求
- 2.3.8 prefix_KEYWORDS_MISSING_VALUES: 定义关键词,但没有对应的值
- 2.3.9 prefix_UNPARSED_ARGUMENTS:表示未被使用的实参值
- 2.3.10 多值关键词,对应的值也可以为单数
- 2.3.11 通过foreach可以打印多值关键词的每个值
CMake语法—函数(解析参数)
1 CMake函数解析参数示例
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 "##########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}") cmake_parse_arguments(Gen "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN}) message(STATUS "Gen_opt1: ${Gen_opt1}") message(STATUS "Gen_opt2: ${Gen_opt2}") message(STATUS "Gen_opt3: ${Gen_opt3}") message(STATUS "Gen_oneV1: ${Gen_oneV1}") message(STATUS "Gen_oneV2: ${Gen_oneV2}") message(STATUS "Gen_oneV3: ${Gen_oneV3}") message(STATUS "Gen_multV1: ${Gen_multV1}") message(STATUS "Gen_multV2: ${Gen_multV2}") message(STATUS "Gen_KEYWORDS_MISSING_VALUES: ${Gen_KEYWORDS_MISSING_VALUES}") message(STATUS "Gen_UNPARSED_ARGUMENTS: ${Gen_UNPARSED_ARGUMENTS}") foreach (item ${Gen_multV2}) message(STATUS "item: ${item}") endforeach() 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----调用形式一") # 调用形式二(缺少opt1、opt2、oneV3) message(STATUS "\n") message(STATUS "----begin----调用形式二") deploy(opt3 oneV1 abc oneV2 def multV1 kaizen baidu git multV2 C++ Java Python) message(STATUS "----end----调用形式二") # 调用形式三(缺少opt2、opt3; 多余 opt4、hig) message(STATUS "\n") message(STATUS "----begin----调用形式三") deploy(opt1 opt2 opt4 oneV1 abc oneV2 def hig oneV3 multV1 kaizen baidu git multV2 C++) 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")
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 目录结构
- 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 -- Gen_opt1: TRUE -- Gen_opt2: TRUE -- Gen_opt3: TRUE -- Gen_oneV1: abc -- Gen_oneV2: def -- Gen_oneV3: xyz -- Gen_multV1: kaizen;baidu;git -- Gen_multV2: C++;Java;Python -- Gen_KEYWORDS_MISSING_VALUES: -- Gen_UNPARSED_ARGUMENTS: -- item: C++ -- item: Java -- item: Python -- ----end----调用形式一 -- -- ----begin----调用形式二 -- ARGN: opt3;oneV1;abc;oneV2;def;multV1;kaizen;baidu;git;multV2;C++;Java;Python -- options: opt1;opt2;opt3 -- oneValueArgs: oneV1;oneV2;oneV3 -- multiValueArgs: multV1;multV2 -- Gen_opt1: FALSE -- Gen_opt2: FALSE -- Gen_opt3: TRUE -- Gen_oneV1: abc -- Gen_oneV2: def -- Gen_oneV3: -- Gen_multV1: kaizen;baidu;git -- Gen_multV2: C++;Java;Python -- Gen_KEYWORDS_MISSING_VALUES: -- Gen_UNPARSED_ARGUMENTS: -- item: C++ -- item: Java -- item: Python -- ----end----调用形式二 -- -- ----begin----调用形式三 -- ARGN: opt1;opt2;opt4;oneV1;abc;oneV2;def;hig;oneV3;multV1;kaizen;baidu;git;multV2;C++ -- options: opt1;opt2;opt3 -- oneValueArgs: oneV1;oneV2;oneV3 -- multiValueArgs: multV1;multV2 -- Gen_opt1: TRUE -- Gen_opt2: TRUE -- Gen_opt3: FALSE -- Gen_oneV1: abc -- Gen_oneV2: def -- Gen_oneV3: -- Gen_multV1: kaizen;baidu;git -- Gen_multV2: C++ -- Gen_KEYWORDS_MISSING_VALUES: oneV3 -- Gen_UNPARSED_ARGUMENTS: opt4;hig -- item: C++ -- ----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 -- Gen_opt1: TRUE -- Gen_opt2: TRUE -- Gen_opt3: TRUE -- Gen_oneV1: abc -- Gen_oneV2: baidu -- Gen_oneV3: beijing -- Gen_multV1: kaizen;baidu;git -- Gen_multV2: C++;Java -- Gen_KEYWORDS_MISSING_VALUES: -- Gen_UNPARSED_ARGUMENTS: -- item: C++ -- item: Java -- ----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 命令定义
cmake_parse_arguments(<prefix> <options> <one_value_keywords> <multi_value_keywords> <args>...)
2.3.2 prefix:参数前缀
解析出的参数都会按照 prefix_参数名 的格式形成新的变量
2.3.3 options: 选项
此处包含选项的变量名,如果传递进来的参数包含此变量,则值为True,反之False
通过示例程序中,调用形式一、二、三的结果分析可得。
2.3.4 one_value_keywords
单值关键词列表
2.3.5 multi_value_keywords
多值关键词列表
2.3.6 args:一般传入${AGRN}即可
2.3.7 调用函数时,实参没有顺序要求
通过示例程序中,调用形式一、四的结果分析可得。
2.3.8 prefix_KEYWORDS_MISSING_VALUES: 定义关键词,但没有对应的值
在示例程序中,调用形式三:oneV3关键词,没有对应的值。
2.3.9 prefix_UNPARSED_ARGUMENTS:表示未被使用的实参值
在示例程序中,调用形式三:opt4、hig均为未被使用的实参值
2.3.10 多值关键词,对应的值也可以为单数
在示例程序中,调用形式三:multV2为多值关键词,但是只有一个值C++
2.3.11 通过foreach可以打印多值关键词的每个值
从各示例程序中,可以很清晰分析到。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
2013-11-22 COM编程之五 动静态链接