146

我正在考虑用 C++ 开始一个新项目——最初只是在我自己的时间里——我正在研究可用的构建系统。答案似乎是“很多,而且都很糟糕”。

我特别需要的功能是:

  1. C++11 支持
  2. 跨平台(Linux 作为主要目标,但至少也可以在 Windows 上构建)
  3. 体面的单元测试支持
  4. 支持多个模块分离代码
  5. 支持代码生成(使用 asn1c 或 protobuf - 尚未 100% 确定)
  6. 易于维护

现在,我知道我可以轻松地使用 CMake 和 Autotools 完成其中的 1-4 次。可能还有 SCons 和 Waf 以及其他几个。问题是我从来没有弄清楚如何使用它们正确地进行代码生成——即在构建过程首次运行之前不存在的源文件,因此构建系统必须能够转换为可执行代码的源文件但实际上直到构建开始才知道......(特别是 ASN1C 会生成数十个必须能够一起工作的头文件和源文件,而实际生成的文件集取决于您的 asn 文件的内容)还有一个事实是,这些都不是特别容易维护的——CMake 和 Autotools 有自己的大量脚本,你需要管理它们才能工作,

那么 - 对于这样的事情推荐什么构建系统?还是我现在会被 make 文件和 shell 脚本困住?

4

8 回答 8

129

+1 表示“很多,而且很糟糕。”

但是,“最丰富”和“最可扩展”的可能是CMake,它是一个 Makefile 生成器(也生成本机 MSVC++ *.proj/ *.sln)。奇怪的语法,但是一旦你学会了它,它就可以让你很好地为不同的平台生成构建。如果我“重新开始”,我可能会使用CMake. 它应该处理您的列表,尽管您的“代码生成”可能会在构建系统之外承担“自己的生命”,具体取决于您想要做什么。(见下文。)

对于简单的项目,QMake生成器是可以的(你不需要使用 Qt 库来使用 QMake)。但是,您不是在描述“简单”——代码生成和“额外阶段”意味着您可能想要CMake或具有丰富 API 的东西用于您自己的扩展,例如Scons(或Waf)。

我们在工作中使用Scons。它产生“防弹构建”,但它真的很慢。没有其他系统能像Scons. 但是,它很慢。它是用 Python 编写的,我们扩展了“工作空间组织”的接口(我们只指定模块依赖项),这是Scons设计意图的一部分(这种通过 Python 进行的扩展)。方便,但构建速度很慢。您获得了防弹构建(任何开发人员框都可以制作最终版本),但速度很慢。而且,速度很慢。但是,不要忘记,如果您使用Scons,它会很慢。而且,速度很慢。

想到 2000 年后的十年,我们仍然没有飞行汽车,这让我感到恶心。我们可能还得再等一百年才能得到它们。而且,我们都可能会乘坐仍在使用蹩脚构建系统建造的飞行汽车。

是的,他们都很糟糕。

[关于代码生成]

Scons适用于“阶段”,它们是“有点静态的”。它可以构建作为构建的一部分生成的代码(人们正在以几种不同的方式执行此操作),但这被描述为“非常不像 Scons 的东西”。

如果它是简单的“预处理一些文件并生成源文件”,那么没什么大不了的(你有很多选择,这就是为什么qmake要写 - 用于文件的moc预处理*.hpp/*.cpp)。

但是,如果您以“繁重的方式”执行此操作,则需要编写自己的脚本。例如,我们将查询数据库并生成 C++ 类作为“层”之间的接口(在传统的 3 层应用程序开发中)作为构建脚本的一部分。同样,我们通过 IDL 生成服务器/客户端源代码,并嵌入版本信息以允许多个客户端/服务器以不同版本同时运行(对于相同的“客户端”或“服务器”)。大量生成的源代码。我们可以“假装”那是“构建系统”,但实际上,它是“配置管理”的重要基础设施,其中一部分是“构建系统”。例如,这个系统不得不“删除”和“

于 2012-08-18T22:21:07.013 回答
34

You can use Gradle now: https://docs.gradle.org/current/userguide/native_software.html

This seems to have matured quite a bit in the years since I originally posted this. The page saying that the project is "incubating" has disappeared, but I can't find any official announcement removing this status.

于 2014-06-18T13:57:54.377 回答
15

我找到了这些,我还没有亲自使用过所有这些:

Ninja,一个专注于速度的小型构建系统。谷歌现在使用 Ninja 来构建 Android 而不是 Make: link

Shake,一个强大而快速的构建系统。

Tup,一个高性能的构建系统。基于算法的设计。 Tup 分析

所有现在都是跨平台的并支持 Windows。我还不确定您的其他要求,因为我还没有亲自测试它们。它们被用于商业开发,CIG选择了 Ninja。我已经使用并喜欢 Ninja 的易用性和速度以及项目生成器。前两个类似于 Scons、Ant 等。

于 2014-12-15T18:08:48.447 回答
10

Scons is very friendly and flexible system, but you right, Lothar, it really slow.

But there is a way to increase the performance of programs written in Python. This use of the JIT. Of all known projects, PyPy is a very powerful, fast-growing and motivated JIT-backed - Python 2.7 implementation. PyPy compatibility with Python 2.7 is simply amazing. However, Scons declared as unsupported project on the PyPy compatibility wiki. Waf, on the other hand, modeled as python-based autotools sucessor, is fully supported by PyPy infrastructure. In my projects the speed of the assembly has increased 5-7 times in the transition to PyPy. You can see the performance reports from PyPy.

For modern and relatively fast build system Waf is good choice.

于 2013-02-17T23:44:09.277 回答
10

谷歌构建系统是一个不错的选择:http ://bazel.io/

于 2015-12-09T09:54:28.730 回答
5

我使用了 SCons,并且对这个构建系统印象深刻。SCons 可以通过 python 和 python 本身进行扩展——这很棒,因为 Python 拥有你需要的一切,只需编写逻辑代码,所有低级功能已经在 SCons 和 Python 中实现并且是跨平台的。如果具有良好的编程技能,那么您的构建脚本将看起来完美而简单。

Make、CMake 和类似的构建系统似乎是宏的垃圾。Waf 是 SCons 模拟。我正在尝试 Waf,但 SCons 会更友好,所以我留在了 SCons。

群众意见 SCons 太慢了,但在项目的中间,我没有看到 make 和 SCons 之间的构建速度有任何区别。相反,SCons 很好地处理了并行构建,而 make 却遇到了很大的麻烦。

此外,SCons 允许您获取 - 配置、构建、部署、从模板生成配置、运行测试和执行任何其他可以使用 python 和 SCons 编码完成的任务 - 全部合二为一。这是一个非常大的优势。

对于一个简单的项目,CMake 也是一个不错的选择。

于 2012-08-18T10:15:48.643 回答
3

只是为了增加我的美分:预制

http://industriousone.com/premake

wiki 上还有一个专门的网页

于 2012-08-18T22:42:25.287 回答
1

您可以使用Ceedling。请注意,但它目前仅支持 C,并且与作者的 Unity 和 CMock 测试框架紧密耦合。

它可以很容易地被分叉和修改以与 C++ 编译器和单元测试/模拟框架一起使用。

Tup也值得一提。它非常快,但它对测试框架等一无所知,这意味着您必须使用 Tup 编写自己的构建系统。如果你打算做 TDD,Tup 可能是要走的路。

于 2014-05-24T09:13:16.787 回答