Autotools,Cmake和Scons之间有什么区别?


259

Autotools,Cmake和Scons之间有什么区别?


Scons Wiki中已经讨论了该主题。我建议您访问以下链接:1. scons.org/wiki/SconsVsOtherBuildTools您是否访问过Ubuntu论坛中一个非常类似的讨论线程?
bhadra

您可以查看此pdf文件www-alt.gsi.de/documents/DOC-2007-Sep-17-1.pdf ; 它具有优点和缺点,并且还包含每个工具的一些详细信息。
亚当

Answers:


190

实际上,Autotools唯一真正的“省钱”之处就是这是所有GNU项目都在大量使用的东西。

自动工具的问题:

  • 真正结合了ARCANE m4宏语法和详细的扭曲外壳脚本,以进行“兼容性”测试等。
  • 如果您不注意,则会搞乱交叉编译功能(应该清楚地注意到,诺基亚提出了Scratchbox / Scratchbox2来回避Maemo / Meego的破坏性Autotools构建设置。)原因是,在测试中有固定的静态路径,因此您将中断对交叉编译的支持,因为它不符合您的sysroot规范,并且会从您的主机系统中提取东西。如果破坏了交叉编译支持,它将使您的代码无法用于OpenEmbedded之类,并使其对分发尝试在交叉编译器而非目标上构建发行版的发行版“变得有趣”。
  • 使用NOBODY当前在当今时代生产的几乎所有产品中使用的古老,破烂的编译器进行大量测试。除非您在Solaris,AIX 等真正古老的版本上构建glibc,libstdc ++或GCC之类的东西,否则这些测试是浪费时间,并且是上述许多潜在潜在破坏的来源。
  • 获得Autotools安装程序来为Windows系统构建可用代码几乎是一种痛苦的经历。(尽管我很少使用Windows,但是如果要开发据说跨平台的代码,则是一个严重的问题。)
  • 当它崩溃时,您将花费HOURS追尾,以理清那些编写脚本的人弄错的内容,以理清您的构建(事实上,这就是我想要做的(或者,完全淘汰Autotools-我怀疑本月剩余时间中是否有足够的时间整理混乱...),因为现在我正在键入此文件,所以Apache Thrift拥有其中的BROKEN构建系统之一-编译。)
  • 实际上,“普通”用户将不会仅仅执行“ ./configure; make”-在许多情况下,他们将要从某人(例如,PPA)或其分销商那里提取一个软件包。在许多情况下,“普通”用户不是开发人员,也不是抓包。每个人都认为这是事实,这对所有人都很不利。tarball的典型用户是开发人员在做事情,因此如果存在损坏,他们将大为震惊。

它可以工作...大多数时候...关于Autotools的全部内容。它是一个系统,可以解决几个真正与GNU项目有关的问题……就其基础,核心工具链代码而言。(编辑(2014年5月24日):应该指出的是,这种关注是一种潜在BAD是担心关于我们-心脏出血漏洞的事情,从这个思路,并与正确的,先进的系统,你朵朵部分没有任何业务可以处理Autotools校正的大部分内容。鉴于Heartbleed发生的事情,GNU可能需要删除代码库。)您可以使用它来执行您的项目,并且它可能适合小型项目,除了Linux或其他地方,您不希望在其他任何地方工作GNU工具链显然可以正常工作。声明说,它“集成很好地与Linux”是相当大胆的声明,相当不正确。它与GNU工具套件很好地集成在一起,并解决了IT目标方面的问题。

这并不是说这里的线程中讨论的其他选项没有问题。

SCons更像是Make / GMake / etc的替代品。而且看起来还不错,所有的东西都考虑过但是...

  • 实际上,它实际上仍然仅仅是POSIX工具。与Autotools相比,您可能更容易使MinGW以此来构建Windows东西,但实际上它仍然更适合做POSIX东西,并且您需要安装Python SCons才能使用它。
  • 除非您使用Scratchbox2之类的东西,否则交叉编译时会遇到问题。
  • 从他们自己的比较来看,它确实比CMake慢且不稳定。与SCons相比,他们为CMake带来了三心二意的问题(POSIX方面需要make / gmake来构建...)。(顺便一句,如果您需要与其他解决方案相比那么多的可扩展性,则应问自己项目是否太复杂了……)

