Autotools,Cmake和Scons之间有什么区别?
Autotools,Cmake和Scons之间有什么区别?
事实上,Autotools唯一真正的“节约恩典”就是GNU项目主要使用的是什么。
Autotools的问题:
- 真正的ARCANE m4macros语法结合详细的扭曲shell脚本来testing“兼容性”等
- 如果你不注意的话,你会搞乱交叉编译的能力(应该清楚地注意到,诺基亚提出了Scratchbox / Scratchbox2,以便为Maemo / Meego设置高度破碎的Autotools版本。)如果你原因,在你的testing中有固定的静态path,你会打破交叉编译的支持,因为它不会遵守你的sysroot规范,它会从你的主机系统中抽取东西。 如果你打破了交叉编译的支持,它会使你的代码不能用于像OpenEmbedded这样的东西,并且对于试图在交叉编译器而不是目标上构build它们的版本的发行版是很有趣的。
- 对NOBODY目前使用的古代,破碎的编译器的问题进行了大量的testing,在今天和这个时代,几乎所有的产品都被使用了。 除非在真正古老的Solaris,AIX或类似的版本上构build像glibc,libstdc ++或GCC之类的东西,否则testing是浪费时间,并且是上述许多潜在破坏的源头。
- 让Autotools安装程序为Windows系统构build可用的代码是非常痛苦的经历。 (虽然我几乎没有使用Windows,但如果您正在开发跨平台的代码,这是一个严重的问题。)
- 当它打破的时候,你会花费小时追逐你的尾巴,试图理清谁写的脚本错误的东西来整理你的构build(事实上,这是我正在做的事情(或者说,完全剔除Autotools – 我怀疑这个月剩下的时间有足够的时间来排除这些混乱……),因为我正在input这个信息,Apache Thrift有一个BROKEN构build系统,它不会交叉-compile。)
- “正常”的用户实际上不会只是做“./configure; make” – 对于很多事情来说,他们会拉一些由某人提供的软件包,比如PPA或者其分销商。 “正常”的用户不是开发者,在很多情况下并没有抓取压缩包。 这是每个人都假装在那里的情况下势利的。 tarball的典型用户是开发人员,所以如果在那里的话,他们会被破坏。
它工作…大部分时间…你可以说关于Autotools。 这是一个系统,解决了几个真正涉及到GNU项目的问题……他们的核心工具链代码。 (编辑(2014年5月24日):应该指出的是,这种types的担心是一个可能是不好的事情要担心 – Heartbleed部分源于这个想法和正确的,现代系统,你真的没有任何业务处理大部分Autotools纠正的问题GNU可能需要根据Heartbleed发生的情况来彻底删除代码库)你可以用它来完成你的项目,它可以很好地适用于一个小的项目,除了Linux以外或GNU工具链明确工作正常的地方,不要期望工作。 “与Linux很好地集成”这个陈述是相当大胆的陈述,相当不正确 。 它与GNU工具套件很好地集成在一起,解决了IT与其目标相关的问题。
这并不是说这里讨论的其他选项没有问题。
SCons更多的是Make / GMake等的替代品。 看起来相当不错,所有的事情考虑但是…
- 它仍然是更多的POSIX唯一的工具。 你可能更容易让MinGW用它来构buildWindows的东西,而不是使用Autotools,但是它仍然更适合做POSIX的东西,你需要安装Python 和 SCons来使用它。
- 除非你使用Scratchbox2之类的东西,否则它会遇到交叉编译的问题。
- 从他们自己的比较来看,肯定比CMake慢,不稳定。 与SCons相比,他们拿出三心二意(POSIX方面需要make / gmake来构build…)的CMake。 (另外,如果你需要比其他解决scheme有更多的可扩展性,你应该问自己,你的项目是否太复杂了…)
在这个线程给CMake的例子有点虚伪。
然而…
- 你需要学习一门新的语言。
- 如果您习惯于使用Make,SCons或Autotools,则会有违反直觉的事情发生。
- 您需要在您正在构build的系统上安装CMake。
- 如果您没有预编译的二进制文件,您将需要一个稳定的C ++编译器。
事实上,你的目标应该决定你在这里select什么。
- 你需要处理大量的破解工具链来产生一个有效的工作二进制文件? 如果是的话,你可能要考虑Autotools,意识到我上面提到的缺点。 CMake可以应付很多这个,但它比Autotools更less担心。 SCons可以扩展到担心它,但它不是一个开箱即用的答案。
- 你有没有必要担心Windows目标? 如果是这样的话,Autotools应该从字面上来看是跑步的。 如果是这样,SCons可能不是一个好的select。 如果是这样,CMake是一个坚实的select。
- 你有没有必要担心交叉编译(通用应用程序/库,像Google Protobufs,Apache Thrift等应该关心这个…)? 如果是这样,只要您不需要担心Windows,Autotools 可能会为您工作,但随着事情的变化,您将花费大量时间来维护configuration系统。 SCons现在几乎是不可行的,除非你使用的是Scratchbox2–它实际上没有交叉编译的处理,你将需要使用该扩展性,你将与Automake。 如果是这样的话,您可能会考虑CMake,因为它支持交叉编译,没有像沙箱一样的担心,并且可以使用/不使用Scratchbox2,并与OpenEmbedded等很好的集成。
有许多项目正在抛弃qmake,Autotools等,转而采用CMake。 到目前为止,我可以清楚地期望一个基于CMake的项目要么进入交叉编译的情况,要么进入VisualStudio的设置,或者只需要less量的清理工作,因为该项目没有考虑到仅限于Windows或OSX的部分到代码库。 我真的不能期望出于基于SCons的项目 – 我完全预计1/3或更多的Autotools项目已经出现了错误,使得它无法在任何情况下构build,除了主机构build一个或Scratchbox2之外。
必须在使用这些工具的人之间做出重要的区分。 Cmake是构build软件时必须由用户使用的工具。 自动工具用于生成一个分发tarball,可以使用任何SuS兼容系统上的标准工具来构build软件。 换句话说,如果您使用自动工具创build的tarball安装软件, 则不会使用自动工具 。 另一方面,如果您正在安装使用Cmake的软件,那么您正在使用Cmake,必须安装它才能构build软件。
绝大多数用户不需要在他们的盒子上安装autotools。 从历史上看,由于许多开发人员分发格式错误的tarball,导致用户运行autoconf来重新生成configure脚本,导致很多混淆,这是一个打包错误。 更多的困惑是由于大多数主要的Linux发行版都安装了多个版本的自动工具,当他们不应该在默认情况下安装其中的任何版本时。 开发人员试图使用版本控制系统(例如cvs,git,svn)来分发他们的软件,而不是构buildtarball,导致更多的混淆。
这不是关于GNU编码标准。
autotools的当前好处 – 特别是与automake一起使用时 – 是与构buildLinux发行版很好地集成。
以cmake为例,它总是“是我需要的-DCMAKE_CFLAGS或-DCMAKE_C_FLAGS? 不,它不是,它是“-DCMAKE_C_FLAGS_RELEASE”。 或-DCMAKE_C_FLAGS_DEBUG。 这是令人困惑的 – 在autoconf中,它只是./configure CFLAGS =“ – O0 -ggdb3”,你有它。
在与构build基础结构集成时,scons存在无法使用make %{?_smp_mflags}
,在这种情况下, _smp_mflags
是一个大致展开为(pipe理员可以设置)系统权限的RPMmacros。 人们通过他们的环境把-jNCPUS这样的东西放在这里。 由于scons不起作用,所以使用scons的软件包可能只能在内置的发行版中进行串行化。
了解Autotools的重要之处在于它们不是一个通用的构build系统 – 它们实现了GNU编码标准,没有别的。 如果你想制作一个遵循所有GNU标准的软件包,那么Autotools就是一个很好的工具。 如果你不这样做,那么你应该使用Scons或CMake。 (例如,看到这个问题 。)这个常见的误解是Autotools的大部分挫折来自哪里。
而从开发者的angular度来看,cmake目前是最容易使用的,从用户angular度来看,autotools有一大优势
autotools生成一个单独的文件configuration脚本,并生成它的所有文件随发行版一起提供。 在grep / sed / awk / vi的帮助下很容易理解和修复。 把这个和Cmake比较一下,在/ usr / share / cmak * / Modules中find很多文件,除非用户拥有pipe理员访问权限,否则这些文件不能被用户修复。
所以,如果某些东西不起作用,通常可以通过使用标准Unix工具(grep / sed / awk / vi等)以大锤方式轻松“固定”,而无需了解构build系统。
你有没有通过你的cmake构build目录来找出哪里出了什么问题? 与从上到下可以读取的简单的shell脚本相比,在生成的Cmake文件之后找出发生的事情是非常困难的。 同样,在CMake中,调整FindFoo.cmake文件不仅要求掌握CMake语言,还需要超级用户权限。