C ++构建系统 - 使用什么?

时间:2012-08-18 09:48:04

标签: c++ build

我正在考虑用C ++开始一个新项目 - 最初只是在我自己的时间 - 我正在调查可用的构建系统。似乎答案是“很多,而且它们都很可怕”。

我特别需要的功能是:

  1. C ++ 11支持
  2. 跨平台(Linux作为主要目标,但也能够至少在Windows上构建)
  3. 体面单位测试支持
  4. 支持多个模块以分离代码
  5. 支持代码生成(使用asn1c或protobuf - 尚未100%确定)
  6. 易于维护
  7. 现在,我知道我可以轻松地完成使用CMake和Autotools的1-4个人。可能还有SCons和Waf以及其他几个人。问题是我从来没有弄清楚如何使用它们正确地进行代码生成 - 这是在第一次运行构建过程之前不存在的源文件,因此构建系统必须能够转换为可执行代码的源文件但实际上并没有知道,直到构建开始......(ASN1C特别生成了几十个必须能够一起工作的头文件和源文件,并且生成的实际文件集取决于你的asn文件的内容)事实上,这些都不是特别容易维护 - CMake和Autotools有他们自己需要管理的大量脚本,Waf和Scons要求任何与他们一起工作的人都有很好的python知识(I不要与他们合作......

    那么 - 对于这样的东西,建议使用哪些构建系统?或者我现在还会遇到make文件和shell脚本吗?

8 个答案:

答案 0 :(得分:109)

+1 for,“很多,他们很可怕。”

但是,“最富有”和“最具可伸缩性”可能是CMake,它是一个Makefile-generator(也生成本机MSVC ++ *.proj / *.sln)。奇怪的语法,但是一旦你学会了它,它可以让你很好地为不同的平台生成构建。如果我“开始新鲜”,我可能会使用CMake。它应该处理你的列表,虽然你的“代码生成”可以在构建系统之外“自己生活”,具体取决于你想做什么。 (见下文。)

对于简单项目,QMake生成器没问题(您不需要使用Qt库来使用QMake)。但是,您没有描述“简单” - 代码生成和“额外阶段”意味着您可能希望CMake或具有丰富API的内容用于您自己的扩展,例如Scons(或{{ 1}})。

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

我认为,在2000年之后的十年,我们仍然没有飞行汽车。我们可能要等上一百年才能得到它们。而且,我们所有人都可能会在我们的飞行汽车中飞来飞去,这些飞行汽车仍然是用蹩脚的构建系统构建的。

是的,它们都很糟糕。

[关于代码生成]

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

如果简单的“预处理一些文件并生成源文件”,那么没有大问题(你有很多选择,这就是编写Scons的原因 - 用于qmake预处理{{ 1}}文件)。

但是,如果你以“沉重的方式”这样做,你将需要自己编写脚本。例如,我们有一个部分构建脚本,用于查询数据库并生成C ++类以在“层”之间进行接口(在传统的3层应用程序开发中)。类似地,我们通过IDL和嵌入式版本信息生成服务器/客户端源代码,以允许多个客户端/服务器同时运行不同版本(对于相同的“客户端”或“服务器”)。大量生成的源代码。我们可以“假装”这是“构建系统”,但实际上,它是“配置管理”的一个非平凡的基础架构,其中一部分是“构建系统”。例如,该系统必须“拆卸”和“启动”服务器作为此过程的一部分。同样,回归测试作为此过程的一部分执行,版本之间有大量的“报告”和“差异测试” - 所有这些都是我们“构建脚本”的一部分。

答案 1 :(得分:31)

您现在可以使用Gradle:https://docs.gradle.org/current/userguide/native_software.html

自从我最初发布此文件以来,这似乎已经成熟了很多年。页面说该项目正在孵化"已经消失了,但我找不到任何正式声明删除此状态。

答案 2 :(得分:14)

我最近发现了这些,我还没有亲自使用过它们:

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

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

Tup,一个高性能的构建系统。基于Algorithmic的设计。 Analysis of Tup

所有这些现在都是跨平台的并且支持Windows。我还不确定你的其他要求,因为我还没有自己测试它们。它们被用于商业开发,CIG选择了Ninja。前两个类似于Scons,Ant等。

答案 3 :(得分:11)

Scons是一个非常友好和灵活的系统,但你说得对,洛萨,它真的很慢。

但是有一种方法可以提高用Python编写的程序的性能。这种使用JIT。在所有已知的项目中,PyPy是一个非常强大,快速增长且有动力的JIT支持的Python 2.7实现。 PyPy与Python 2.7的兼容性简直令人惊叹。但是,Scons在PyPy compatibility wiki上宣布为不受支持的项目。 另一方面, Waf 建模为基于python的autotools sucessor,完全由PyPy基础架构支持。在我的项目中,在向PyPy过渡时,组装的速度增加了5-7倍。 You can see the performance reports from PyPy

对于现代和相对快速的构建系统,Waf是不错的选择。

答案 4 :(得分:8)

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

答案 5 :(得分:6)

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

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

通过群众意见SCons太慢了,但是在项目中间我没有看到make和SCons之间因构建速度有任何差异。相反,SCons已经很好地使用了并行构建,而make则有很大的麻烦。

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

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

答案 6 :(得分:5)

只是为了加上我的分:premake

http://industriousone.com/premake

维基上还有一个dedicated webpage

答案 7 :(得分:2)

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

它可以分叉和修改,以便相当容易地使用C ++编译器和单元测试/模拟框架。

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