首页 > 其他分享 >CMake语法—选项(option)

CMake语法—选项(option)

时间:2023-02-01 10:47:48浏览次数:59  
标签:CMake option -- message 语法 BUILD TEST KAIZEN EXAMPLE

CMake语法—选项(option)

1 选项

1.1 定义

 
1f371a30bd0002168f6007c3a01e6584.png

1.2 说明

  • variable 选项名
  • help_text 描述、解释、备注
  • value 选项初始化值(除ON而外全为OFF)

2 应用注意事项

2.1 代码结构

  • learn_cmake:为根目录

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

  • CMakeLists.txt:CMake脚本

  • cmake_config.bat:执行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

2.2 注意事项

2.2.1 不初始化或赋为非ON的值,全部视为OFF

  1. 示例代码

     
      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_OPTION")
       
      ## 示例1:不赋值
      option(${PROJECT_NAME}_BUILD_TEST "构建测试模块")
       
      if (DEFINED ${PROJECT_NAME}_BUILD_TEST)
      message(STATUS "defined KAIZEN_BUILD_TEST")
      else()
      message(STATUS "not defined KAIZEN_BUILD_TEST")
      endif()
       
      if (${PROJECT_NAME}_BUILD_TEST)
      message(STATUS "KAIZEN_BUILD_TEST is ON")
      else()
      message(STATUS "KAIZEN_BUILD_TEST is OFF")
      endif()
      message(STATUS "\n")
       
      ## 示例2:赋值为非ON、非OFF值
      option(${PROJECT_NAME}_BUILD_EXAMPLE "构建示例模块" AAA)
       
      if (DEFINED ${PROJECT_NAME}_BUILD_EXAMPLE)
      message(STATUS "defined KAIZEN_BUILD_EXAMPLE")
      else()
      message(STATUS "not defined KAIZEN_BUILD_EXAMPLE")
      endif()
       
      if (${PROJECT_NAME}_BUILD_EXAMPLE)
      message(STATUS "KAIZEN_BUILD_EXAMPLE_1 is ON")
      else()
      message(STATUS "KAIZEN_BUILD_EXAMPLE_1 is OFF")
      endif()
       
      if (${${PROJECT_NAME}_BUILD_TYPE})
      message(STATUS "KAIZEN_BUILD_EXAMPLE_2 is ON")
      else()
      message(STATUS "KAIZEN_BUILD_EXAMPLE_2 is OFF")
      endif()
      message(STATUS "\n")
       
      ## 示例3:赋值为ON
      option(${PROJECT_NAME}_BUILD_GUI "构建视图模块" ON)
       
      if (DEFINED ${PROJECT_NAME}_BUILD_GUI)
      message(STATUS "defined KAIZEN_BUILD_GUI")
      else()
      message(STATUS "not defined KAIZEN_BUILD_GUI")
      endif()
       
      if (${PROJECT_NAME}_BUILD_GUI)
      message(STATUS "KAIZEN_BUILD_GUI is ON")
      else()
      message(STATUS "KAIZEN_BUILD_GUI is OFF")
      endif()
       
      # 打印结束日志
      message(STATUS "########## END_TEST_OPTION\n")
  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_OPTION
      -- defined KAIZEN_BUILD_TEST
      -- KAIZEN_BUILD_TEST is OFF
      --
       
      -- defined KAIZEN_BUILD_EXAMPLE
      -- KAIZEN_BUILD_EXAMPLE_1 is OFF
      -- KAIZEN_BUILD_EXAMPLE_2 is OFF
      --
       
      -- defined KAIZEN_BUILD_GUI
      -- KAIZEN_BUILD_GUI is ON
      -- ########## END_TEST_OPTION
       
      -- Configuring done
      -- Generating done
      -- Build files have been written to: F:/learn_cmake/build
      请按任意键继续. . .

2.2.2 在定义语句执行后才有效;在定义之前均视为未定义(除过在CMake命令中通过-D预定义)

  1. 示例代码

     
      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_OPTION")
       
      ## 定义之前是看不到的
      if (DEFINED ${PROJECT_NAME}_BUILD_TEST)
      message(STATUS "defined KAIZEN_BUILD_TEST")
      else()
      message(STATUS "not defined KAIZEN_BUILD_TEST")
      endif()
       
      ## 定义语句
      option(${PROJECT_NAME}_BUILD_TEST "构建测试模块" ON)
       
      ## 定义后才可以看到
      if (DEFINED ${PROJECT_NAME}_BUILD_TEST)
      message(STATUS "defined KAIZEN_BUILD_TEST")
      else()
      message(STATUS "not defined KAIZEN_BUILD_TEST")
      endif()
       
      ## 定义后再应用
      if (${PROJECT_NAME}_BUILD_TEST)
      message(STATUS "KAIZEN_BUILD_TEST is ON")
      else()
      message(STATUS "KAIZEN_BUILD_TEST is OFF")
      endif()
       
      # 打印结束日志
      message(STATUS "########## END_TEST_OPTION\n")
       
  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_OPTION
      -- not defined KAIZEN_BUILD_TEST
      -- defined KAIZEN_BUILD_TEST
      -- KAIZEN_BUILD_TEST is ON
      -- ########## END_TEST_OPTION
       
      -- Configuring done
      -- Generating done
      -- Build files have been written to: F:/learn_cmake/build
      请按任意键继续. . .

