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


    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 目录结构

    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
    -- 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可以打印多值关键词的每个值

    从各示例程序中,可以很清晰分析到。

  • 相关阅读:
    如何入门深度学习
    机器学习之激活函数
    轻量化模型之SqueezeNet
    聚类算法之MeanShift
    目标检测之RefineDet
    语义分割之RefineNet
    数学基础之高斯核函数
    目标检测之人脸识别
    梯度下降算法及优化方法
    机器学习高阶训练营知识点一览
  • 原文地址:https://www.cnblogs.com/Braveliu/p/15591020.html
Copyright © 2020-2023  润新知