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

示例项目仓库: https://github.com/yangxinghai/cmake-presets-tutorial

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++ 开发环境配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899763.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue搭建一个树形菜单项目

首先搭建项目需要先通过步骤搭建一个vue的项目,然后创建一个component文件,里面新建一个index.vue页面来。 这是引入的element-ui组件库里的组件,来实现我的路由,渲染的是我存储的动态路由,所以需要先安装并且引用。 …

【Python 算法】动态规划

本博客笔记内容来源于灵神,视频链接如下:https://www.bilibili.com/video/BV16Y411v7Y6?vd_source7414087e971fef9431117e44d8ba61a7&spm_id_from333.788.player.switch 01背包 计算了f[i1],f[i]就没用了,相当于每时每刻只有…

c#的反射和特性

在 C# 中,反射(Reflection)和特性(Attributes)是两个强大的功能,它们在运行时提供元编程能力,广泛用于框架开发、对象映射和动态行为扩展。以下是对它们的详细介绍,包括定义、用法、…

云终端的作用,此刻在校园和医院里具象化

数字化转型已经成为各行各业交流的热点话题,校园和医院这两个重要领域正经历着深刻变革。云终端,正以实际应用成果展现其独特作用,让人们切实感受到它带来的高效与便利。 传统的教学中,学校机房的电脑设备更新换代成本高&#xf…

UniApp快速表单组件

环境&#xff1a;vue3 uni-app 依赖库&#xff1a;uview-plus、dayjs 通过配置项快速构建 form 表单 使用 <script setup>import CustomCard from /components/custom-card.vue;import { ref } from vue;import CustomFormItem from /components/form/custom-form-it…

Android: Handler 的用法详解

Android 中 Handler 的用法详解 Handler 是 Android 中用于线程间通信的重要机制&#xff0c;主要用于在不同线程之间发送和处理消息。以下是 Handler 的全面用法指南&#xff1a; 一、Handler 的基本原理 Handler 基于消息队列(MessageQueue)和循环器(Looper)工作&#xff…

UE5学习笔记 FPS游戏制作33 游戏保存

文章目录 核心思想创建数据对象创建UIUI参数和方法打开UI存档文件的位置可以保存的数据类型 核心思想 UE自己有保存游戏的功能&#xff0c;核心节点&#xff0c;类似于json操作&#xff0c;需要一个数据类的对象来进行保存和读取 创建存档 加载存档 保存存档 创建数据对象…

【蓝桥杯】 枚举和模拟练习题

系列文章目录 蓝桥杯例题 枚举和模拟 文章目录 系列文章目录前言一、好数&#xff1a; 题目参考&#xff1a;核心思想&#xff1a;代码实现&#xff1a; 二、艺术与篮球&#xff1a; 题目参考&#xff1a;核心思想&#xff1a;代码实现: 总结 前言 今天距离蓝桥杯还有13天&…

大数据技术之Scala:特性、应用与生态系统

摘要 Scala 作为一门融合面向对象编程与函数式编程范式的编程语言&#xff0c;在大数据领域展现出独特优势。本文深入探讨 Scala 的核心特性&#xff0c;如函数式编程特性、类型系统以及与 Java 的兼容性等。同时&#xff0c;阐述其在大数据处理框架&#xff08;如 Apache Spa…

Linux信号——信号的产生(1)

注&#xff1a;信号vs信号量&#xff1a;两者没有任何关系&#xff01; 信号是什么&#xff1f; Linux系统提供的&#xff0c;让用户&#xff08;进程&#xff09;给其他进程发送异步信息的一种方式。 进程看待信号的方式&#xff1a; 1.信号在没有发生的时候&#xff0c;进…

数据结构和算法——汉诺塔问题

前言 先讲个故事&#xff0c;传说古代印度有三根黄金柱&#xff0c;64个石盘&#xff0c;需要将石盘从第一根移动到第三根上&#xff0c;规定每次只能移动一片&#xff0c;并且小盘在放置时必须在大盘上。 当石盘移动完毕时&#xff0c;世界就会毁灭。 汉诺塔——递归 接下来…

2023年3月全国计算机等级考试真题(二级C语言)

&#x1f600; 第1题 下列叙述中错误的是 A. 向量是线性结构 B. 非空线性结构中只有一个结点没有前件 C. 非空线性结构中只有一个结点没有后件 D. 只有一个根结点和一个叶子结点的结构必定是线性结构 概念澄清 首先&#xff0c;我们需要明确几个关键概念&#xf…

Kafka简单的性能调优

Kafka 的性能调优是一个系统性工程&#xff0c;需要从生产者、消费者、Broker 配置以及集群架构等多个层面进行综合调整。以下是一些关键的性能调优策略&#xff1a; 一、生产者性能优化 批量发送 batch.size&#xff1a;控制消息批量的最大字节数&#xff0c;默认值为 16KB。…

微前端 - 以无界为例

一、微前端核心概念 微前端是一种将单体前端应用拆分为多个独立子应用的架构模式&#xff0c;每个子应用可独立开发、部署和运行&#xff0c;具备以下特点&#xff1a; 技术栈无关性&#xff1a;允许主应用和子应用使用不同框架&#xff08;如 React Vue&#xff09;。独立部…

企业级日志分析平台: ELK 集群搭建指南

前言&#xff1a;在当今数字化时代&#xff0c;数据已经成为企业决策的核心驱动力。无论是日志分析、用户行为追踪&#xff0c;还是实时监控和异常检测&#xff0c;高效的数据处理和可视化能力都至关重要。ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;作为全球…

1.2-WAF\CDN\OSS\反向代理\负载均衡

WAF&#xff1a;就是网站应用防火墙&#xff0c;有硬件类、软件类、云WAF&#xff1b; 还有网站内置的WAF&#xff0c;内置的WAF就是直接嵌在代码中的安全防护代码 硬件类&#xff1a;Imperva、天清WAG 软件&#xff1a;安全狗、D盾、云锁 云&#xff1a;阿里云盾、腾讯云WA…

MybatisPlus(SpringBoot版)学习第四讲:常用注解

目录 1.TableName 1.1 问题 1.2 通过TableName解决问题 1.3 通过全局配置解决问题 2.TableId 2.1 问题 2.2 通过TableId解决问题 2.3 TableId的value属性 2.4 TableId的type属性 2.5 雪花算法 1.背景 2.数据库分表 ①垂直分表 ②水平分表 1>主键自增 2>取…

第二届计算机网络和云计算国际会议(CNCC 2025)

重要信息 官网&#xff1a;www.iccncc.org 时间&#xff1a;2025年4月11-13日 地点&#xff1a;中国南昌 简介 第二届计算机网络和云计算国际会议&#xff08;CNCC 2025&#xff09;将于2025年4月11-13日在中国南昌召开。围绕“计算机网络”与“云计算”展开研讨&#xff…

【大模型基础_毛玉仁】5.4 定位编辑法:ROME

目录 5.4 定位编辑法&#xff1a;ROME5.4.1 知识存储位置1&#xff09;因果跟踪实验2&#xff09;阻断实验 5.4.2 知识存储机制5.4.3 精准知识编辑1&#xff09;确定键向量2&#xff09;优化值向量3&#xff09;插入知识 5.4 定位编辑法&#xff1a;ROME 定位编辑&#xff1a;…

横扫SQL面试——连续性登录问题

横扫SQL面试 &#x1f4cc; 连续性登录问题 在互联网公司的SQL面试中&#xff0c;连续性问题堪称“必考之王”。&#x1f4bb;&#x1f50d; 用户连续登录7天送优惠券&#x1f31f;&#xff0c;服务器连续报警3次触发熔断⚠️&#xff0c;图书馆连续3天人流破百开启限流⚡” …