深入理解CMake(1): CMake命令行參數

初衷

CMake能用來編寫跨平臺(cross-platform)的構建規則,通過這些規則來調用各個平臺的編譯器、鏈接器,生成各個目標(靜態庫,靜態庫,或者可執行)。

我第一個接觸的大型C++項目是OpenCV,它是基于CMake構建的。后來接觸的另一個大型C++項目是Caffe,既提供Makefile也提供CMakeLists.txt。在使用CMake的過程中對CMake的常用語法越發熟悉,甚至日常工作中的項目代碼也被我用CMake進行構建。但是仍然覺得對CMake不夠了解,CMake的不少用法在官方文檔中的描述也感覺有些晦澀、不清晰。

好在CMake是開源項目,覺得CMake文檔寫的爛那就直接翻源碼。而由于越來越多的C/C++開源項目使用CMake進行構建,學習和深入理解CMake對于一個C/C++(尤其是跨平臺)程序員來說還是有相當的好處和必要的。(當然你也可以用gradle/bazel/buck/please/scons/xmake/emake等來構建)

此外,我也仔細看過CMake官方文檔的部分章節,寫過幾篇蹩腳的CMake筆記文檔,了解到通常越新版本的CMake特性越多。這系列blog分析的CMake源碼是CMake-3.14.3版。(不得不吐槽一下:CMake官網打開速度太慢,國內各大開源鏡像站點也都不收錄CMake源碼,CMake官方文檔打開也超慢,而且寫的也不夠系統,中文博客講CMake的也往往很初級)。如果你是第一次接觸CMake,我覺得你最好先用用CMake,稍微熟悉一點基本用法和一些概念后再來看本篇不遲。

CMake入口:命令行參數

CMake是什么?或許我們應該從"cmake.exe是什么?"(windows),或file `which cmake`(Linux或Mac)來分析。當我們安裝好CMake,它提供了一個可執行文件cmake或cmake.exe,有時候還提供一個GUI版本,比如ccmake或cmake-gui,不過GUI版本可以認為是外科,里子還是cmake命令。

那么cmake命令是什么?其實就是一個C/C++項目編譯出來的可執行文件。它或許提供了一大堆支持的函數、類,但是對外的接口可以說只有一個,那就是main()函數。當我敲下cmake ..或者cmake .. -DCMAKE_BUILD_TYPE=Debug,再或者cmake --build .,cmake到底會怎么執行,其實就是看它的commandline argument parser是怎么處理的了:它能接受的(合法的)命令行參數有哪些?每一種分別是什么含義?

image.png

$CMAKE_ROOT/Source/cmakemain.cxx可以看出,它肯定支持的三個參數是:

  • --build
  • --open
  • -E
    繼續看,發現do_cmake()函數中處理了其他參數的情況,而且數量非常多:
    image.png

而我們看看官方文檔對cmake命令行支持的參數是怎么寫的,先看cmake3.13版本的文檔,可以說是稀巴爛:


image.png

再看cmake3.14版本的命令行參數文檔

image.png

看起來有所改善,把支持的命令行參數分成了幾個類別,思路上清晰了不少;不過仍然需要改進,比如說cmake -N這一條沒有被列出,但是其實后文又有提到。

根據3.14版的文檔可以看出,執行cmake命令,支持7大類參數:

  • 指定CMakeLists.txt所在路徑,用來生成目標平臺的構建文件如Makefile、.sln、.xcodeproject等(cmake的主要特色)
  • 執行構建,相當于用通用的寫法,對生成的目標平臺構建描述文件進行調用,替代具體的"make"、"nmake"等寫法。(個人經常用,還可以指定--target TargetName--config BUILD_TYPE
  • 用VS、XCode等打開工程(我沒用過,我也覺得沒必要)
  • 執行cmake腳本
  • 執行命令行工具
  • 執行find-package工具(其實很廢柴,和CMakeLists.txt中的find_package()根本不是一會事兒,試了好幾個包都找不到)
  • 在命令行里查看幫助(已經是9012年了,多少年前就有git help xxx --web在網頁中看幫助文檔了,cmake什么時候支持一下?)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,406評論 6 538
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,034評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,413評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,449評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,165評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,559評論 1 325
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,606評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,781評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,327評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,084評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,278評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,849評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,495評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,927評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,172評論 1 291
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,010評論 3 396
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,241評論 2 375

推薦閱讀更多精彩內容

  • CMake學習 本篇分享一下有關CMake的一些學習心得以及相關使用。 本文目錄如下: [1、CMake介紹] [...
    AlphaGL閱讀 12,277評論 11 79
  • 注:首發地址 1. 前言 當在做 Android NDK 開發時,如果不熟悉用 CMake 來構建,讀不懂 CMa...
    cfanr閱讀 24,484評論 1 53
  • 向您的項目添加 C 和 C++ 代碼 本文內容 下載 NDK 和構建工具 創建支持 C/C++ 的新項目 構建和運...
    會飛的大象_閱讀 3,819評論 0 3
  • 本篇文章旨在簡介 Android 中 NDK 是什么以及重點講解最新 Android Studio 編譯工具 CM...
    Tsy遠閱讀 63,567評論 20 213
  • 資源 本文檔翻譯自官方 cmake turorial 。更新日期:2018年9月27日。譯者這里以 windows...
    劉亞彬92閱讀 86,962評論 3 13