IDE 整合指南

簡介

整合開發環境 (IDE) 可能希望與 CMake 整合,以改善 CMake 使用者的開發體驗。本文檔闡述了此類整合的建議最佳實務。

捆綁

許多 IDE 供應商會希望將 CMake 的副本與其 IDE 捆綁在一起。捆綁 CMake 的 IDE 應為使用者提供選項,以使用外部 CMake 安裝,而不是捆綁的版本,以防捆綁的版本過時,而使用者想要使用較新版本。

雖然 IDE 供應商可能很想將不同版本的 CMake 與其應用程式捆綁在一起,但不建議這樣做。CMake 具有強大的向後相容性保證,而且沒有理由不使用比專案需求更新版本的 CMake,甚至是最新版本。因此,建議將 CMake 與其應用程式捆綁在一起的 IDE 供應商,始終包含發佈時可用的最新 CMake 修補程式版本。

作為建議,IDE 也可隨 CMake 一起運送 Ninja 建置系統的副本。Ninja 具有高效能,並且在所有支援 CMake 的平台上都獲得良好支援。捆綁 Ninja 的 IDE 應使用 Ninja 1.10 或更高版本,其中包含支援 Fortran 建置所需的功能。

預設集

CMake 支援名為 CMakePresets.json 的檔案格式,以及其使用者專屬版本 CMakeUserPresets.json。此檔案包含使用者可能需要的各種配置預設集的資訊。每個預設集可能具有不同的編譯器、建置旗標等。此格式的詳細資訊在 cmake(1) 手冊中說明。

鼓勵 IDE 供應商以與 CMake 相同的方式讀取和評估此檔案,並向使用者呈現檔案中列出的預設集。使用者應該能夠查看(並可能編輯)為給定預設集定義的 CMake 快取變數、環境變數和命令列選項。然後,IDE 應根據這些設定建構適當的 cmake(1) 命令列引數列表,而不是直接使用 --preset= 選項。--preset= 選項僅旨在作為命令列使用者的方便前端介面,不應由 IDE 使用。

例如,如果名為 ninja 的預設集指定 Ninja 作為產生器,並指定 ${sourceDir}/build 作為建置目錄,則 IDE 應改為計算 ninja 預設集的設定,然後執行:

cmake -S /path/to/source --preset=ninja

IDE 不應執行:

cmake -S /path/to/source -B /path/to/source/build -G Ninja

在預設集包含大量快取變數,且將所有變數作為 -D 旗標傳遞會導致平台命令列長度限制被超過的情況下,IDE 應改為建構暫時的快取腳本,並使用 -C 旗標傳遞它。

雖然讀取、解析和評估 CMakePresets.json 的內容很直接了當,但並非易事。除了文件之外,IDE 供應商也可能希望參考 CMake 原始碼和測試案例,以便更好地理解如何實作此格式。此檔案 提供了 CMakePresets.json 格式的機器可讀 JSON Schema,IDE 供應商可能會發現它對於驗證和提供編輯輔助很有用。

配置

調用 cmake(1) 以執行配置步驟的 IDE,可能希望接收有關建置將產生的產出,以及用於建置產出的包含目錄、編譯定義等資訊。可以使用 File API 取得此類資訊。File API 的手冊頁面包含有關 API 以及如何調用它的更多資訊。伺服器模式 已在 CMake 3.20 中移除,不應在 CMake 3.14 或更高版本上使用。

IDE 應避免建立不必要的建置樹,只有在使用者希望切換到不同的編譯器、使用不同的編譯旗標等情況下,才建立多個建置樹。特別是,IDE 不應建立多個單一配置建置樹,這些建置樹除了 CMAKE_BUILD_TYPE 不同之外,都具有相同的屬性,實際上是建立多配置環境。相反,Ninja Multi-Config 產生器應與 File API 結合使用,以取得建置配置列表,並用於此目的。

IDE 不應將「額外產生器」與 Makefile 或 Ninja 產生器一起使用,這些產生器除了 Makefile 或 Ninja 檔案外,還會產生 IDE 專案檔案。相反,應使用 File API 來取得建置產出的列表。

建置

如果使用 Makefile 或 Ninja 產生器來產生建置樹,則不建議直接調用 makeninja。相反,建議 IDE 調用帶有 --build 引數的 cmake(1),這將反過來調用適當的建置工具。

如果使用 IDE 專案產生器,例如 Xcode 或其中一個 Visual Studio 產生器,並且 IDE 了解使用的專案格式,則 IDE 應讀取專案檔案,並以與其他方式相同的方式建置它。

File API 可用於從建置樹取得建置配置列表,而 IDE 應向使用者呈現此列表以選擇建置配置。

測試

ctest(1) 支援輸出 JSON 格式,其中包含有關可用測試和測試配置的資訊。想要執行 CTest 的 IDE 應取得此資訊,並使用它向使用者呈現測試列表。

IDE 不應調用產生的建置系統的 test 目標。相反,它們應直接調用 ctest(1)

整合 CMake 的 IDE

以下 IDE 原生支援 CMake

此外,CMake 內建支援某些 IDE