2.2.3 已定义option选项会存储在CMakeCache.txt中。等价于缓存变量作用。

运行2.2.1中的示例代码,然后可以查看build目录下的CMakeCache.txt文件。如下图:

2.2.4 如果出现同名的变量(普通或缓存变量),则option会被忽略

  1. 示例代码

     
      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_OPTION")
       
      ## 1.1先定义普通变量
      set(${PROJECT_NAME}_BUILD_TEST "构建测试模块")
       
      if (DEFINED ${PROJECT_NAME}_BUILD_TEST)
      message(STATUS "defined KAIZEN_BUILD_TEST")
      else()
      message(STATUS "not defined KAIZEN_BUILD_TEST")
      endif()
       
      message(STATUS "KAIZEN_BUILD_TEST_1: ${${PROJECT_NAME}_BUILD_TEST}\n")
       
      ## 1.2再定义同名option选项
      option(${PROJECT_NAME}_BUILD_TEST "构建测试模块" ON)
       
      message(STATUS "KAIZEN_BUILD_TEST_2: ${${PROJECT_NAME}_BUILD_TEST}\n")
       
      ### 2.1先定义option选项
      option(${PROJECT_NAME}_BUILD_EXAMPLE "构建示例模块" OFF)
       
      if (DEFINED ${PROJECT_NAME}_BUILD_EXAMPLE)
      message(STATUS "defined KAIZEN_BUILD_EXAMPLE")
      else()
      message(STATUS "not defined KAIZEN_BUILD_EXAMPLE")
      endif()
       
      message(STATUS "KAIZEN_BUILD_EXAMPLE_1: ${KAIZEN_BUILD_EXAMPLE}")
       
      ### 2.2再定义普通同名变量
      set(${PROJECT_NAME}_BUILD_EXAMPLE "构建示例模块")
       
      message(STATUS "KAIZEN_BUILD_EXAMPLE_2: ${KAIZEN_BUILD_EXAMPLE}")
       
      # 打印结束日志
      message(STATUS "########## END_TEST_OPTION\n")
  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_OPTION
      -- defined KAIZEN_BUILD_TEST
      -- KAIZEN_BUILD_TEST_1: 构建测试模块
       
      -- KAIZEN_BUILD_TEST_2: 构建测试模块
       
      -- defined KAIZEN_BUILD_EXAMPLE
      -- KAIZEN_BUILD_EXAMPLE_1: OFF
      -- KAIZEN_BUILD_EXAMPLE_2: 构建示例模块
      -- ########## END_TEST_OPTION
       
      -- Configuring done
      -- Generating done
      -- Build files have been written to: F:/learn_cmake/build
      请按任意键继续. . .

2.2.5 CMake命令中通过-D预设同名变量,则option也会被忽略(其本质与2.2.4相同)

  1. 示例代码

     
      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_OPTION")
       
      if (DEFINED ${ PROJECT_NAME }_BUILD_EXAMPLE)
      message(STATUS "defined KAIZEN_BUILD_EXAMPLE")
      else()
      message(STATUS "not defined KAIZEN_BUILD_EXAMPLE")
      endif()
       
      ## 定义option选项
      option(${ PROJECT_NAME }_BUILD_EXAMPLE "构建示例模块" OFF)
       
      message(STATUS "KAIZEN_BUILD_EXAMPLE: ${KAIZEN_BUILD_EXAMPLE}")
       
      # 打印结束日志
      message(STATUS "########## END_TEST_OPTION\n")
  2. cmake_config.bat

     
      @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 -DKAIZEN_BUILD_EXAMPLE=ON
      pause
  3. 运行结果

     
      --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_OPTION
      -- defined KAIZEN_BUILD_EXAMPLE
      -- KAIZEN_BUILD_EXAMPLE: ON
      -- ########## END_TEST_OPTION
       
      -- Configuring done
      -- Generating done
      -- Build files have been written to : F: / learn_cmake / build
      请按任意键继续. . .

