C ++构build系统 – 使用什么?
我正在考虑用C ++开始一个新项目 – 刚开始的时候,我正在调查可用的构build系统。 看起来答案是“很多,而且都很糟糕”。
我特别需要的function是:
- C ++ 11支持
- 跨平台(Linux为主要目标,但至less可以在Windows上构build)
- 体面的unit testing支持
- 支持多个模块分离代码
- 支持代码生成(使用asn1c或protobuf – 不是100%确定)
- 易于维护
现在,我知道我可以很轻松地使用CMake和Autotools。 也许也与SCons和Waf以及其他人一起。 问题是,我从来没有弄清楚如何正确地使用它们来做代码生成 – 这是源代码文件在构build过程第一次运行之前不存在,所以构build系统必须能够转换成可执行代码的源文件但是直到构build开始时才真正知道…(特别是ASN1C会生成数十个头文件和源文件,这些文件必须能够一起工作,并且实际的文件集合取决于您的asn文件的内容)还有一个事实是,这些都不是特别容易维护–CMake和Autotools有他们自己的巨大的脚本,你需要pipe理他们的工作,而Waf和Scons要求任何与他们合作的人都有正确的Python知识(I不要)和他们一起工作…
那么 – 对于这样的东西,推荐哪些构build系统? 或者现在我会被困在make文件和shell脚本中?
+1,“很多,而且很糟糕”。
但是,“最丰富”和“最可伸缩”可能是CMake ,它是一个Makefile生成器(也生成本机MSVC ++ *.proj
/ *.sln
)。 奇怪的语法,但一旦你了解它,它可以让你很好地生成不同平台的构build。 如果我“开始新鲜”,我可能会使用CMake
。 它应该处理你的列表,尽pipe你的“代码生成”可以在构build系统之外采取“自己的生活”,这取决于你想要做什么。 (见下文。)
对于简单的项目, QMake生成器是可以的(你不需要使用Qt库来使用QMake)。 但是,你并没有描述“简单” – 代码生成和“额外阶段”意味着你可能需要CMake
或者一些丰富的API来为自己的扩展,比如Scons
(或者Waf
)。
我们在工作中使用Scons 。 它产生了“防弹build造”,但速度很慢。 没有其他的系统会像Scons
那样Scons
。 但是,这很慢。 它是用Python编写的,我们扩展了“工作空间组织”(我们只是指定模块依赖关系)的接口,这是Scons
devise意图(通过Python这种扩展)的一部分。 方便,但build设很慢。 你可以得到防弹版本(任何开发者可以制作最终版本),但速度很慢。 而且,速度很慢。 不要忘记,如果你使用Scons
,那很慢。 而且,速度很慢。
想到2000年后的十年,我们还没有飞行汽车,这让我感到不舒服。 我们可能要等上百年才能拿到。 而且,我们可能都会在我们飞行的小汽车里飞奔,这些小汽车仍然在用蹩脚的build筑系统来build造。
是的,他们都很糟糕。
[关于代码生成]
Scons
在“阶段”上工作,他们“有点静态”。 它可以构build作为构build的一部分生成的代码(人们正在通过几种不同的方式来实现这一点),但是这被描述为“非常不像Scons的东西”。
如果很简单,“预处理一些文件并生成源文件”,那么就不需要太多的select,这就是qmake
写入的原因 – 用于*.hpp/*.cpp
文件的moc
预处理。
但是,如果你是以“沉重的方式”来做这件事,那么你就需要编写自己的脚本。 例如,我们有一个“构build部分”脚本来查询数据库,并生成C ++类来在“层”(在传统的3层应用程序开发中)之间进行接口。 同样,我们通过IDL和embedded式版本信息生成服务器/客户端源代码,以允许多个客户端/服务器同时运行不同的版本(对于同一个“客户端”或“服务器”)。 很多生成的源代码。 我们可以“假装”这个“build造系统”,但实际上,这是一个“configurationpipe理”的非平凡基础设施,其中一部分是“build造系统”。 例如,这个系统必须把“取下”和“启动”服务器作为这个过程的一部分。 同样,回归testing也是这个过程的一部分,在版本之间进行大量的“报告”和“差异testing” – 这些都是我们“构build脚本”的一部分。
您现在可以使用Gradle: https : //docs.gradle.org/current/userguide/native_software.html
自从我最初发布这个版本以来,这似乎已经成熟了很多年。 说这个项目正在“孵化”的页面已经消失了,但是我找不到任何正式的声明来取消这个状态。
我最近发现了这些,我还没有亲自用过它们:
忍者 ,一个专注于速度的小型构build系统。 谷歌现在使用忍者来build立Android而不是Make: 链接 。
摇 ,强大和快速的构build系统。
Tup ,一个高性能的构build系统。 基于algorithm的devise。 Tup分析 。
现在都是跨平台的,支持Windows。 我还不确定你的其他要求,因为我还没有对自己进行testing。 他们被用于商业发展, CIG采摘忍者。 前两个类似于Scons,Ant等
Scons是非常友好和灵活的系统,但是你对,Lothar真的很慢。
但是有一种方法可以提高用Python编写的程序的性能。 这个使用JIT。 在所有已知的项目中,PyPy是一个非常强大,快速增长和动力强大的JIT支持的Python 2.7实现。 PyPy与Python 2.7的兼容性简直太棒了。 但是,Scons在PyPy兼容性wiki上声明为不受支持的项目。 另一方面, Waf是基于python的自动工具的后继模型,完全由PyPy基础设施支持。 在我的项目中,在向PyPy过渡时,程序集的速度增加了5-7倍。 你可以看到来自PyPy的性能报告 。
对于现代和相对较快的构build系统Waf是不错的select。
Google构build系统是一个很好的select: http : //bazel.io/
我使用了SCons,并为这个构build系统留下了深刻的印象。 SCons可以通过python和python本身扩展 – 这很好,因为Python拥有你所需要的所有东西,只需编码逻辑,所有的低级function已经在SCons和Python中实现,并且是跨平台的。 如果有良好的编程技巧,那么你的构build脚本将看起来完美和容易。
Make,CMake和类似的构build系统似乎是macros的垃圾。 Waf是SCons类比。 我想Waf,但SCons会更友好,所以我留在SCons。
根据观众的意见SCons太慢了,但在一个项目的中间,我没有看到make和SCons之间的区别。 相反,SCons在并行构build方面做得很好,而且在这方面也有很大的麻烦。
此外,SCons允许您从模板中configuration,构build,部署,生成configuration,运行testing以及执行可以使用python和SCons进行编码的所有其他任务。 这是一个非常大的优势。
对于一个简单的项目来说,CMake也是一个不错的select。
你可以使用Ceedling 。 但是请注意,目前它只支持C,它与作者的Unity和CMocktesting框架紧密相连。
它可以分叉和修改,以便相当容易地使用C ++编译器和unit testing/模拟框架。
Tup也是值得一提的。 它非常快速,但对testing框架等一无所知,这意味着您将不得不使用Tup编写自己的构build系统。 如果你打算做TDD,TUP可能是要走的路。