为什么使用像Autotools这样的构build工具,我们可以编写自己的makefile?
最近,我把我的开发环境从Windows切换到了Linux。 到目前为止,我只用Visual Studio进行C ++开发,所以很多概念,比如make和Autotools ,对我来说都是新的。 我已经阅读了GNU makefile文档,并得到了几乎一个想法。 但是我对Autotools感到困惑。
据我所知,makefile用于使构build过程更容易。
- 为什么我们需要像Autotools这样的工具来创buildmakefile? 由于所有人都知道如何创build一个makefile,所以我没有真正使用Autotools。
- 标准是什么? 我们是否需要使用这样的工具,或只是手写的makefiles呢?
你在这里谈论两个分开但交织在一起的东西:
- 自动工具
- GNU编码标准
在Autotools中,你有几个项目:
- Autoconf的
- Automake的
- Libtool程序
我们来看看每一个人。
Autoconf的
Autoconf轻松扫描现有的树来查找它的依赖关系,并创build一个configuration脚本,可以运行在几乎任何types的shell下。 configuration脚本允许用户控制构build行为(即--with-foo
,– --without-foo
,– --prefix
,– --sysconfdir
等)以及进行检查以确保系统能够编译程序。
configuration生成一个config.h
文件(从模板)哪些程序可以包含可移植性问题。 例如,如果HAVE_LIBPTHREAD
未定义,请改用fork。
我个人在许多项目上使用Autoconf。 通常需要一些时间习惯m4 。 但是,这确实节省了时间。
您可以使makefileinheritance一些configuration查找的值而不使用automake。
Automake的
通过提供一个简短的模板来描述将要构build的程序以及需要链接哪些对象来构build它们,可以自动创build符合GNU编码标准的Makefile。 这包括依赖性处理和所有必需的GNU目标。
有些人觉得这更容易。 我更喜欢写我自己的makefiles。
Libtool程序
Libtool是一个非常酷的工具,用于在任何类Unix系统上简化共享库的构build和安装。 有时我用它; 其他时候(特别是在build立静态链接对象的时候)我是用手做的。
还有其他选项,请参阅StackOverflow问题Autoconf和Autotools的替代方法? 。
总之,如果你把代码发布给大众,你真的应该使用某种可移植的构buildconfiguration系统。 你用什么取决于你。 已知GNU软件几乎可以构build并运行任何东西。 但是,您可能不需要遵守这样的(有时甚至是迂腐的)标准。
如果有的话,如果你正在为POSIX系统编写软件,我build议给Autoconf一个尝试。 如果您需要文档和方法链接,请更新您的问题。
编辑
不要害怕m4 :)总是有Autoconfmacros档案 。 大量的例子,或放弃支票。 写你自己的或使用什么testing。 Autoconf经常与Automake混淆。 他们是两个不同的东西。
首先,Autkeools不是一个不透明的构build系统,而是一个松耦合的工具链,正如tinkertim已经指出的那样。 我只是想在Autoconf和Automake上添加一些想法:
Autoconf是configuration系统,它根据应该在各种平台上工作的function检查来创buildconfiguration脚本。 在其存在的15年中,很多系统知识已经进入了m4macros观数据库。 一方面,我认为后者是Autotools还没有被别的东西取代的主要原因。 另一方面,当目标平台更加异构化时,Autoconf就显得尤为重要,必须支持Linux, AIX , HP-UX , SunOS ……以及各种不同的处理器架构。 如果您只想支持最新的Linux发行版和与Intel兼容的处理器,我真的不明白这一点。
Automake是GNU Make的一个抽象层,作为一个简单模板的Makefile生成器。 许多项目最终摆脱了Automake抽象,并且恢复为手动编写Makefiles,因为您失去了对Makefiles的控制,并且您可能不需要所有用于混淆Makefile的预制构build目标。
现在到替代scheme (我强烈build议根据您的要求selectAutotools):
CMake最显着的成就是取代了KDE中的 AutoTools。 如果你想拥有类似于Autoconf的function而没有m4的特性,那么它可能是最接近你的。 它将Windows支持带入了桌面,并已被certificate适用于大型项目。 我的牛肉与CMake是它仍然是一个Makefile生成器(至less在Linux上)的所有内在问题(如Makefiledebugging,时间戳签名,隐式依赖顺序)。
SCons是一个使用Python编写的替代品。 它使用Python脚本作为构build控制文件,允许非常复杂的技术。 不幸的是,它的configuration系统与Autoconf并不相同。 SCons经常用于内部开发,因为适应特定要求比遵循惯例更重要。
如果你真的想坚持使用Autotools,我强烈build议阅读Recursive Make Considered Harmful,并编写你自己的通过Autoconfconfiguration的GNU Makefile。
这里提供的答案是好的,但是如果你有类似于标准C / C ++项目的东西,我强烈build议你不要写下你自己的makefile的build议。 我们需要自动工具而不是手写makefile,因为automake生成的符合标准的makefile在众所周知的名字下提供了许多有用的目标,并且手动提供所有这些目标是枯燥且容易出错的。
首先,手工编写一个Makefile似乎是一个好主意,但是大多数人不会花费更多的时间去编写规则,安装或者干净。 automake会产生dist,distcheck,clean,distclean,卸载以及所有这些小帮手。 这些额外的目标是最终将安装您的软件的系统pipe理员的一大福音。
其次,以便携和灵活的方式提供所有这些目标是非常容易出错的。 我最近对Windows目标进行了大量的交叉编译,自动工具performance非常好。 与大多数手写文件相比,这些文件在编译时大都是一种痛苦。 请注意,可以手工创build一个好的Makefile。 但是不要高估自己,它需要很多关于一系列不同系统的经验和知识,automake会立即为您创build出色的Makefiles。
编辑:而不要试图使用“替代品” 。 CMake和朋友对于部署者来说是一个恐怖的东西,因为他们不是与configuration和朋友兼容的界面。 每个半途胜任的系统pipe理员或开发人员都可以完成诸如交叉编译或者简单的事情,比如设置一个前缀或者使用一个简单的configuration脚本。 但是你必须花一三个小时才能和BJam做这样的事情。 不要误解我的意思,BJam可能是一个很好的系统,但是使用它却是一个痛苦的工程,因为几乎没有使用它的项目,以及很less的和不完整的文档。 autoconf和automake在已有的知识方面拥有巨大的领先优势。
所以,即使我对这个问题的这个build议有点迟了:帮个忙, 使用autotools和automake。 语法可能有点奇怪,但是他们比99%的开发人员自己做的更好。
对于小型项目,甚至是只能在一个平台上运行的大型项目,手写makefile就是要走的路。
自动工具真正发光的地方是当你编译需要不同选项的不同平台时。 Autotools经常是典型背后的大脑
。/configuration
使
进行安装
编译和安装Linux库和应用程序的步骤。
也就是说,我发现autotools是一个痛苦,我一直在寻找一个更好的系统。 最近我一直在使用bjam,但也有它的缺点。 祝你好运,find适合你的东西。
需要自动工具,因为Makefile不能保证在不同的平台上工作。 如果你手写一个Makefile,并且它能在你的机器上运行,那很有可能它不在我的机器上。
你知道你的用户将使用什么unix? 甚至Linux的分布? 你知道他们想要安装软件吗? 你知道他们有什么工具,他们想要编译什么架构,他们有多lessCPU,可以使用多lessRAM和磁盘?
* nix世界是一个跨平台的环境,您的构build和安装工具需要处理这个问题。
请注意,汽车*工具来自早期的时代,而且对它们有许多有效的抱怨,但是用更现代的替代品替代它们的几个项目正在困难地发展出很多动力。
许多事情就像在*尼克斯世界。
我不觉得我是一个专家来回答这个问题,但仍然给我一个类似于我的经验。
因为在某种程度上它类似于我们为什么要用C语言(高级语言)编写embedded代码而不是用汇编语言编写。 两者都解决相同的目的,但后者更冗长,单调乏味,耗时且更容易出错(除非你知道处理器的ISA非常好)。 使用Automake工具并编写自己的makefile也是如此。 编写Makefile.am和configure.ac比编写单个的项目Makefile非常简单。