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

时间:2010-11-01 18:29:47

标签: build cmake scons autotools build-system

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

5 个答案:

答案 0 :(得分:171)

事实上,Autotools'只有真正的拯救恩惠'这就是所有GNU项目在很大程度上使用的原因。

Autotools的问题:

  • 真正的ARCANE m4宏语法结合详细,扭曲的shell脚本,用于测试"兼容性"等。
  • 如果您没有注意, 搞乱交叉编译能力(它 应该清楚地注意到,诺基亚想出了Scratchbox / Scratchbox2,以便为Maemo / Meego的 高度 打破Autotools构建设置。)如果您出于任何原因,已经修复,测试中的静态路径,您将打破交叉编译支持,因为它不会尊重您的sysroot规范,并且会从您的主机系统中提取内容。如果您破坏了交叉编译支持,它会使您的代码无法使用 OpenEmbedded,让它变得有趣"对于试图在交叉编译器上而不是在目标上构建版本的发行版。
  • 对于那些 NOBODY 的古老,破碎的编译器目前使用的大量测试是否适用于当今时代的任何生产。除非您在真正的 古老 版本的Solaris,AIX等上构建类似glibc,libstdc ++或GCC的东西,否则测试是浪费时间并且是上面提到的许多潜在破坏的来源。
  • 使用Autotools设置为Windows系统构建可用代码几乎是一种痛苦的经历。 (虽然我很少使用Windows,但如果您正在开发据称的跨平台代码,那么这是一个严重的问题。)
  • 当它中断时,您将花费 HOURS 追逐您的尾巴,试图找出编写脚本错误的东西来理清您的构建(事实上,这就是我正在尝试做的事情(或者更确切地说,完全撕掉Autotools) - 我怀疑在这个月剩下的时间里有足够的时间来解决这个问题......因为我正在打字,所以现在正在工作.Apache Thrift有一个不会交叉编译的 BROKEN 构建系统。)
  • " normal"用户实际上 NOT 只是做" ./ configure; make" - 对于很多事情,他们将会提取某人提供的包,例如PPA或他们的分销商。 "正常"用户不是开发人员,在很多情况下都不会抓住tarball。对于每个人而言,这是势不可挡的,因为他们认为那将是一个例子。 tarball的典型用户是devs正在做事情,所以如果它们在那里就会受到破坏的打击。

它的工作原理......大部分时间......你可以说Autotools。它是一个解决几个问题的系统,它只涉及GNU项目...它们的基础核心工具链代码。 (编辑(2014年5月24日):应该注意的是,这种类型的担忧是一个潜在的 BAD 令人担忧的事情 - Heartbleed部分源于这种思想和使用正确的现代系统, 真的 没有任何业务处理Autotools纠正的大部分内容.GNU可能需要对代码库进行彻底删除,根据Heartbleed发生的事情)您可以使用它来完成您的项目,它可以很好地用于一个小型项目,除了Linux或GNU工具链显然正常工作之外,您不希望在任何地方工作。声明它与Linux"很好地集成在一起。是 相当 粗体陈述,而 不正确 。它与GNU工具套件相当好地集成,并解决了IT对其目标的影响。

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

SCons更像是Make / GMake / etc的替代品。并且看起来很不错,所有事情都考虑了但是......

  • 它仍然是一个仅限POSIX的工具。你可能更容易让MinGW使用Autotools来构建Windows的东西,但它仍然更适合做POSIX的东西而且你需要安装Python SCons使用它。
  • 除非您使用Scratchbox2之类的东西,否则它会进行交叉编译。
  • 从他们自己的比较来看,比CMake更慢,更不稳定。与SCons相比,他们提出了半心半意(POSIX方需要make / gmake来构建......)。 (顺便说一句,如果您需要 THAT 比其他解决方案具有更大的可扩展性,那么您应该问自己,您的项目是否过于复杂...... )

在这个帖子中给出CMake的例子有点虚伪。

