Autotools,Cmake和Scons之间有什么区别?
答案 0 :(得分:171)
事实上,Autotools'只有真正的拯救恩惠'这就是所有GNU项目在很大程度上使用的原因。
Autotools的问题:
它的工作原理......大部分时间......你可以说Autotools。它是一个解决几个问题的系统,它只涉及GNU项目...它们的基础核心工具链代码。 (编辑(2014年5月24日):应该注意的是,这种类型的担忧是一个潜在的 BAD 令人担忧的事情 - Heartbleed部分源于这种思想和使用正确的现代系统, 真的 没有任何业务处理Autotools纠正的大部分内容.GNU可能需要对代码库进行彻底删除,根据Heartbleed发生的事情)您可以使用它来完成您的项目,它可以很好地用于一个小型项目,除了Linux或GNU工具链显然正常工作之外,您不希望在任何地方工作。声明它与Linux"很好地集成在一起。是 相当 粗体陈述,而 不正确 。它与GNU工具套件相当好地集成,并解决了IT对其目标的影响。
这并不是说线程中讨论的其他选项没有问题。
SCons更像是Make / GMake / etc的替代品。并且看起来很不错,所有事情都考虑了但是......
在这个帖子中给出CMake的例子有点虚伪。
...然而
事实上,你的目标应该决定你在这里选择什么。
有很多项目正在放弃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)
autotools生成单个文件配置脚本,生成它的所有文件随分发一起提供。在grep / sed / awk / vi的帮助下,它很容易理解和修复。将此与Cmake进行比较,其中在/ usr / share / cmak * / Modules中找到了大量文件,除非他具有管理员权限,否则用户无法修复这些文件。
所以,如果某些东西不能正常工作,通常可以很容易地修复"通过大锤方式使用标准Unix工具(grep / sed / awk / vi等)而无需理解构建系统。
你有没有挖过你的cmake构建目录来找出问题所在?与可以从上到下读取的简单shellcript相比,在生成的Cmake文件之后找出正在发生的事情是非常困难的。另外,使用CMake,调整FindFoo.cmake文件不仅需要了解CMake语言,还需要超级用户权限。