【譯文】Mastering CMake(chapter 1)Why CMake

第一章     爲什麼選擇CMake?

       如果你曾經維護過軟件包的構建和安裝過程,你將會對Cmake產生興趣。CMake 是一個開放源代碼的構建管理器。他允許開發者在一個簡單可移植的文本格式文件(txt)中,構建指定的構建參數的項目工程。這個文件隨後將用於生成包括集成開發環境在內的本地開發工具(例如Microsoft Visual Studio , Apple’s Xcode ,Unix Linux,Nmake,Borlandstyle Makefiles)的工程文件。CMake允許用戶通過簡單的裁剪構建出複雜的硬件和軟件系統,解決了軟件構件中多個方面的難題,例如跨平臺構建,系統鑑別(system introspection)以及用戶自定義構建。

      對於很多項目工程來說,尤其是跨平臺的工程,有一個統一的構建系統尤爲重要。現在很多工程既要用於Unix Makefile(or Makefile.in)也要用 Microsoft Visual Studio的工作空間。

這就要求開發者不斷的更新兩個不同的構建系統,使他們相互保持一致。爲了一些額外的構建系統例如Borland或者甚至要求更多這些文件的自定義副本的Xcode,以至於衍生出一個更大的問題。如果你想要支持一些可選的組建(例如當系統支持libjpeg時工程中要增加jpeg支持),這個問題將變得異常複雜。CMake 通過將這些不同的操作合併到一個簡單易用的文本格式文件中,來解決這些難題。

       如果你存在多個開發者在使用同一個工程或者一個工程擁有多個目標平臺的情況,並且這個軟件將不得不在不止一臺電腦上構建。給一臺現代計算機在安裝軟件和自定義選項時一個寬泛的選擇範圍,即時兩臺同樣操作系統的計算機也會有細微不同的概率。CMake 具備很多用於解決單平臺多機器開發環境問題的功能:

      自動搜索那些軟件構建過程中會用到的bin文件,庫文件以及頭文件的能力(還能夠在搜索時考慮環境變量和windows註冊表的設置)。
      在源碼樹目錄之外構建一個構建目錄樹的功能。這是在很多linux平臺上非常有用的功能。Cmake在windows上也提供這些功能。這就允許開發者在刪除一個完整的構建目錄時,不用擔心任何刪除源碼文件的風險。
       創建一個用於自動生成例如 qt moc ,ITK(InsightToolkit) 的cable wrappers以及 SWIG包裝生成器文件列表的複雜自定義命令的功能。這些命令用於在按照一定順序編譯成軟件的構建過程中生成新源碼文件。
      在配置時選擇一個可選組件的功能。例如,幾個不同版本VTK的庫是可選的,並且Cmake提供了簡單的方式讓用戶選擇一個指定版本的庫用於構建。
       從一個簡單的文本文件自動生成工作空間和工程文件的功能。這對於使用IDE手工創建一個繁瑣的擁有多個測試用例或者程序(包括可只執行文件,庫文件),並且這些測試用例和程序都是在一個單獨的工程內的系統來說還是很方便的。
       非常方便的在靜態和共享庫之間切換的功能。Cmake擁有創建出跨所有平臺的共享庫和模塊的功能。一些複雜的平臺特化的鏈接標識,和在unix族系統上支持運行時搜索指定目錄下面的共享庫的高級特性都能夠被很方便的處理。
       支持機器字節序以及其他硬件特性問題的測試。
       支持能夠在所有平臺工作的僅僅一套配置文件。這就避免了開發者在必須在一個項目中掌握不同平臺不同格式的工程(而這些工程的內容卻必須是同步的)。
支持構建所有平臺共享庫(不同平臺構建出該平臺支持的共享庫)。

       在大部分平臺下支持並行構建和自動生成文件依賴。

       在你開發一個跨平臺的軟件項目時,Cmake提供很多附加的特性:

        支持包含系統依賴信息的配置文件,例如本地數據文件或者其他信息的位置。CMake能夠創建出包含以下信息的頭文件,例如:用#define宏列表示的數據文件的路徑或者其他信息。也能夠將系統特定的標識放入頭文件中。通過命令行-D選項傳遞給編譯器具備一些優點,因爲它允許其他的構建系統使用CMake構建庫,而不必指定在構建期使用的在不同編譯器上代表相同含義卻有可能不同的命令行。

1.1  CMake的歷史

       CMake 起源於 1999年作爲ITK(InsightToolkit)的一部分被美國國家醫學圖書館資助。ITK是一個非常大的並且能在很多平臺工作的軟件項目,他能夠跟許多其他軟件包互動。爲實現這個目標,需要一個強大的,且容易使用的構建工具。在過去的一些大項目中已經使用了構建工具,ITK的開發者們基於這些需要設計了CMake。從此越來越多的項目和開發者由於CMake的易用性和靈活性而採用他,CMake迅速持續不斷的完善。從1999年開始CMake就是一個非常活躍的開發項目,並且是一個用於跨平臺構建的成熟解決方案。最廣爲人知案例:KDE的就是採用CMake構建,這幾乎可以說是已經存在的最大的開源項目。

       最近更新的功能之一就是CTest的形式支持軟件測試。測試軟件過程的一部分涉及到軟件的構建,可能在安裝時要決定軟件的哪一部分適合當前的系統。這就促使CTest 成爲了CMake已經存在的大部分信息的一個邏輯擴展。類似,CMake的一個新特性是CPack。CPack

       支持跨平臺的軟件發行包構建。CPack提供了一個爲你的軟件提供一個本機安裝包的捷徑,能夠構建出現有的很多流行構建包,例如NSIS,RPM,Cygwin以及PackageMaker。

       另外一個最近的新功能是,支持蘋果的XcodeIDE並且支持微軟的Visual Studio 10。使用CMake,一旦你編寫了你的輸入文件,你就獲得了新編譯器的支持,並且能夠自由的利用構建系統將你的工程構建成CMake發行包,而不用侷限於軟件現有的發行包。CMake也支持交叉編譯到其他的操作系統或者嵌入式設備。現在,在交叉編譯時CMake中許多命令能夠合適的處理在不同的主機系統與目標平臺之間的不同。

