<<Modern CMake>> 翻譯 1. CMake 介紹
人們喜歡討厭構建系統。 僅僅觀看 CppCon17 上的演講,就可以看到開發人員因為構建系統而鬧笑話的例子。 這讓我們思考一個問題:為什么會這樣? 構建系統時當然不可能完美無缺。 但我認為,在 2018 年,我們可以很好地解決其中的一些問題。 這就是 CMake。不過 CMake 2.8 可能不行; 它在 C++11 發布之前就 release 了! 對於 CMake 來說也沒有可怕的例子(甚至那些發布在 KitWare 自己的教程列表中的例子)。 我們來談論現代 CMake。CMake 3.1+,甚至可能是 CMake 3.15+! 它整潔,強大,優雅,因此你可以將大部分時間花在編碼上,而不是編寫不可讀,不可維護的 Make(或CMake 2)文件。 當然,CMake 3.11+ 運行起來也應該明顯更快!
簡而言之,如果你在考慮使用現代 CMake,這些可能是你最關心的問題:
為什么我需要一個好的構建系統?
下面哪幾點適合你?
- 你希望避免硬編碼路徑
- 你需要在多台計算機上構建軟件
- 你想使用CI(持續集成)
- 你需要支持不同的操作系統(雖然可能只是 Unix 的風格)
- 你想支持多個編譯器
- 你想使用 IDE,但有時也不用
- 你想要描述程序的邏輯結構,而不是標志和命令
- 你想使用第三方軟件包
- 你想使用像 Clang-Tidy 這樣的工具來幫助你編寫代碼
- 你想使用調試器 (debugger)
如果是這樣,你將受益於類似 CMake 的構建系統。
為什么我們選擇 CMake?
構建系統是一個熱門話題。 當然大家有很多選擇。但即使是非常好的,或者重用一個熟悉的語法,也無法和 CMake 相提並論。 為什么?生態支持。 每個 IDE 都支持 CMake(或 CMake 支持這些 IDE)。 有更多的軟件包在使用 CMake 而不是其他構建系統。 因此,如果你在使用一個軟件包,它被設計為包含在你的代碼中,你可以選擇:創建自己的構建系統,或使用一個它支持的構建系統:這些軟件包幾乎總是支持 CMake。 如果你要使用多個軟件包,CMake 將很快成為共同點。 而且,如果你需要一個預安裝軟件包,那么它有 CMake 查找或配置腳本的可能性非常高。
為什么要用現代 CMake?
大約 CMake 2.6-2.8 的時候,CMake 開始流行起來。出現在了大多數 Linux 操作系統的軟件包管理器列表中,並且被用於許多軟件包使用。 然后 Python 3 問世了。 我知道,這與 CMake 沒有任何關系。 但它是第三版。 它前面有一個第二版: 這是一個艱難,丑陋的過渡,即使在今天,一些軟件仍然還在使用第二版。
我相信 CMake 3 運氣不會比 Python 3 好到哪兒去。1 盡管每個版本的 CMake 都是努力向后兼容,但 CMake 3 系列任然被視為新東西。 因此,你會發現操作系統,像 CentOS 7,已經擁有 GCC 4.8,幾乎完全支持 C++ 14,還在使用在 C++ 11 之前就推出的 CMake 2.8。
你真的至少應該使用編譯器發布之后出現的 CMake 版本,因為構建系統需要知道新版本編譯器的編譯標志等信息。 而且,由於 CMake 會將自己退化為 CMake 文件中指示的所需的最低版本,因此,即使你在系統范圍內安裝一個新的 CMake,也是非常安全的。 或者你至少應該在本地安裝它。 這很容易 (大多數情況下也就一兩行代碼的事兒), 你會發現 5 分鍾的工作將為你節省數百行和幾小時的 CMakeLists.txt
編寫時間,並且從長遠來看將更容易維護。 本書試圖解決那些網絡上隨處可見的糟糕問題和例子,以及提出最佳實踐的方法。
其他資源
在網上還有一些其他地方可以找到有用的信息。下面是其中的一些:
- The official help: 真的很棒的文檔。組織精良,搜索便捷,還可以在頂部切換版本。它只是沒有一本偉大的“最佳實踐教程”,這本書就在試圖填補這個空白
- Effective Modern CMake: 一個非常好的使用指導原則清單
- Embracing Modern CMake: 一個對該術語有很好描述的帖子
- It's time to do CMake Right: 現代 CMake 項目的一個很好的最佳實踐
- The Ultimate Guide to Modern CMake: 具有類似意圖的略微過時的帖子
- More Modern CMake: 來自 Meeting C++ 2018 推薦的 CMake 3.12+ 精彩演示。這個講話使得 CMake 3.0+ 現代化的 CMake 和 CMake 3.12+ 更現代化的 CMake 成為了一種話題
- toeb/moderncmake: 關於 CMake 3.5+ 的一個很好的演示和示例,通過項目組織介紹語法
鳴謝
現代 CMake 最初由 Henry Schreiner 編寫。其他貢獻者信息可以 GitLab 項目貢獻者列表 中找到。
1. CMake 3.0 還從非常舊版本的 CMake 中刪除了幾個長期棄用的功能,並對與方括號相關的語法做了一個非常微小的向后不兼容的更改,所以這不完全公平; 可能會有一些非常非常古老的 CMake 文件在 CMake 3+ 中不能運行;雖然我從來沒有見過。 ↩