今天要來看看 CMakePresets.json
CMakePresets 定位:把我們常用的編譯參數、目錄結構、編譯模式(Debug/Release/ASan…)統一寫在一份 JSON 裡,大家只要下 cmake --preset
就能編譯,不用再每次手動輸入一長串 -S
、-B
、-D
、-G
換句話說,這東西就是幫我們把設定寫死,免得忘記──同時也方便團隊共享,不會出現我這台能編,你那台不能的狀況
今天會學到:
好處與實際案例
步驟
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,就把不同情境下的組態寫好了
實際用起來就是幾個簡單的指令:
cmake --list-presets
cmake --preset debug-ninja
cmake --build --preset debug
ctest --preset ctest-debug
--list-presets
可以看到有哪些預設組態
--preset
則是直接套用設定(不用再打 -S . -B build -D...
那一堆)
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
這樣就能確保跟本地環境完全一致
一致性:大家都用同一份 Presets
,不會有人少打 -D flag。
跨平台:Windows / Linux / macOS 都能吃同一份設定。
可維護:不用再寫超長的 README 教別人怎麼下 cmake 指令,直接告訴他「用 preset」就好。
小結
CMakePresets.json
在 CMake
有關的專案中幾乎是必備。
它不只是偷懶工具,更是一種團隊協作的保險機制,讓 Debug、Release、Sanitizer、交叉編譯等常見模式一鍵切換。
下一篇,我們就來收尾,把前面學到的 CMake / Make / 測試 / Presets 全部串在一起,做一次完整專案建置實戰~