在该线程中为CMake给出的示例有些虚假。

然而...

  • 您将需要学习一种新的语言。
  • 如果您习惯于使用Make,SCons或Autotools,则有违反直觉的事情。
  • 您需要在要构建的系统上安装CMake。
  • 如果您没有预编译的二进制文件,则需要一个可靠的C ++编译器。

实际上,您的目标应该决定您在这里选择什么。

  • 你需要处理一个LOT破碎工具链产生一个有效的工作二进制?如果是,请注意上面提到的缺点,然后考虑使用Autotools。CMake可以解决很多这样的问题,但是它比Autotools所担心的要少。可以扩展SCons来担心它,但这并不是开箱即用的答案。
  • 您是否需要担心Windows目标?如果是这样的话,Autotools应该完全不可用。如果是这样,SCons可能/可能不是一个不错的选择。如果是这样,CMake是一个不错的选择。
  • 您是否需要担心交叉编译(通用应用程序/库,诸如Google Protobufs,Apache Thrift等之类的东西。应该对此进行关注...)?如果是这样,Autotools 可能只要您不必担心Windows,它就会为您工作,但是随着情况的变化,您将花费大量时间来维护配置系统。除非您使用的是Scratchbox2-,否则SCons目前几乎是不行的,除非它确实无法处理交叉编译,并且您将需要使用该可扩展性并以与您将使用Automake。如果是这样,您可能要考虑CMake,因为它支持交叉编译,而无需担心从沙箱中泄漏出来,并且可以使用/不使用Scratchbox2之类的东西,并且可以与OpenEmbedded之类的东西很好地集成在一起。

原因是很多项目放弃了qmake,Autotools等,而转移到CMake。到目前为止,我可以明确地期望基于CMake的项目陷入交叉编译的情况或进入VisualStudio安装程序,或者只需要少量清理,因为该项目没有考虑仅Windows或仅OSX的部分到代码库。我真的不能指望出SCons的基于项目和我完全相信1/3以上Autotools的项目已经得到SOMETHING错认为是正确的基础上,除了主机建立一个或Scratchbox2一个任何上下文排除了。


12
提及心血的章节降低了这种沮丧的声音。问题在于,OpenSSL没有使用配置程序类型的包来检测损坏的malloc,而是重新实现了系统库,并击败了平台开发人员,后者开发了可以更快发现漏洞的库。移植程序的原因之一是它们变得更高质量,因为它们更少依赖于您无法证明自己正在做的那些小假设
Rob11311 2014年

9
问题是它丝毫不会减损它。使用Autotools,您担心要补偿诸如此类的事情-这些重新实现就是这种想法的扩展。将其提升到一个新的水平。您应该从那个背景来看……在这一点上,它丝毫不影响它。您没有在推理中指出根本原因-只是发生了什么。我指的是与Shellshock和其他一些喜欢它的人相关的确切思想。如果损坏,则应修复它。如果不能-您应该问为什么继续进行下去。
Svartalf 2014年

5
我毫不怀疑自动工具和scons很烂,但是这个答案在指出CMake的缺点方面做得很差(我最喜欢的构建系统,仅是因为构建系统的状态非常非常糟糕)。基本上,CMake是一种不一致性的分形,它内置了对个别边缘情况的支持,而不是处理大多数事情的某些核心抽象。绝对是编程的胶带和固定线。我确定我做错了什么,但是它不支持Visual Studio,除非每个CMakeLists.txt找到一个VS项目是可以接受的(我不是VS用户,但是我的Winfriends告诉我这很不好)。
weberc2

