IDE 整合指南

簡介

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

綑綁

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

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

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

預設集

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

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

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

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

IDE 應改為計算 ninja 預設集的設定,然後執行

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

如果預設集包含許多快取變數,並且將它們全部作為 -D 標誌傳遞會導致超出平台的命令列長度限制,則 IDE 應改為建構臨時快取指令碼,並使用 -C 標誌傳遞它。

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

設定

呼叫 cmake(1) 來執行設定步驟的 IDE 可能希望接收關於建置將產生的構件,以及用於建置構件的 include 目錄、編譯定義等資訊。可以使用 File API 來取得這類資訊。File API 的手冊頁包含關於 API 和如何呼叫它的更多資訊。Server 模式 已在 CMake 3.20 中移除,不應在 CMake 3.14 或更高版本上使用。

IDE 應避免建立比必要更多的建置樹狀結構,並且只有在使用者想要切換到不同的編譯器、使用不同的編譯標誌等情況下才建立多個建置樹狀結構。特別是,IDE 不應建立多個單一設定的建置樹狀結構,這些樹狀結構除了 CMAKE_BUILD_TYPE 不同之外,都具有相同的屬性,有效地建立多設定環境。相反,Ninja 多設定 產生器應與 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: