深入理解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阅读 199,271评论 5 466
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,725评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,252评论 0 328
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,634评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,549评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,985评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,471评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,128评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,257评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,233评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,235评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,940评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,528评论 3 302
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,623评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,858评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,245评论 2 344
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,790评论 2 339

推荐阅读更多精彩内容

  • CMake学习 本篇分享一下有关CMake的一些学习心得以及相关使用。 本文目录如下: [1、CMake介绍] [...
    AlphaGL阅读 12,213评论 11 79
  • 注:首发地址 1. 前言 当在做 Android NDK 开发时,如果不熟悉用 CMake 来构建,读不懂 CMa...
    cfanr阅读 24,185评论 1 53
  • 向您的项目添加 C 和 C++ 代码 本文内容 下载 NDK 和构建工具 创建支持 C/C++ 的新项目 构建和运...
    会飞的大象_阅读 3,733评论 0 3
  • 本篇文章旨在简介 Android 中 NDK 是什么以及重点讲解最新 Android Studio 编译工具 CM...
    Tsy远阅读 63,079评论 20 213
  • 资源 本文档翻译自官方 cmake turorial 。更新日期:2018年9月27日。译者这里以 windows...
    刘亚彬92阅读 83,796评论 3 12