5
与其他讨厌的编程工具不同,没有足够的材料来编写称为“ CMake,好的零件”(也许是小册子或博客文章)的书,而且它比PHP更像是糟糕的设计。
weberc2

2
@JAB VS用户告诉我,这不是习惯用法。实际上,CMake被替换为我们项目的构建系统,因为没有人能弄清楚如何生成所说的“惯用” VS Project文件。
weberc2

73

必须区分谁使用这些工具。Cmake是构建软件时用户必须使用的工具。自动工具用于生成分发压缩包,该分发压缩包仅可使用任何与SuS兼容的系统上可用的标准工具来构建软件。换句话说,如果要从使用自动工具构建的压缩包中安装软件,则说明您没有在使用自动工具。另一方面,如果要安装使用Cmake的软件,则说明您正在使用Cmake,并且必须安装它才能构建软件。

绝大多数用户不需要在盒子上安装自动工具。从历史上看,由于许多开发人员分发格式错误的tarball迫使用户运行autoconf来重新生成配置脚本,因此引起了很多混乱,这是打包错误。大多数主要的Linux发行版都安装了多个版本的自动工具,而默认情况下它们不应该安装任何版本,这引起了更多的混乱。由于开发人员试图使用版本控制系统(例如cvs,git,svn)来分发其软件而不是构建tarball,造成了更大的混乱。


5
没错,尽管您说使用VCS分发软件听起来很糟糕。如果检出或克隆的内容与压缩包的内容相同,为什么您会推荐压缩包?
d -_- b

5
@Toor我不明白你的问题。我从事的所有项目都产生了一个与VCS结帐不同的压缩包。保持两者的不同有助于可靠的分发。
William Pursell 2013年

13
确实,许多项目要求人们使用VCS来获取最新版本,但这仅适用于开发人员。不幸的是,许多用户无法理解发行版tarball和VCS之间的区别。尝试从VCS进行构建会带来更多依赖性。用户可能需要asciidochelp2mandoxygen或者重要的是,需要正确的自动工具组合。对于汽车工具来说,这一直是一个巨大的市场问题。用户错误地认为他们需要安装autoconf,因为他们不了解tarball和VCS之间的区别。
William Pursell 2013年

3
为什么项目无法为常见平台(例如Win,Linux和MacOSX)分发Cmake的输出,项目文件和Makefile?看起来和lex / yacc工具一样,您包含了通用的C代码,因此可以在没有工具的平台上构建
Rob11311 2014年

3
尽管我认为本次讨论中提到的观点是正确的,但我确实认为本次讨论缺少这一点。用户需要安装其他所有东西,而是否需要额外安装cmake也不是大问题。我会更担心库,编译器工具链以及构建该软件所需的其他工具。
lanoxx

24

这与GNU编码标准无关。

自动工具(特别是与自动制作一起使用)的当前好处是,它们与构建Linux发行版很好地集成在一起。

以cmake为例,它始终是“我需要的-DCMAKE_CFLAGS或-DCMAKE_C_FLAGS吗?” 不,两者都不是,它是“ -DCMAKE_C_FLAGS_RELEASE”。或-DCMAKE_C_FLAGS_DEBUG。令人困惑-在autoconf中,它只是./configure CFLAGS =“-O0 -ggdb3”而您拥有它。

与构建基础架构集成时,scons存在无法使用的问题make %{?_smp_mflags}_smp_mflags在这种情况下,这是一个RPM宏,它可以粗略地扩展为(管理员可以设置)系统电源。人们在整个环境中放置了-jNCPUS之类的东西。使用scons无法正常工作,因此使用scons的软件包可能只会在发行版中进行序列化。


8
+1,如果这是真的,那么世界将会变得更美好。令人遗憾的是, ./configure CFLAGS=-O0经常失败的软件包会覆盖makefile中的CFLAGS并要求用户run ./configure --enable-debug。(例如tmux)。
William Pursell 2014年

