iT邦幫忙

2025 iThome 鐵人賽

DAY 29
0
Software Development

30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰系列 第 29

[Day 29] [cmake] 用CMakePresets.json 與團隊合作

  • 分享至 

  • xImage
  •  

今天會學到的

今天要來看看 CMakePresets.json
CMakePresets 定位:把我們常用的編譯參數、目錄結構、編譯模式(Debug/Release/ASan…)統一寫在一份 JSON 裡,大家只要下 cmake --preset 就能編譯,不用再每次手動輸入一長串 -S-B-D-G

換句話說,這東西就是幫我們把設定寫死,免得忘記──同時也方便團隊共享,不會出現我這台能編,你那台不能的狀況

今天會學到:

  • CMakePresets.json 是什麼,為什麼方便
  • 怎麼建立 Debug / Release / Sanitizer / 交叉編譯等多種組態
  • 怎麼在 VSCode、CLion、甚至 CI/CD pipeline 用這個檔案

好處與實際案例

步驟

  1. 建立 CMakePresets.json

先在專案根目錄新增這個檔案,內容大概像這樣:

{
  "version": 6,
  "configurePresets": [
    {
      "name": "debug-ninja",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build/debug",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug",
        "CMAKE_EXPORT_COMPILE_COMMANDS": "ON"
      }
    },
    {
      "name": "release-ninja",
      "generator": "Ninja",
      "binaryDir": "${sourceDir}/build/release",
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Release"
      }
    },
    {
      "name": "asan",
      "inherits": "debug-ninja",
      "cacheVariables": {
        "CMAKE_C_FLAGS": "-fsanitize=address -g",
        "CMAKE_CXX_FLAGS": "-fsanitize=address -g"
      }
    }
  ],
  "buildPresets": [
    { "name": "debug", "configurePreset": "debug-ninja", "jobs": 8 },
    { "name": "release", "configurePreset": "release-ninja", "jobs": 8 },
    { "name": "asan", "configurePreset": "asan", "jobs": 8 }
  ],
  "testPresets": [
    { "name": "ctest-debug", "configurePreset": "debug-ninja", "output": { "outputOnFailure": true } }
  ]
}

這樣一份 JSON,就把不同情境下的組態寫好了

  1. 使用 Presets

實際用起來就是幾個簡單的指令:

cmake --list-presets
cmake --preset debug-ninja
cmake --build --preset debug
ctest --preset ctest-debug
  • --list-presets 可以看到有哪些預設組態

  • --preset 則是直接套用設定(不用再打 -S . -B build -D... 那一堆)

  1. 在 VSCode / CLion 裡使用

VSCode 裝了 CMake Tools extension 之後,它會自動讀取 CMakePresets.json,你可以直接選 preset 來 build。

CLion 也能直接載入 preset,不用再手動設定 CMake Options。

在 CI/CD(例如 GitHub Actions)裡,更是可以直接寫成:

- name: Configure
  run: cmake --preset release-ninja
- name: Build
  run: cmake --build --preset release

這樣就能確保跟本地環境完全一致

  1. 好處總結

一致性:大家都用同一份 Presets,不會有人少打 -D flag。

跨平台:Windows / Linux / macOS 都能吃同一份設定。

可維護:不用再寫超長的 README 教別人怎麼下 cmake 指令,直接告訴他「用 preset」就好。

小結

CMakePresets.jsonCMake有關的專案中幾乎是必備。
它不只是偷懶工具,更是一種團隊協作的保險機制,讓 Debug、Release、Sanitizer、交叉編譯等常見模式一鍵切換。

下一篇,我們就來收尾,把前面學到的 CMake / Make / 測試 / Presets 全部串在一起,做一次完整專案建置實戰~


上一篇
[Day 28] [cmake] 測試與持續整合 (CTest + CPack + CI/CD)
下一篇
[Day 30] [專案實戰] 一次走完 0 到 1 Cmake建置流程
系列文
30 天精通 C 語言建置與除錯:從 Makefile 到 CMake 跨平台實戰30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言