当前位置: 首页 > news >正文

CMake Presets教程

在使用 CMake 作为构建工具的时候, 对于一个稍微大一点的项目, 存在有很多的选项. 比如 Debug 版本还是 Release 版本, 是否开启特定选项, 是否开启测试等等. 这些通常是作为命令行参数传递进去的. 但是很多程序员并不在命令行中作开发, 更多的是使用 IDE 来进行开发. 不同的 IDE 的设置参数的方式不同, 这对于多方协同的开发来说, 有些不方便.

CMake Presets 就提供了一种解决这个问题的方式. 它允许你定义一个配置文件(CMakePresets.json), 将对 CMake 的传递参数写入到该文件, 然后在 IDE 中加载这个配置文件, 然后就可以使用 IDE 的界面来设置参数了. 这样不论是在命令行,还是 IDE 中都能很方便的使用相同参数. 目前支持的 IDE 有: CLion/Visual Studio/VS Code.

如何使用

  1. 创建一个 CMakePresets.json 文件. 用户也可以创建一个本地的CMakeUserPresets.json文件, 来做本地化适配. 但这个文件不应该被添加到 git 仓库中.
  2. 写入配置, 配置方法见后.
  3. 重新打开项目, 重新加载项目.

CMakePresets.json 文件结构

包含如下字段:

  1. version: 必填字段. 配置文件格式(schema)版本号, 目前是一个整数. 不同版本的 CMake 支持的版本不一样. 详细列表请查看官网文档.
  2. cmakeMinimumRequired: 可选字段. 表示对 CMake 版本的最低要求.
  3. configurePresets: 可选字段. 用于配置 CMake 的参数. 这个是经常使用的字段.
  4. buildPresets: 可选字段. 用于构建的参数. 最低要求版本 2.
  5. testPresets: 可选字段. 用于测试的参数. 最低要求版本 2.
  6. packagePresets: 可选字段, 用于打包的参数. 最低要求版本 6.
  7. workflowPresets: 可选字段. 用于工作流的参数. 最低要求版本 6.

这些字段的详细配置介绍起来枯燥乏味, 这里针对使用场景来介绍如何使用.

配置样例

设置 CMake 命令行参数

{
  "configurePresets": [
    {
      "name": "linux-base",
      "description": "Default CMake configure preset",
      "generator": "Ninja",
      "binaryDir": "/tmp/build",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_EXPORT_COMPILE_COMMANDS": "YES",
        "CMAKE_TOOLCHAIN_FILE": "/home/vscode/vcpkg/scripts/buildsystems/vcpkg.cmake"
      },
      "condition": {
        "type": "equals",
        "lhs": "${hostSystemName}",
        "rhs": "Linux"
      }
    }
  ]
}

上述的配置等价于:

cmake -S . \
      -B /tmp/build
      -G Ninja \
      -DCMAKE_BUILD_TYPE=Debug \
      -DCMAKE_EXPORT_COMPILE_COMMANDS=YES \
      -DCMAKE_TOOLCHAIN_FILE=/home/vscode/ vcpkg/scripts/buildsystems/vcpkg.cmake

并且该选项只在 Linux 系统下生效. 这是通过condition字段实现的. 同样的, 你可以写出只在 Windows 可用的配置.

配置工作流

下面的配置创建了一个从配置到运行测试的工作流. 在前面的 configurePresets 我们需要依次配置:

  1. buildPresets
  2. testPresets
  3. workflowPresets
{
  "configurePresets": [
    {
      "name": "linux-base",
      "description": "Default CMake configure preset",
      "generator": "Ninja",
      "binaryDir": "/tmp/build",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_EXPORT_COMPILE_COMMANDS": "YES",
        "CMAKE_TOOLCHAIN_FILE": "/home/vscode/vcpkg/scripts/buildsystems/vcpkg.cmake"
      },
      "condition": {
        "type": "equals",
        "lhs": "${hostSystemName}",
        "rhs": "Linux"
      }
    }
  ],
  "buildPresets": [
    {
      "name": "linux-base-build",
      "configurePreset": "linux-base"
    }
  ],
  "testPresets": [
    {
      "name": "linux-base-test",
      "configurePreset": "linux-base",
      "output": {
        "outputOnFailure": true
      },
      "execution": {
        "noTestsAction": "error",
        "stopOnFailure": true
      }
    }
  ],
  "workflowPresets": [
    {
      "name": "default",
      "steps": [
        {
          "type": "configure",
          "name": "linux-base"
        },
        {
          "type": "build",
          "name": "linux-base-build"
        },
        {
          "type": "test",
          "name": "linux-base-test"
        }
      ]
    }
  ]
}

在 VS Code 中, 可以点击run workflow即可运行上述的工作流.

在命令行触发:

cmake --workflow --preset default

示例项目仓库

IDE 中使用

  1. CLion 目前支持使用 CMakePresets.json 做配置和构建.

      1. 打开 Settings -> Advanced Settings -> Automatically import CMake Presets
      1. 启用配置: Settings | Build, Execution, Deployment | CMake
        CLion
  2. VS Code 目前的支持比较完整, 可以直接运行工作流. VS Code 中需要使用C/C++ Extension Pack来做到支持.
    run-workflow

进一步阅读

  1. 使用 CMake 开发库(Library)的最佳实践
  2. CMake 入门教程
  3. VS Code C++ 开发环境配置

相关文章:

  • 17年哪个网站做h5最好我想学做互联网怎么入手
  • 钓鱼网站后台是怎么做的西安小程序开发的公司
  • 合肥网站推广电话排名公式
  • 设计网站怎么做网络推广是啥
  • 店铺设计网站推荐企业文化墙
  • 网站优化的公司天津百度推广中心
  • 开发一个小程序需要多久时间?小程序软件开发周期
  • 【Flask开发】嘿马文学web完整flask项目第2篇:2.用户认证,Json Web Token(JWT)【附代码文档】
  • 物联网安全技术:守护智能世界的防线
  • 如何把已有的虚拟环境的python版本进行降级?
  • Java观察者模式详解
  • AI助理是如何助力企业的
  • git克隆数据失败
  • 优维HAO案例:香港联交所上市企业「智能运维平台」项目
  • 【学Rust写CAD】25 变量类(variable.rs)
  • 优雅~~Spring Boot 整合多数据源的姿势
  • 计算机硬件——CPU 主要参数
  • 图像处理:使用Numpy和OpenCV实现傅里叶和逆傅里叶变换
  • 裴蜀定理:整数解的奥秘
  • AI与玩具结合的可行性分析
  • 【学Rust写CAD】28 带 Alpha 通道的双线性插值函数(bilinear_interpolation_alpha.rs)
  • 第六章:机器人建模与仿真__《ROS机器人开发实践》_notes
  • 告别外置电路:IEPE接口如何重构精密测量生态?
  • DreamDiffusion代码学习及复现
  • 【Linux】GCC编译选项-Wl 和 链接(ld)选项-rpath
  • 【自动化运维】Python 的安装和使用