...然而

  • 您需要学习一门新语言。
  • 如果你习惯使用Make,SCons或Autotools,那就有反直觉的东西。
  • 您需要在您正在构建的系统上安装CMake。
  • 如果您没有预先构建的二进制文件,那么您需要一个可靠的C ++编译器。

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

  • 您是否需要处理已损坏工具链的 LOT 以生成有效的工作二进制文件?如果是,您可能需要考虑Autotools,了解我上面提到的缺点。 CMake可以应对很多这方面的问题,但它比Autotools所担心的要少。可以扩展SCons以担心它,但它不是一个开箱即用的答案。
  • 您是否需要担心Windows目标?如果是这样,Autotools应该完全没有运行。如果是这样,SCons可能/可能不是一个好的选择。如果是这样,CMake是一个不错的选择。
  • 您是否需要担心交叉编译(通用应用程序/库,Google Protobufs,Apache Thrift等等 应该 关心这个... 。)?如果是这样,只要您不需要担心Windows,Autotools 可能会 为您工作,但您将花费大量时间维护你的配置系统随着事情发生变化。除非您使用Scratchbox2,否则SCons目前几乎是不合适的 - 它实际上没有处理交叉编译,您将需要使用该可扩展性并维护它与Automake一样的方式。如果是这样,您可能需要考虑CMake,因为它支持交叉编译,而不会有太多关于泄漏沙箱的担忧,并且可以使用/不使用Scratchbox2,并且可以很好地集成 < / strong>使用像OpenEmbedded这样的东西。

有很多项目正在放弃qmake,Autotools等,并转向CMake。到目前为止,我可以清楚地期望基于CMake的项目要么进入交叉编译情况,要么进入VisualStudio设置,或者只需要少量清理,因为项目不考虑仅限Windows或OSX-只是代码库的一部分。我无法真正期待基于SCons的项目 - 而且我完全希望1/3或更多Autotools项目能够 SOMETHING 错误,从而无法构建除了主机构建一个或Scratchbox2之外的任何上下文。

答案 1 :(得分:62)

必须在谁使用工具之间做出重要区分。 Cmake是用户在构建软件时必须使用的工具。 autotools用于生成分发tarball,可以仅使用任何符合SuS标准的系统上提供的标准工具来构建软件。换句话说,如果要从使用autotools构建的tarball安装软件,则不使用autotools 。另一方面,如果您正在安装使用Cmake的软件,那么 使用Cmake并且必须安装它才能构建软件。

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

答案 2 :(得分:23)

这与GNU编码标准无关。

autotools的当前优势 - 特别是与automake一起使用时 - 是它们与构建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的软件包可能只能在发行版中进行连续编译。

答案 3 :(得分:17)

了解Autotools的重要之处在于它们不是一般的构建系统 - 它们实现了GNU编码标准,而不是其他任何东西。如果你想制作一个符合所有GNU标准的软件包,那么Autotools就是一个很好的工具。如果你不这样做,那么你应该使用Scons或CMake。 (例如,请参阅this question。)这种常见的误解是Autotools的大部分挫败感来自。

答案 4 :(得分:6)

从开发人员的角度来看,cmake目前最容易使用,从用户角度来看autotools有一大优势

autotools生成单个文件配置脚本,生成它的所有文件随分发一起提供。在grep / sed / awk / vi的帮助下,它很容易理解和修复。将此与Cmake进行比较,其中在/ usr / share / cmak * / Modules中找到了大量文件,除非他具有管理员权限,否则用户无法修复这些文件。

所以,如果某些东西不能正常工作,通常可以很容易地修复&#34;通过大锤方式使用标准Unix工具(grep / sed / awk / vi等)而无需理解构建系统。

你有没有挖过你的cmake构建目录来找出问题所在?与可以从上到下读取的简单shellcript相比,在生成的Cmake文件之后找出正在发生的事情是非常困难的。另外,使用CMake,调整FindFoo.cmake文件不仅需要了解CMake语言,还需要超级用户权限。