Sva*_*alf 178

事实上,Autotools唯一真正的"拯救恩典"就是所有GNU项目都在大量使用.

Autotools的问题:

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

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

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

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

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

在这个帖子中给出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之类的东西,并且可以很好地与OpenEmbedded之类的东西集成.

很多很多项目都放弃了qmake,Autotools等,然后转向CMake.到目前为止,我可以干净地期望基于CMake的项目要么进入交叉编译情况,要么进入VisualStudio设置,或者只需要少量清理,因为项目不考虑仅限Windows或仅支持OSX的部分到代码库.我不能指望基于SCons的项目 - 而且我完全期望1/3或更多的Autotools项目会导致SOMETHING错误,从而阻止它在任何上下文中构建,除了主机构建一个或Scratchbox2之外.

  • 提到Heartbleed的部分减损了这种沮丧的咆哮.问题在于OpenSSL没有使用配置器类型包来检测破坏的malloc,而是重新实现系统库并且击败了生成库的平台开发人员,这些库可以更快地检测到漏洞.移植程序的一个原因是它们变得更高质量,因为它们更少依赖于那些你没有意识到你正在制造的小假设 (11认同)
  • 问题是它根本不会减损它.使用Autotools,你会担心补偿那样的东西 - 那些重新实现是一种扩展的想法.把它提升到一个新的水平.你应该从那个背景中看到它......在这一点上它根本不会减损它.你没有在你的推理中指出根本原因 - 只是发生了什么.我正在指责与Shellshock以及其他一些类似的东西带来的确切思考.如果它坏了,你应该修复它.如果你不能 - 你应该问为什么要坚持下去. (6认同)
  • [与其他讨厌的编程工具不同](http://www.amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/0596517742),没有足够的资料来制作一本名为"CMake,好"的书部分"(可能是小册子或博客文章),它更像是一个糟糕设计的分形而不是[PHP](http://eev.ee/blog/2012/04/09/php-a-fractal-of-糟糕的设计/). (5认同)
  • 我不怀疑autotools和scons很糟糕,但这个答案在注意CMake(我首选的构建系统,只是因为构建系统非常非常悲伤的状态)的缺点方面表现不佳.基本上,CMake是一种与内部支持单个边缘情况不一致的分形,而不是处理大多数事情的一些核心抽象.这绝对是编程的胶带和挽救线.我确定我做错了什么,但它不支持VisualStudio,除非你发现每个CMakeLists.txt可以接受一个VS项目(我不是VS用户,但我的Winfriends告诉我这很糟糕). (4认同)
  • @JAB VS用户告诉我这不是惯用的.事实上,CMake被替换为我们项目的构建系统,因为没有人能够弄清楚如何生成所谓的"惯用"VS项目文件. (2认同)
  • 这是一项(主要)改进,但我向您保证,这不是灵丹妙药,基于我在 WIP 尝试恢复 EFL 元数据层以实现元开放嵌入式包含。它的交叉编译功能可以正确处理 GCC 之类的事情,但是如果您需要内容生成器(EFL 可以...),您需要考虑指定替代项。EFL 没有考虑到它,E 也没有考虑到每个项目的 Meson 构建设置,所以我坚持使用 OLD Autotools,它是少数没有以奇怪的方式完全损坏的工具之一。 (2认同)

Wil*_*ell 67

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

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

  • 确实有很多项目要求人们使用VCS来获取最新版本,但这只适合开发人员.不幸的是,许多用户无法理解发布tarball和VCS之间的区别.尝试从VCS构建会产生更多依赖关系.用户可能需要`asciidoc`或`help2man`或`doxygen`,或者更重要的是,需要正确的autotool组合.这对于autotools来说是一个巨大的营销问题.用户错误地认为他们需要安装autoconf,因为他们不了解tarball和VCS之间的区别. (13认同)
  • 没错,虽然你觉得使用VCS分发软件听起来很糟糕.如果结帐或克隆的内容与tarball的内容相同,为什么要推荐tarball? (5认同)
  • @Toor我不明白你的问题.我工作的所有项目都产生了一个与VCS结账不同的tarball.保持两个明显的帮助与可靠的分配. (5认同)
  • 为什么项目不能为常见平台分发Cmake的输出,项目文件和Makefile,例如Win,Linux和MacOSX?它似乎与lex/yacc工具相同,你包含了genarated C代码,所以它可以在没有工具的平台上构建 (3认同)
  • 虽然我认为本次讨论中提到的要点是正确的,但我确实认为这一讨论缺乏重点.用户需要安装大量其他东西,无论他是否需要安装cmake应该不是一个大问题.我更担心库,编译器工具链以及构建软件所需的其他工具. (3认同)
  • 加入讨论有点晚了,但是你要清楚地说明了**对CMake的最大吸引力在于,软件包依赖于安装了CMake的用户**.对我来说听起来像是一个交易破坏者.我最近因为各种原因从autotools切换到CMake,并且从那时起就试图找到一种方法来创建一个包含源代码,特定于目标的Makefile以及可选的预构建二进制文件的包.并且CMake没有办法做到这一点. (3认同)
  • [相关答案](https://askubuntu.com/a/951890/374117),因为误解了Autotools的用途以及如何/何时使用它们. (2认同)
  • 关于你最新的讽刺评论;这次谈话是一台时间机器。这是7年前的事了。而且我不再关注构建工具,因为我不再做任何打包工作。如果 CMake 适合您进行交叉编译,那就太好了。用它。并注意你正在使用它。不确定您的抱怨是什么,但您可能需要考虑愤怒管理疗法。 (2认同)

use*_*515 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的软件包可能只能在发行版中进行连续编译.

  • CFLAGS =" - g"cmake $ {SRC_DIR}应该工作顺便说一句. (22认同)
  • +1,如果这是真的,世界将是一个更好的地方.遗憾的是,`./ configure CFLAGS = -O0`通常会在makefile中覆盖CFLAGS并且要求用户运行`./configure --enable-debug`.(例如`tmux`). (6认同)
  • 它并没有比Autotools更令人困惑,正如William正确地指出的那样,它在makefile中被错误地加入了CFLAGS ="<foo>"而被破坏了.很简单,这是另一个"旧锯"项目.并且CMake示例是伪造的......再次......如果你没有指定RELEASE或DEBUG,你可以先做第一个.失败. (2认同)

pto*_*ato 17

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

  • 可以在Automake中使用`Makefile.am`中的`AUTOMAKE_OPTIONS = -foreign`禁用GNU标准.(或者你的`autogen.sh`中的`-foreign`.我想几乎每个人都使用它.) (11认同)
  • 是的,但这仅控制Automake是否强制执行表面GNU规则,例如是否需要README文件.它并没有改变使用`installcheck`和`distclean`等规则构建GNU样式tarball的基本前提.如果您在使用Autotools的同时尝试改变这种行为,那么您只是在浪费时间. (9认同)

arv*_*ved 9

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

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

因此,如果某些东西不能正常工作,通常可以通过使用标准Unix工具(grep/sed/awk/vi等)以大锤方式轻松"修复",而无需了解构建系统.

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

  • 与CMake相比,我不认为Autotools的问题"容易修复"...... (5认同)
  • 因为autotools是一个复杂的系统(就像CMake一样).如果您认为Autotools"容易修复"(可能有想法的话),那么恕我直言,在答案中解释问题更容易解决的问题. (5认同)
  • autotools生成单个文件配置脚本,生成它的所有文件随分发一起提供.在grep/sed/awk/vi的帮助下,它很容易理解和修复.将此与Cmake进行比较,其中在/ usr/share/cmak*/Modules中找到了大量文件,除非用户具有管理员权限,否则用户无法修复这些文件.你有没有挖过你的cmake构建目录来找出问题所在?与可以从上到下读取的简单shellcript相比,在生成的Cmake文件之后找出正在发生的事情是相当困难的 (5认同)
  • 是的,这很感激,谢谢。我随意将其添加到您的答案中。随时恢复:-)。 (2认同)
  • 您始终可以使用自己的本地版本的 cmake;没有理由使用在系统级别安装的内容。对于任何从事跨平台工作的人来说,这是完全正常的;这当然是我大部分时间使用 cmake 的方式。 (2认同)