1.2  爲什麼不使用Autoconf?

       在CMake的作者在開發它之前已經有使用存在的一系列的可用工具的經驗。Autoconf結合automake 提供了許多類似CMake中有的功能。但是這些工具在windows平臺上要求安裝許多不是windows系統自帶的附加依賴工具。這一系列的工具使得Autoconf不能像CMake一樣簡單而又輕鬆的完成一些工作。甚至你獲取Autoconf的安裝包,都要求你在你係統中安裝一些所需要的依賴環境,他會強制用戶使用命令行生成很多Makefile文件。CMake在另一方面提供了一個選擇,允許開發者生成可以直接用於像Windows 和XCode開發者習慣使用的IDE的工程文件。

      雖然AutoConf支持用戶自定義選項,但是它不支持像一個自定義選項依賴於一些其他的屬性或者自定義選項的依賴自定義選項。例如,在CMake中你可以跟據用戶系統是否有多線程的支持而開啓多線程依賴選項。CMake提供了互動用戶接口,這就使得用戶在能夠很容易的知道那些自定義選項是可用的,怎麼使用這些自定義選項。

       對於Unix用戶,CMake也提供了不用於Autoconf的自動依賴生成。Cmake簡化了輸入格式,使用戶能夠比單純的結合Makefile.in和Configure.in文件更容易閱讀和掌控。CMake能夠記憶和保存庫依賴信息即時沒有等同於Autoconf或者Automake的工具。

1.3  爲什麼不採用JAM, qmake,Scons,或者ANT?

   其他一些工具例如ANT,qmake,Scons和JAM有一些不同的方案來解決這些問題。這些工具幫助我們使CMake成型。在這四個工具中,qmake是與cmake最相似的,儘管它缺少一些CMake中提供的一些系統適配的功能。Qmake輸入文件跟傳統的makefile文件關係更近。ANT,JAM和Scons也能提供跨平臺功能,儘管他們不支持本地工程文件的生成。ANT使用xml作爲輸入使其與傳統的makefile區分開來,JAM用他自有的語言,而Scons使用的是python。這些工具中的幾個直接調用編譯器,而不是構建系統來直接處理這些構建任務。它們中的一些工具要求安裝例如python和Java的第三方工具才能夠正常工作。

1.4 爲什麼不自己使用腳本

       有一些工程使用了一些已經存在的腳本語言例如Perl或者 Python 來配置構建過程。儘管用這些類似的系統能夠實現一些相似的功能,相對於一個簡單易用的構建系統,使用這些工具會比尋找一個復活節彩蛋更麻煩。當構建你的軟件時,你甚至都還沒有開始進入構建過程,用戶被強制要求找到並安裝,4.3.2版本的這個工具以及3.2.4版本的其他工具。爲了避免這些問題,這就要求CMake構建時除了這個軟件本身要用到的一些工具不再需要其他的任何工具。使用Cmake一個最低限制是一個c編譯器,以及編譯器的原生構建工具和一個CMake的可執行文件。CMake是用C++編寫的,僅僅要求必須有一個c++的編譯器來構建CMake本身,並且在大部分系統中已經有已經編譯好的可執行文件可以直接用。如果你自己用腳本來實現,意味着不能生成本地的Xcode或者Visual Studio的工作空間,使得在Mac或者Windows上構建受限。

1.5  CMake支持哪些平臺

     CMake能夠在非常的平臺上運行包括微軟的Windows,蘋果的Mac OS X以及絕大多數的UNIX以及類UNIX的平臺。在編者寫這本書的時候CMake已經在以下平臺長期測試過:Windows 98/2000/XP/Vista/7,AIX,HPUX,IRIX,Linux,Mac OS X,Solaris,OSF,QNX,CYGWIN,MinGW以及FreeBSD。你能夠從www.cmake.org這個網站得到一個已測試平臺的列表。

       同樣,CMake支持絕大部分常規編譯器。它支持GNU編譯器在所有CMake支持的平臺上。其他已測試過的編譯器包括Visual Studio 6到10,Intel C,SGI CC,Mips Pro,Borland,Sun CC 以及HP aCC。CMake 也能夠在列表之外的絕大多數Unix風格的編譯器上使用。如果編譯器用一個奇怪的方式傳遞這些參數,你可以查看在第241的“將CMake 移植到新編譯器”的章節中的信息,來確定怎樣自定義設置一個新的編譯器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章