2
它没有Autotools那样令人困惑,并且正如William正确指出的那样,它在makefile中被错误地用CFLAGS =“ <foo>”构架了。很简单,这是那些“旧锯”物品中的另一个。并且CMake示例是伪造的...再次...如果您未指定RELEASE或DEBUG,则可以执行第一个示例。失败。
斯瓦尔塔夫

17

关于Autotools的重要信息是它们不是通用的构建系统-它们实现GNU编码标准,仅此而已。如果您要制作一个符合所有GNU标准的软件包,那么Autotools是一项出色的工作工具。如果不这样做,则应使用Scons或CMake。(例如,请参阅此问题。)这种常见的误解是大多数Autotools沮丧的根源。


11
您可以在Automake AUTOMAKE_OPTIONS = -foreign中禁用GNU标准Makefile.am。(或者-foreign在您的autogen.sh。我想几乎每个人都使用它。)
Dietrich Epp

9
是的,但这仅控制Automake是否强制执行表面GNU规则,例如是否需要README文件。它不会改变使用诸如installcheck和规则构建GNU样式的tarball的基本前提distclean。如果您在仍然使用Autotools的情况下尝试更改这种行为,那么您就是在浪费时间。
ptomato

1
它们(理论上)允许以完全相同的方式构建和安装所有软件包。
ptomato

从理论上讲,它们使您可以比其他工具更适当地处理BROKEN编译器和OS,并应用诸如@ptomato这样的浅层规则。如果您使用的是现代(GCC说铛或...的例子)工具在现代操作系统没有什么冷笑话,说Linux或电流* BSD,你不NEED的有“规矩”。实际上,它们确实为交叉编译带来了很多工作,而且无济于事。如今,几乎所有使用率的一半都用于嵌入式Linux和* BSD。为什么要处理无法帮助您的事情?
斯瓦尔塔夫

由于您似乎在评论中承认了该答案,因此不确定为什么您对答案不满意?
番茄

9

尽管从开发人员的角度来看,cmake当前是最易于使用的,但从用户角度来看,自动工具具有一个很大的优势

autotools会生成一个文件配置脚本,所有要生成它的文件都随发行版一起提供。在grep / sed / awk / vi的帮助下很容易理解和修复。将此与Cmake进行比较,在/ make / usr / share / cmak * / Modules中可以找到很多文件,除非用户具有管理员访问权限,否则无法修复该文件。

因此,如果某些事情行不通,通常可以使用大锤方式轻松地通过使用标准Unix工具(grep / sed / awk / vi等)“修复”,而无需了解构建系统。

您是否曾经浏览过cmake构建目录以找出问题所在?与可以从上到下读取的简单shellscript相比,跟踪生成的Cmake文件以查找正在发生的情况非常困难。同样,对于CMake,改编FindFoo.cmake文件不仅需要CMake语言知识,而且还可能需要超级用户特权。


7
与CMake相比,我认为Autotools的问题无法“轻松解决” ...
sleske

7
因为自动工具是一个复杂的系统(就像CMake一样)。如果您认为Autotools是“容易修复的”(可能会有理由认为),恕我直言,最好在答案中解释以哪种方式更容易解决问题。
sleske

5
autotools会生成一个文件配置脚本,所有要生成它的文件都随发行版一起提供。在grep / sed / awk / vi的帮助下很容易理解和修复。将此与Cmake进行比较,在/ make / usr / share / cmak * / Modules中可以找到很多文件,除非用户具有管理员访问权限,否则无法修复该文件。您是否曾经浏览过cmake构建目录以找出问题所在?相比于简单的shell脚本可以从上往下读,继生成cmake的文件,找出到底是怎么回事是相当困难
arved

2
是的,这很感激,谢谢。我随意将其添加到您的答案中。随时恢复:-)。
sleske

1
您始终可以使用自己的本地版本的cmake。没有理由使用系统级别的安装程序。对于任何从事跨平台工作的人来说,这是完全正常的。这肯定是我大部分时间使用cmake的方式。
詹姆斯·摩尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.