<<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+ 运行起来也应该明显更快!

 

这本书作为在线文档发布。你可以在 GitLab 上提出问题或提交合并请求。 你也可以 从这里下载 PDF.

简而言之,如果你在考虑使用现代 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+ 中不能运行;虽然我从来没有见过。

<<Modern CMake>> 翻译 1. CMake 介绍的更多相关文章

  1. <<Modern CMake>> 翻译 2. CMake 基础

    <<Modern CMake>> 翻译 2. CMake 基础 最低版本 这是每个 CMakeLists.txt 文件的第一行.CMakeLists.txt 是 CMake 所 ...

  2. <<Modern CMake>> 翻译 2.4 项目目录结构

    <<Modern CMake>> 翻译 2.4 项目目录结构 本节内容有点跑题.但我认为这是一个很好的方法. 我将告诉你如何规划项目的目录. 这是基于惯例,但将帮助您: 轻松阅 ...

  3. <<Modern CMake>> 翻译 2.2 CMake 编程

    <<Modern CMake>> 翻译 2.2 CMake 编程 流程控制 CMake有一个 if 语句, 经年累月之后,现在它已经相当复杂. 您可以在 if 语句中使用全大写 ...

  4. <<Modern CMake>> 翻译 2.3 与代码通信

    <<Modern CMake>> 翻译 2.3 与代码通信 配置文件 CMake 允许您使用代码通过 configure_file 存取 CMake 变量. 此命令复制一个文件 ...

  5. 【转载】CMake 简介和 CMake 模板

    转载自我的博客: CMake 简介和 CMake 模板 . 如果你用 Linux 操作系统,使用 cmake 会简单很多,可以参考一个很好的教程: CMake 入门实战 | HaHack .如果你用 ...

  6. Effective Modern C++翻译(1):序言

    /*********************************************************** 关于书: 书是我从网上找到的effective Modern C++的样章,内 ...

  7. CMake安装或CMake Error at CMakeLists

    CMake安装或CMake Error at CMakeLists 发生情景: 使用cmake命令安装软件时,报如下错误: CMake Error at CMakeLists.txt:4 (CMAKE ...

  8. mysqlQL 5.7 安装报错CMake Error at cmake/boost.cmake:81 (MESSAGE)

    CMake Error at cmake/boost.cmake:81 (MESSAGE): You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BO ...

  9. Cmake实践(Cmake Practice)第一部分

    参考资料地址:https://github.com/Akagi201/learning-cmake/blob/master/docs/cmake-practice.pdf 一.初识cmake 1. C ...

随机推荐

  1. fork和僵尸进程

    1. 关于fork fork()函数: 用于创建一个进程,所创建的进程复制父进程的代码段/数据段/BSS段/堆/栈等所有用户空间信息:在内核中操作系统重新为其申请了一个PCB,并使用父进程的PCB进行 ...

  2. SQL Server 2012设置某用户对某些表的记录限制其删除操作

    第一步:用sa用户进入SSMS: 第二步:在安全性---用户上面点击右键---"属性": 第三步:在选择页中选择”安全对象“,点击”搜索“,弹出添加对象页面,这里默认为特定对象不用 ...

  3. C语言之父Dennis Ritchie告诉你:如何成为世界上最好的程序员?

    文/Ohans Emmanuel 译/网易云信 想要阅读更多技术干货文章,欢迎关注网易云信博客. 了解网易云信,来自网易核心架构的通信与视频云服务. 我不知道如何成为世界上最好的程序员.但是,我们可以 ...

  4. spring cloud 系列第2篇 —— eureka 高可用注册中心的搭建 (F版本)

    源码仓库地址:https://github.com/heibaiying/spring-samples-for-all 一.项目结构 eureka-server为服务注册中心,负责服务的管理: eur ...

  5. VIM技巧, .vimrc文件

    将 .vimrc文件上传到用户家目录下 文件内容如下: autocmd BufNewFile *.py,*.cc,*.sh,*.java exec ":call SetTitle()&quo ...

  6. PHP 碎碎念

    class Object { public static function get_self() { return new self(); } public static function get_s ...

  7. windows安装TensorFlow和Keras遇到的问题及其解决方法

    安装TensorFlow在Windows上,真是让我心力交瘁,想死的心都有了,在Windows上做开发真的让人发狂. 首先说一下我的经历,本来也就是起初,网上说python3.7不支持TensorFl ...

  8. java基础类型源码解析之HashMap

    终于来到比较复杂的HashMap,由于内部的变量,内部类,方法都比较多,没法像ArrayList那样直接平铺开来说,因此准备从几个具体的角度来切入. 桶结构 HashMap的每个存储位置,又叫做一个桶 ...

  9. JS高级程序设计第2章--精简版

    前言:这次是二刷了,想暑假做一次完整的笔记,但用本子来写笔记的话太贵了,可能哪天还丢了..所以还是博客好== 第二章:在HTML中使用JavaScript 2.1 <script>元素: ...

  10. POJ 2728:Desert King(最优比率生成树)

    http://poj.org/problem?id=2728 题意:有n个点,有三个属性代表每个点在平面上的位置,和它的高度.点与点之间有一个花费:两点的高度差:还有一个长度:两点的距离.现在要让你在 ...