Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Build Autotools、Cmake和Scons之间有什么区别?_Build_Cmake_Scons_Autotools_Build System - Fatal编程技术网

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

Build Autotools、Cmake和Scons之间有什么区别?,build,cmake,scons,autotools,build-system,Build,Cmake,Scons,Autotools,Build System,Autotools、Cmake和Scons之间有什么区别 了解Autotool很重要的一点是,Autotool不是一个通用的构建系统-它们实现GNU编码标准,而不是其他任何东西。如果您想制作一个符合所有GNU标准的软件包,那么Autotools是一个很好的工具。如果你没有,那么你应该使用烤饼或CMake。(例如,请参阅。)这种常见的误解是Autotools最令人沮丧的原因。这与GNU编码标准无关 autotools当前的好处——特别是当与automake一起使用时——是它们与构建Linux发行版

Autotools、Cmake和Scons之间有什么区别

了解Autotool很重要的一点是,Autotool不是一个通用的构建系统-它们实现GNU编码标准,而不是其他任何东西。如果您想制作一个符合所有GNU标准的软件包,那么Autotools是一个很好的工具。如果你没有,那么你应该使用烤饼或CMake。(例如,请参阅。)这种常见的误解是Autotools最令人沮丧的原因。

这与GNU编码标准无关

autotools当前的好处——特别是当与automake一起使用时——是它们与构建Linux发行版非常好地集成

以cmake为例,它总是“我需要的是-DCMAKE\u CFLAGS还是-DCMAKE\u C\u标志?”不,两者都不是,而是“-DCMAKE\u C\u标志\u发布”。或-DCMAKE\u C\u FLAGS\u DEBUG。这很让人困惑-在autoconf中,它只是./configure CFLAGS=“-O0-ggdb3”,您就有了它


在与构建基础架构集成时,scons存在一个问题,即您不能使用
make%{?\u smp\u mflags}
\u smp\u mflags
,在这种情况下,它是一个RPM宏,大致扩展到(管理员可以设置)系统电源。人们通过他们的环境将-jNCPUS之类的东西放在这里。由于SCON不起作用,因此使用SCON的软件包可能只能在发行版中序列化内置。

必须对使用这些工具的用户进行重要区分。Cmake是用户在构建软件时必须使用的工具。自动工具用于生成分发tarball,该分发tarball可用于仅使用任何符合SuS的系统上可用的标准工具构建软件。换句话说,如果您是从使用autotools构建的tarball安装软件,则您不是在使用autotools。另一方面,如果您正在安装使用Cmake的软件,那么您正在使用Cmake,并且必须安装它才能构建软件


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

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

自动工具的问题:

  • 真正神秘的m4宏语法与冗长、扭曲的shell脚本相结合,用于测试“兼容性”等
  • 如果你不注意,你会把交叉编译的能力搞得一团糟 应该清楚地注意到,诺基亚推出了Scratchbox/Scratchbox2,以侧步高度为Maemo/Meego构建损坏的自动工具设置。)如果出于任何原因,您在测试中有固定的静态路径,您将打破交叉编译支持,因为它不会遵守您的sysroot规范,并且会从主机系统中提取内容。如果您破坏了交叉编译支持,那么您的代码将无法用于以下情况: OpenEmbedded并使试图在交叉编译器而不是目标编译器上构建发行版的发行版变得“有趣”
  • 对古老的、破烂的编译器进行大量测试,这些编译器在当今时代几乎没有人使用。除非您在真正古老的版本的Solaris、AIX或诸如此类的平台上构建glibc、libstdc++或GCC之类的东西,否则这些测试都是浪费时间,并且是上述许多潜在故障的根源
  • 使用Autotools设置为Windows系统构建可用代码是一种非常痛苦的经历。(虽然我很少使用Windows,但如果您正在开发据称是跨平台的代码,这将是一个严重的问题。)
  • 当它崩溃时,你将花费数小时追根究底,试图找出编写脚本的人出错的地方来整理你的构建(事实上,这正是我试图做的(或者,更确切地说,完全删除自动工具-我怀疑这个月剩下的时间是否有足够的时间来整理混乱…)在我输入这篇文章的时候,我现在就开始工作了。Apache Thrift有一个坏掉的构建系统,它不会交叉编译。)
  • “普通”用户实际上并不打算只做“/configure;make”-对于许多事情,他们将从PPA或其分销供应商那里获取某人提供的软件包。“普通”用户不是开发人员,在很多情况下不会抓取柏油球。这是每个人的势利,因为他们认为那里会出现这种情况。tarball的典型用户是开发人员,他们正在做一些事情,所以如果它存在的话,他们会被打断
它很有效……大多数时候……这是关于自动工具的所有说法。这是一个系统,它解决了几个真正与GNU项目有关的问题……它们的基础、核心工具链代码。(编辑:2014年5月24日):需要注意的是,这种类型的担忧可能是一件不好的事情,值得担心-心脏出血部分源于这种想法,并且有了正确的现代系统,你真的没有任何业务处理Autotools纠正的大部分问题。GNU可能需要做一个cod的去除工作ebase,根据Heartbleed的情况)你可以用它来做你的项目,它可能会很好地用于一个你不希望在任何时候都能工作的小项目