最近,我将开发环境从Windows切换到了Linux.到目前为止,我只使用Visual Studio进行C++开发,因此许多概念,如make和Autotools,对我来说都是新的.我已经阅读了GNU makefile文档并且几乎了解了它.但我对Autotools感到困惑.
据我所知,makefile用于简化构建过程.
为什么我们需要像Autotools这样的工具来创建makefile?由于所有人都知道如何创建一个makefile,我没有真正使用Autotools.
标准是什么?我们需要使用这样的工具还是手写的makefile呢?
Tim Post.. 79
你在谈论两个独立但交织在一起的东西:
自动工具
GNU编码标准
在Autotools中,您有几个项目:
Autoconf的
Automake的
Libtool程序
让我们分别看看每一个.
Autoconf的
Autoconf可以轻松扫描现有树以查找其依赖项,并创建一个可在几乎任何类型的shell下运行的配置脚本.配置脚本允许用户控制构建行为(即--with-foo
,--without-foo
,--prefix
,--sysconfdir
,等..),以及做检查,以确保系统能够编译程序.
配置生成一个config.h
文件(来自模板),程序可以包含该文件以解决可移植性问题.例如,如果HAVE_LIBPTHREAD
未定义,请改用叉.
我个人在许多项目中使用Autoconf.人们通常需要一些时间来习惯m4.但是,它确实节省了时间.
您可以让makefile继承一些配置查找的值,而无需使用automake.
Automake的
通过提供一个简短的模板来描述将构建哪些程序以及需要链接哪些对象来构建它们,可以自动创建符合GNU编码标准的Makefile.这包括依赖项处理和所有必需的GNU目标.
有些人觉得这很容易.我更喜欢写自己的makefile.
Libtool程序
Libtool是一个非常酷的工具,可以在任何类Unix系统上简化共享库的构建和安装.有时候我会用它; 其他时候(特别是在构建静态链接对象时)我手工完成.
还有其他选项,请参阅StackOverflow问题Autoconf和Autotools的替代品?.
构建自动化和GNU编码标准
简而言之,如果您向大众发布代码,您真的应该使用某种可移植的构建配置系统.你用的是由你自己决定的.众所周知,GNU软件可以在几乎任何东西上构建和运行.但是,您可能不需要遵守此类(有时极其迂腐)的标准.
如果有的话,如果您正在为POSIX系统编写软件,我建议您尝试使用Autoconf.仅仅因为Autotools生成的部分构建环境与GNU标准兼容并不意味着你必须遵循这些标准(很多都没有!):)还有很多其他的选择.
编辑
不要害怕m4 :)总有Autoconf宏存档.大量的例子,或支票下降.自己写或使用经过测试的.Autoconf经常与Automake混淆.它们是两个不同的东西.
你在谈论两个独立但交织在一起的东西:
自动工具
GNU编码标准
在Autotools中,您有几个项目:
Autoconf的
Automake的
Libtool程序
让我们分别看看每一个.
Autoconf的
Autoconf可以轻松扫描现有树以查找其依赖项,并创建一个可在几乎任何类型的shell下运行的配置脚本.配置脚本允许用户控制构建行为(即--with-foo
,--without-foo
,--prefix
,--sysconfdir
,等..),以及做检查,以确保系统能够编译程序.
配置生成一个config.h
文件(来自模板),程序可以包含该文件以解决可移植性问题.例如,如果HAVE_LIBPTHREAD
未定义,请改用叉.
我个人在许多项目中使用Autoconf.人们通常需要一些时间来习惯m4.但是,它确实节省了时间.
您可以让makefile继承一些配置查找的值,而无需使用automake.
Automake的
通过提供一个简短的模板来描述将构建哪些程序以及需要链接哪些对象来构建它们,可以自动创建符合GNU编码标准的Makefile.这包括依赖项处理和所有必需的GNU目标.
有些人觉得这很容易.我更喜欢写自己的makefile.
Libtool程序
Libtool是一个非常酷的工具,可以在任何类Unix系统上简化共享库的构建和安装.有时候我会用它; 其他时候(特别是在构建静态链接对象时)我手工完成.
还有其他选项,请参阅StackOverflow问题Autoconf和Autotools的替代品?.
构建自动化和GNU编码标准
简而言之,如果您向大众发布代码,您真的应该使用某种可移植的构建配置系统.你用的是由你自己决定的.众所周知,GNU软件可以在几乎任何东西上构建和运行.但是,您可能不需要遵守此类(有时极其迂腐)的标准.
如果有的话,如果您正在为POSIX系统编写软件,我建议您尝试使用Autoconf.仅仅因为Autotools生成的部分构建环境与GNU标准兼容并不意味着你必须遵循这些标准(很多都没有!):)还有很多其他的选择.
编辑
不要害怕m4 :)总有Autoconf宏存档.大量的例子,或支票下降.自己写或使用经过测试的.Autoconf经常与Automake混淆.它们是两个不同的东西.
首先,Autotools不是一个不透明的构建系统,而是一个松散耦合的工具链,正如tinkertim已经指出的那样.让我在Autoconf和Automake上添加一些想法:
Autoconf是一个配置系统,它根据应该在各种平台上运行的功能检查来创建配置脚本.在其存在的15年中,许多系统知识已经进入其m4宏数据库.一方面,我认为后者是Autotools尚未被其他东西取代的主要原因.另一方面,当目标平台更加异构并且必须支持Linux,AIX,HP-UX,SunOS ......以及各种不同的处理器体系结构时,Autoconf过去更为重要.如果您只想支持最新的Linux发行版和Intel兼容处理器,我真的不明白这一点.
Automake是GNU Make的抽象层,可以从更简单的模板中充当Makefile生成器.许多项目最终摆脱了Automake抽象并恢复为手动编写Makefile,因为您失去了对Makefile的控制权,并且您可能不需要所有混淆Makefile的固定构建目标.
现在到了替代方案(我强烈建议根据您的要求替代Autotools):
CMake最显着的成就是取代了 KDE中的 AutoTools.如果您希望在没有m4特性的情况下拥有类似Autoconf的功能,那么它可能是您最接近的.它为桌面带来了Windows支持,并且已经证明适用于大型项目.我对CMake的看法是,它仍然是一个Makefile生成器(至少在Linux上)及其所有内在问题(例如Makefile调试,时间戳签名,隐式依赖顺序).
SCons是一个用Python编写的Make替换.它使用Python脚本作为构建控制文件,允许非常复杂的技术.不幸的是,它的配置系统与Autoconf不相上下.当适应特定要求比以下惯例更重要时,SCons通常用于内部开发.
如果你真的想坚持使用Autotools,我强烈建议阅读Recursive Make Considered Harmful并编写你自己的GNU Makefile通过Autoconf配置.
这里已经提供的答案很好,但是如果你有类似标准的C/C++项目的话,我强烈建议你不要自己编写自己的makefile.我们需要autotools而不是手写的makefile,因为automake生成的符合标准的makefile在众所周知的名称下提供了许多有用的目标,并且手动提供所有这些目标是繁琐且容易出错的.
首先,手工编写Makefile似乎是一个好主意,但大多数人都不会费心去编写所有规则,安装和清理.automake生成dist,distcheck,clean,distclean,uninstall以及所有这些小帮手.这些额外的目标对于最终将安装您的软件的系统管理员来说是一个很大的好处.
其次,以便携和灵活的方式提供所有这些目标非常容易出错.我最近对Windows目标做了很多交叉编译,而autotools的表现非常好.与大多数手写文件形成对比,这些文件大多是编译时的痛苦.你要知道,它是可以手动创建一个良好的Makefile.但是不要高估自己,它需要大量的经验和关于一堆不同系统的知识,而且automake可以立即为您创建出色的Makefile.
编辑:不要试图使用"替代品".CMake和朋友对部署者来说是一种恐怖,因为它们与配置和朋友不兼容接口.每个中途胜任的系统管理员或开发人员都可以做很棒的事情,比如交叉编译或简单的事情,比如设置一个前缀,或者用一个简单的 - help配置脚本.但是当你不得不和BJam做这些事情时,你会花一两个小时的时间.不要误会我的意思,BJam可能是一个很好的系统,但是使用它是一件痛苦的事情,因为几乎没有项目使用它,而且文档很少和不完整.autoconf和automake在知识方面具有巨大的领先优势.
所以,即使我对这个问题的建议有点迟了:帮自己一个忙,并使用autotools和automake.语法可能有点奇怪,但它们比99%的开发人员自己做得更好.
对于小型项目甚至是仅在一个平台上运行的大型项目,手写的makefile是可行的方法.
autotools真正发挥作用的地方在于为不同平台编译需要不同选项的时候.Autotools通常是典型的背后的大脑
./配置
使
make install
Linux库和应用程序的编译和安装步骤.
也就是说,我发现autotools很痛苦,我一直在寻找一个更好的系统.最近我一直在使用bjam,但这也有它的缺点.祝你找到适合自己的东西.
你知道你的用户将使用哪些unix吗?甚至是Linux的哪个发行版?你知道他们想要在哪里安装软件吗?你知道他们有什么工具,他们想要编译什么架构,他们有多少CPU,有多少RAM和磁盘可供他们使用?
*nix世界是一个跨平台的环境,您的构建和安装工具需要处理它.
请注意,auto*工具可以追溯到更早的时代,并且有许多关于它们的有效投诉,但是用更现代的替代方案替换它们的几个项目却难以发展出很多动力.
在*nix世界中有很多东西.
需要Autotools,因为不保证Makefile在不同平台上的工作方式相同.如果你手写一个Makefile,它可以在你的机器上运行,很有可能它不会在我的机器上运行.