目錄
- 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可以打印多值關鍵詞的每個值
從各示例程序中,可以很清晰分析到。