# Modern CMake 简介

人们对构建系统爱之深责之切。 如果你看了CppCon17上的演讲，你会发现很多开发者嘲笑构建系统的例子。 那么问题来了：为什么呢？ 诚然，构建过程不乏很多问题。 但是我认为，在2018年我们对这些问题有很好的解决方案。 那就是CMake，不过CMake 2.8除外，那是C++11存在前的产物！ 对于CMake而言有很多糟糕的示例（即使是那些发布在KitWare自己的教程列表上的示例）。 我们聊的是Modern CMake，CMake 3.1+，也许甚至是CMake 3.12+! 它干净、强大、优雅，因此你可以将大部分时间花在编码上，而不是在不可读的、不可维护的Make（或CMake 2）文件中添加内容，并且CMake 3.11+也应该明显更快！

> 这是一本活的文档，你可以在Gitlab上提issue或者发起merge request [GitLab](https://gitlab.com/CLIUtils/modern-cmake)。（译注：英文原版可以看这个Gitlab链接）

简而言之，如果你正在考虑使用Modern CMake，这些可能是最先浮现在你脑海的问题：

## 我为什么需要一个好的构建系统

以下任意一项是否适用于你？

* 你希望避免对路径的硬编码
* 你需要在多台计算机上构建包
* 你想使用CI（持续集成）
* 你需要支持不同的操作系统（甚至可能只是Unix的风格）
* 你想支持多种编译器
* 你想使用IDE，但可能不是一直都用
* 你想要描述逻辑上的程序结构，而不是标志和命令
* 你想使用库
* 你想使用像Clang-Tidy这样的工具来帮助你进行编码
* 你想使用调试器

如果是这样，你将受益于CMake式的构建系统。

## 为什么答案一定是CMake呢？

构建系统是一个热门话题。当然，你有很多选择。但是，即使是那种非常好的，或者那种对熟悉的语法进行再利用的，也无法接近CMake。为什么？支持性。每个IDE都支持CMake（或CMake支持该IDE）。比起任何其他构建系统，更多的软件包使用CMake。因此，如果你使用了被设计为包含在代码中的库，你的选择是：创建自己的构建系统，或使用某一个现有构建系统，但总会包含CMake。如果你包含了多个项目，CMake将很快成为公有选项。并且，如果你需要预安装的库，那么它恰好就有相应查询脚本或配置脚本的可能性非常高。

## 为什么要用 Modern CMake（现代化CMake）?

大约在CMake 2.6-2.8版本期间，CMake开始接管（译注：Kitware开始接管？）。它包含与绝大多数Linux系统的包管理工具，并且被用于大量软件包。然后Python 3出现了。我知道，这无论如何跟CMake没关系。但是Python有了版本3，并且是伴随版本2诞生的，它是一个艰难，丑陋的过渡，在某些地方仍在进行，即使在今天。我相信CMake 3运气比Python 3好不到哪去。  尽管每个版本的CMake都在疯狂地向后兼容，但3系列被视为新东西。因此，你会发现操作系统就像拥有GCC 4.8的CentOS7，几乎完全支持C ++ 14，但却包含了CMake 2.8，一个在C ++ 11之前推出的版本。

你真的应该**至少**使用你的编译器发布之后出现的CMake版本，因为它需要知道该版本的编译器flags等。而且，由于CMake将自己降级为CMake文件中所需的最低版本，因此即使是系统范围内安装新的CMake也是非常安全的。你应该**至少**在本地安装它，这容易（在许多情况下为1-2行），你会发现5分钟的工作将为你节省数百行和几小时的CMakeLists.txt写作，并且从长远来看将更容易维护。

本书试图解决您在网络上发现的不良示例和最佳实践的问题。

## 其他来源

网上还有一些其他地方可以找到好的信息，以下是其中一些：

* [The official help](https://cmake.org/cmake/help/latest/)：真的很棒的文档。组织精良，搜索方便，您可以在顶部切换版本。它只是没有一个伟大的“最佳实践教程”，这正是这本书试图补充的。
* [Effective Modern CMake](https://gist.github.com/mbinna/c61dbb39bca0e4fb7d1f73b0d66a4fd1)：一个很棒的做和不做的清单。
* [Embracing Modern CMake](https://steveire.wordpress.com/2017/11/05/embracing-modern-cmake/)：一个对该术语有良好描述的帖子。
* [It's time to do CMake Right](https://pabloariasal.github.io/2018/02/19/its-time-to-do-cmake-right/)：一套现代CMake项目的很好的最佳实践。
* [The Ultimate Guide to Modern CMake](https://rix0r.nl/blog/2015/08/13/cmake-guide/)：一个具有类似意图的略微过时的帖子。

## 制作组

Modern CMake 最早由 [Henry Schreiner](https://iscinumpy.gitlab.io)撰写。其他贡献者可以在这里找到 [listed on GitLab](https://gitlab.com/CLIUtils/modern-cmake/graphs/master).


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://xiazuomo.gitbook.io/modern-cmake-chinese/introduction.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