2.2.6 修改option选项值(建议通过缓存变量方式修改)

  1. 示例代码

     
      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_OPTION")
       
      if (DEFINED ${ PROJECT_NAME }_BUILD_EXAMPLE)
      message(STATUS "defined KAIZEN_BUILD_EXAMPLE")
      else()
      message(STATUS "not defined KAIZEN_BUILD_EXAMPLE")
      endif()
       
      ## 定义option选项
      option(${ PROJECT_NAME }_BUILD_EXAMPLE "构建示例模块" OFF)
       
      message(STATUS "KAIZEN_BUILD_EXAMPLE_1: ${KAIZEN_BUILD_EXAMPLE}")
       
      ## 方式一:修改option选项值(无效方式,请忽略)
      option(${ PROJECT_NAME }_BUILD_EXAMPLE "构建示例模块" ON)
       
      message(STATUS "KAIZEN_BUILD_EXAMPLE_2: ${KAIZEN_BUILD_EXAMPLE}")
       
      ## 方式二:通过cache变量方式修改(正确方式,力推荐)
      set(${ PROJECT_NAME }_BUILD_EXAMPLE ON CACHE BOOL "构建示例模块" FORCE)
       
      message(STATUS "KAIZEN_BUILD_EXAMPLE_3: ${KAIZEN_BUILD_EXAMPLE}")
       
      # 打印结束日志
      message(STATUS "########## END_TEST_OPTION\n")
  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_OPTION
      -- not defined KAIZEN_BUILD_EXAMPLE
      -- KAIZEN_BUILD_EXAMPLE_1: OFF
      -- KAIZEN_BUILD_EXAMPLE_2 : OFF
      -- KAIZEN_BUILD_EXAMPLE_3 : ON
      -- ########## END_TEST_OPTION
       
      -- Configuring done
      -- Generating done
      -- Build files have been written to : F: / learn_cmake / build
      请按任意键继续. . .

    INI 复制 全屏

    当然,也可以通过定义同名普通变量方式进行修改。

    但是,通过普通变量方式修改后,CMakeCache.txt中的值仍然为旧值。感兴趣可自行验证。

    option选项本质与缓存变量相同,即会存储在CMakeCache.txt中。因此修改其值也推荐使用缓存变量的方式,这样会直接修改CMakeCache.txt中的存储值,更彻底、更本质、更安全。

标签:CMake,option,--,message,语法,BUILD,TEST,KAIZEN,EXAMPLE
From: https://www.cnblogs.com/lidabo/p/17081750.html

相关文章

  • cmake命令之option使用案例
    option的命令形式如下option(<variable>"<help_text>"[value]) option简介    cmake中option起到编译开关的作用,CMakeLists.txt中option以前的语句,变量......
  • CMake option选项开关
    CMakeoption使用场景:编译脚本传递参数->CMake脚本接收option->源代码宏1.编译脚本传入参数传入一个cmakeoptionTEST_DEBUG#!/bin/shcmake-DTEST_DEBUG=ON......
  • Python 基础语法介绍(二)
    一、概述上一篇文章:Python基础语法介绍(一),已经介绍了一部分基础知识了,这里就继续介绍python基础知识。二、函数函数是组织好的,可重复使用的,用来实现单一,或相关联功能的......
  • ASP.Net 8将提供路由语法高亮提示
    .NET8将为所有路由提供路由语法高亮显示,包括minimalAPI、MVC、WebAPI、Razor页面和Blazor中的路由。路由语法高亮显示依赖于在代码库中应用的StringSyntax属性......
  • 【KAWAKO】在windows上用CMake和MinGW编译c++工程
    目录安装CMake安装MinGW编写CMakeLists.txt编译一条龙安装CMake在网上随便找个教程照着安装就行了,不再赘述。安装MinGW参考这篇博客。从MinGW官网下载的安装包在安装的......
  • C#中检查null的语法糖
     今天看到已经更新了devblogs,新增的C#11的!!(用于检查null的语法)经过非常长的讨论,最后取消了。然后我又想起来null检查,这个可以说一说。函数参数null检查传统写法写......
  • CURLINFO_EFFECTIVE_METHOD option
    添加CURLINFO_EFFECTIVE_METHOD选项,在curl_getinfo()的返回值中返回有效的HTTP方法。添加了curl_upkeep()函数来执行任何连接维护检查。......
  • verilog语法
    标识符与关键字标识符(identifier)可以是任意一组字母、数字、$ 符号和 _(下划线)符号的合,但标识符的第一个字符必须是字母或者下划线,不能以数字或者美元符开始。另外,标......
  • 报错HTTP 405 Method Not Allowed, Allow: POST, OPTIONS, "detail": "方法 “GET” 不
    当测试注册功能是否实现时,出现了这种情况的405:HTTP405MethodNotAllowedAllow:POST,OPTIONSContent-Type:application/jsonVary:Accept{"detail":"方法“GET......
  • python语法到底多精妙?八大核心语句,带你深度了解
    Python是一种代表简单思想的语言,其语法相对简单,很容易上手。不过,如果就此小视Python语法的精妙和深邃,那就大错特错了。本文精心筛选了最能展现Python语法之精妙的十......