如果您曾經(jīng)維護(hù)過(guò)構(gòu)建和安裝軟件包的過(guò)程,您將對(duì) CMake 感興趣。CMake 是一個(gè)用于軟件項(xiàng)目的開(kāi)源構(gòu)建(build)系統(tǒng)生成器,允許開(kāi)發(fā)人員在簡(jiǎn)單、可移植的文本文件(即 CMakeLists.txt)中指定構(gòu)建的參數(shù)格式。然后,CMake 使用 CMakeLists.txt 來(lái)生成服務(wù)于本機(jī)構(gòu)建工具的工程文件,這些本機(jī)構(gòu)建工具包括像 Microsoft Visual Studio 或 Apple Xcode,以及 UNIX、Linux、 NMake 和 Ninja這樣的集成開(kāi)發(fā)環(huán)境 (IDE)。CMake以一種簡(jiǎn)單的方式處理構(gòu)建軟件方面的困難(如跨平臺(tái)構(gòu)建、系統(tǒng)自檢和用戶自定義構(gòu)建),使用戶能夠輕松地為復(fù)雜的硬件和軟件系統(tǒng)定制構(gòu)建。
對(duì)于任何項(xiàng)目,尤其是跨平臺(tái)項(xiàng)目,都需要一個(gè)統(tǒng)一的構(gòu)建系統(tǒng)。許多非基于 CMake 的項(xiàng)目都附帶了UNIX Makefile(或Makefile.in)和Microsoft Visual Studio workspace。這要求開(kāi)發(fā)人員不斷嘗試保持兩個(gè)構(gòu)建系統(tǒng)的最新?tīng)顟B(tài)和一致性。要針對(duì)其他構(gòu)建系統(tǒng)(如Xcode),需要更多這些文件的自定義副本,這會(huì)產(chǎn)生更大的問(wèn)題。如果您嘗試支持可選組件則會(huì)使此問(wèn)題更加復(fù)雜,例如,如果系統(tǒng)上有l(wèi)ibjpeg,則需要包括(including) JPEG支持。CMake通過(guò)將這些不同的操作整合到一個(gè)簡(jiǎn)單、易于理解的文件格式中來(lái)解決這個(gè)問(wèn)題。
如果你有多個(gè)開(kāi)發(fā)人員在一個(gè)項(xiàng)目或多個(gè)目標(biāo)平臺(tái)上工作,那么軟件必須在多臺(tái)計(jì)算機(jī)上構(gòu)建。鑒于安裝現(xiàn)代計(jì)算機(jī)所涉及的安裝軟件和自定義選項(xiàng)范圍廣泛,運(yùn)行相同操作系統(tǒng)的兩臺(tái)計(jì)算機(jī)可能會(huì)略有不同。CMake為單平臺(tái)、多機(jī)開(kāi)發(fā)環(huán)境提供了許多好處,包括:
- 自動(dòng)搜索正在構(gòu)建的軟件可能需要的程序、庫(kù)和頭文件的能力。這包括在搜索時(shí)考慮環(huán)境變量和Window注冊(cè)表設(shè)置的能力。
- 在源代碼樹(shù)之外構(gòu)建目錄樹(shù)的能力。這是許多UNIX平臺(tái)上的一個(gè)有用功能;CMake在Windows上也提供了此功能。這允許開(kāi)發(fā)人員刪除整個(gè)構(gòu)建目錄,而不必?fù)?dān)心刪除源文件。
- 能夠?yàn)樽詣?dòng)生成的文件(如Qt的moc() 或SWIG包裝生成器)創(chuàng)建復(fù)雜的自定義命令。這些命令用于在構(gòu)建過(guò)程中生成新的源文件,這些源文件又被編譯到軟件中。
- 在配置時(shí)選擇可選組件的能力。例如,VTK的幾個(gè)庫(kù)是可選的,CMake為用戶提供了一種選擇構(gòu)建哪些庫(kù)的簡(jiǎn)單方法。
- 從簡(jiǎn)單的文本文件自動(dòng)生成工作區(qū)和項(xiàng)目的能力。這對(duì)于具有許多程序或測(cè)試用例的系統(tǒng)來(lái)說(shuō)非常方便,每個(gè)程序或測(cè)試案例都需要一個(gè)單獨(dú)的項(xiàng)目文件,通常是使用IDE創(chuàng)建的繁瑣的手動(dòng)過(guò)程。
- 在靜態(tài)和共享構(gòu)建之間輕松切換的能力。CMake知道如何在所有支持的平臺(tái)上創(chuàng)建共享庫(kù)和模塊。處理復(fù)雜的特定于平臺(tái)的鏈接器標(biāo)志,許多UNIX系統(tǒng)支持共享庫(kù)的內(nèi)置運(yùn)行時(shí)搜索路徑等高級(jí)功能。
- 自動(dòng)生成文件依賴關(guān)系,并支持大多數(shù)平臺(tái)上的并行構(gòu)建。
在開(kāi)發(fā)跨平臺(tái)軟件時(shí),CMake提供了許多附加功能:
- 測(cè)試機(jī)器字節(jié)順序和其他硬件特定特性的能力。
- 一組適用于所有平臺(tái)的構(gòu)建配置文件。這避免了開(kāi)發(fā)人員必須在項(xiàng)目?jī)?nèi)以多種不同格式維護(hù)相同信息的問(wèn)題。
- 支持在支持它的所有平臺(tái)上構(gòu)建共享庫(kù)。
- 使用系統(tǒng)相關(guān)信息(如數(shù)據(jù)文件的位置和其他信息)配置文件的能力。CMake可以創(chuàng)建頭文件,其中包含數(shù)據(jù)文件的路徑等信息以及#define宏形式的其他信息。系統(tǒng)特定的標(biāo)志也可以放置在配置的頭文件中。這比編譯器的命令行-D選項(xiàng)更有優(yōu)勢(shì),因?yàn)樗试S其他構(gòu)建系統(tǒng)使用CMake構(gòu)建庫(kù),而無(wú)需指定構(gòu)建過(guò)程中使用的完全相同的命令行選項(xiàng)。