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.pswp.cn/news/899763.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899763.shtml
英文地址,請注明出處:http://en.pswp.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天人流破百開啟限流?” …