在使用 CMake 作為構建工具的時候, 對于一個稍微大一點的項目, 存在有很多的選項. 比如 Debug 版本還是 Release 版本, 是否開啟特定選項, 是否開啟測試等等. 這些通常是作為命令行參數傳遞進去的. 但是很多程序員并不在命令行中作開發, 更多的是使用 IDE 來進行開發. 不同的 IDE 的設置參數的方式不同, 這對于多方協同的開發來說, 有些不方便.
CMake Presets 就提供了一種解決這個問題的方式. 它允許你定義一個配置文件(CMakePresets.json
), 將對 CMake 的傳遞參數寫入到該文件, 然后在 IDE 中加載這個配置文件, 然后就可以使用 IDE 的界面來設置參數了. 這樣不論是在命令行,還是 IDE 中都能很方便的使用相同參數. 目前支持的 IDE 有: CLion/Visual Studio/VS Code.
如何使用
- 創建一個
CMakePresets.json
文件. 用戶也可以創建一個本地的CMakeUserPresets.json
文件, 來做本地化適配. 但這個文件不應該被添加到 git 倉庫中. - 寫入配置, 配置方法見后.
- 重新打開項目, 重新加載項目.
CMakePresets.json 文件結構
包含如下字段:
version
: 必填字段. 配置文件格式(schema)版本號, 目前是一個整數. 不同版本的 CMake 支持的版本不一樣. 詳細列表請查看官網文檔.cmakeMinimumRequired
: 可選字段. 表示對 CMake 版本的最低要求.configurePresets
: 可選字段. 用于配置 CMake 的參數. 這個是經常使用的字段.buildPresets
: 可選字段. 用于構建的參數. 最低要求版本 2.testPresets
: 可選字段. 用于測試的參數. 最低要求版本 2.packagePresets
: 可選字段, 用于打包的參數. 最低要求版本 6.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
我們需要依次配置:
buildPresets
testPresets
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 中使用
-
CLion 目前支持使用 CMakePresets.json 做配置和構建.
-
- 打開
Settings
->Advanced Settings
->Automatically import CMake Presets
- 打開
-
- 啟用配置:
Settings
|Build, Execution, Deployment
|CMake
- 啟用配置:
-
-
VS Code 目前的支持比較完整, 可以直接運行工作流. VS Code 中需要使用
C/C++ Extension Pack
來做到支持.
進一步閱讀
- 使用 CMake 開發庫(Library)的最佳實踐
- CMake 入門教程
- VS Code C++ 開發環境配置