GNU Autotools简介

您是否曾经下载过流行的软件项目的源代码,而该项目却要求您键入几乎符合惯例的./configure文件; make && make install命令序列来构建和安装吗? 如果是这样,则您已经使用了GNU Autotools 。 如果您曾经研究过此类项目随附的一些文件,那么您可能会对这种构建系统的表面复杂性感到恐惧。

好消息! GNU Autotools的设置比您想象的要简单得多,并且GNU Autotools本身可以为您生成这些1,000行的配置文件。 是的,您可以编写20或30行安装代码,并免费获得另外4,000行。

工作中的自动工具

在Linux上安装应用程序

对于开发人员来说,Autotools是一种快速简便的方法来管理和打包源代码,以便用户可以编译和安装软件。 Autotools也得到主要打包格式(例如DEB和RPM)的良好支持,因此软件存储库的维护人员可以轻松地准备使用Autotools构建的项目。

自动工具分阶段工作:

  1. 首先,在./configure步骤中,Autotools扫描主机系统(运行它的计算机)以发现默认设置。 默认设置包括支持库的位置以及系统上应放置新软件的位置。
  2. 接下来,在制作步骤中,Autotools通常通过将人类可读的源代码转换为机器语言来构建应用程序。
  3. 最后,在make install步骤中,Autotools将其生成的文件复制到计算机上的适当位置(在配置阶段检测到)。

只要您使用Autotools,此过程就很简单。

Autotools的优势

GNU Autotools是我们大多数人认为理所当然的重要软件。 与GCC(GNU编译器集合)一起 ,Autotools是可以构建自由软件并将其安装到正在运行的系统的支架。 如果您正在运行POSIX系统,则可以肯定地说,由于这些项目,大多数操作系统作为计算机上的可运行软件存在。

如果您的宠物项目不是操作系统,则您可能会认为Autotools过于适合您的需求。 但是,尽管享有盛誉,但即使您的项目是一个相对简单的应用程序或一系列脚本,Autotools仍具有许多可能使您受益的小功能。

可移植性

首先,Autotools考虑了可移植性。 尽管它不能使您的项目在所有POSIX平台上都能工作(由您决定,作为编码人员),但Autotools可以确保将标记为要安装的文件安装到已知平台上最合适的位置。 而且由于有了Autotools,对于高级用户而言,根据他们自己的系统自定义和覆盖任何非最佳值是很简单的。

使用Autotools,您只需要将哪些文件安装到一般位置即可。 它会照顾其他一切。 不再有任何未经测试的操作系统中断的自定义安装脚本。

打包

Autotools也得到了很好的支持。 无论是使用RPM,DEB,TGZ还是其他任何包装,将带有Autotools的项目移交给发行发行打包程序,它们的工作很简单。 打包工具了解Autotools,因此可能没有必要进行修补,修改或调整。 在许多情况下,甚至可以将Autotools项目整合到管道中。

如何使用自动工具

要使用Autotools,必须首先安装Autotools。 您的发行版可能提供一个软件包来帮助开发人员构建项目,或者可能为每个组件提供单独的软件包,因此您可能必须在平台上进行一些研究以发现需要安装哪些软件包。

Autotools的主要组件是:

  • 自动制作
  • 自动配置
  • 使

尽管您可能需要安装项目所需的编译器(例如GCC),但Autotools可以很好地与不需要编译的脚本或二进制资产一起使用。 实际上,Autotools对于此类项目很有用,因为它提供了易于卸载make卸载脚本。

一旦安装了所有组件,就可以查看项目文件的结构了。

Autotools项目结构

GNU Autotools有非常具体的期望,如果您经常下载和构建源代码,其中的大多数可能会很熟悉。 首先,源代码本身应位于名为src的子目录中。

您的项目不必遵循所有这些期望,但是,如果您将文件放在非标准位置(从Autotools的角度来看),则稍后必须在Makefile中对此进行调整。

此外,这些文件是必需的:

  • 新闻
  • 自述文件
  • 作者
  • 变更日志

您不必主动使用这些文件,它们可以是包含所有信息的整体式文件(如README.md )的符号链接,但必须存在。

自动工具配置

在项目的根目录下创建一个名为configure.ac的文件。 autoconf使用此文件来创建用户在构建之前运行的配置外壳程序脚本。 该文件至少必须包含AC_INITAC_OUTPUT M4宏 。 使用这些宏,您不需要了解M4语言。 它们已经为您编写,并且与Autotools相关的所有信息均在文档中定义。

在您喜欢的文本编辑器中打开文件。 AC_INIT宏可以由程序包名称,版本,错误报告的电子邮件地址,项目URL以及源TAR文件的名称组成。

AC_OUTPUT宏要简单得多,并且不接受任何参数。


   
   
AC_INIT([penguin], [2019.3.6], [seth@example.com])
AC_OUTPUT

如果此时要运行autoconf ,将从configure.ac文件中生成一个配置脚本,它将成功运行。 不过,这就是要做的所有事情,因为到目前为止,您所做的只是定义项目的元数据,并要求创建配置脚本。

您必须在configure.ac文件中调用的下一个宏是创建Makefile的函数。 Makefile告诉make命令要做什么(通常是如何编译和链接程序)。

创建Makefile的宏是AM_INIT_AUTOMAKE (不接受任何参数)和AC_CONFIG_FILES (接受要调用输出文件的名称)。

最后,您必须添加一个宏来说明您的项目所需的编译器。 您使用的宏显然取决于您的项目。 如果您的项目是用C ++编写的,则相应的宏是AC_PROG_CXX ,而用C编写的项目则需要AC_PROG_CC ,依此类推,有关详细信息,请参见Autoconf文档的“ 构建程序和库”部分。

例如,我可能会为我的C ++程序添加以下内容:


   
   
AC_INIT([penguin], [2019.3.6], [seth@example.com])
AC_OUTPUT
AM_INIT_AUTOMAKE
AC_CONFIG_FILES([Makefile])
AC_PROG_CXX

保存文件。 现在是时候进入Makefile了。

自动工具Makefile生成

Makefile并不难手动编写 ,但是Autotools可以为您编写一个,而生成的文件将使用在./configure步骤中检测到的配置选项,并且其中包含的选项比您认为要包含或想要的要多得多。写自己。 但是,Autotools无法检测到项目需要构建的所有内容,因此您必须在Makefile.am文件中添加一些详细信息,而在构建Makefile时, automake会使用该文件。

Makefile.am使用与Makefile相同的语法,因此,如果您是从头开始编写Makefile的,那么此过程将是熟悉且简单的。 通常, Makefile.am文件仅需要几个变量定义即可指示要构建的文件以及安装位置。

_PROGRAMS结尾的变量标识要构建的代码(通常将其视为主要目标;这是Makefile存在的主要原因)。 Automake可以识别其他原语,例如_SCRIPTS_DATA_LIBRARIES以及组成软件项目的其他常见部分。

如果您的应用程序是在构建过程中按字面意义进行编译的,则可以将其标识为具有bin_PROGRAMS变量的二进制程序,然后引用构建它所需的源代码的任何部分(这些部分可能是一个或多个要编译的文件,链接在一起),使用程序名称作为变量前缀:


   
   
bin_PROGRAMS = penguin
penguin_SOURCES = penguin.cpp

bin_PROGRAMS的目标已安装到bindir中 ,该用户可在编译期间配置。

如果您的应用程序未真正编译,则您的项目根本不需要bin_PROGRAMS变量。 例如,如果您的项目是用Bash,Perl或类似的解释语言编写的脚本,则可以定义_SCRIPTS变量:


   
   
bin_SCRIPTS = bin/penguin

Automake期望源代码位于名为src的目录中,因此,如果您的项目使用其他目录结构作为其布局,则必须告诉Automake接受来自外部源代码:


   
   
AUTOMAKE_OPTIONS = foreign subdir-objects

最后,您可以在Makefile.am中创建任何自定义的Makefile规则,并将它们逐字复制到生成的Makefile中。 例如,如果您知道在安装继续之前需要在源代码中替换一个临时值,则可以为该过程制定自定义规则:


   
   
all-am: penguin
        touch bin/penguin.sh
       
penguin: bin/penguin.sh
        @sed "s|__datadir__|@datadir@|" $< >bin/$@

一个特别有用的技巧是至少在开发过程中扩展现有的清洁目标。 make clean命令通常会删除所有生成的构建文件,但Automake基础结构除外。 之所以这样设计,是因为大多数用户很少希望清理掉文件以使其易于构建代码。

但是,在开发过程中,您可能需要一种方法来可靠地将项目返回到Autotools相对不受影响的状态。 在这种情况下,您可能要添加以下内容:


   
   
clean-local:
        @rm config.status configure config.log
        @rm Makefile
        @rm -r autom4te.cache/
        @rm aclocal.m4
        @rm compile install-sh missing Makefile.in

这里有很多灵活性,如果您还不熟悉Makefile,可能很难知道Makefile.am的需求。 最重要的必要条件是主要目标,无论是二进制程序还是脚本,并指明源代码的位置(是通过_SOURCES变量还是通过使用AUTOMAKE_OPTIONS告诉Automake在哪里查找源代码)。

定义完这些变量和设置后,您可以尝试生成构建脚本,如下一节所述,并针对缺少的内容进行调整。

自动工具生成脚本

您已经建立了基础架构,现在是时候让Autotools发挥其最大作用:自动化项目工具。 开发人员(您)与Autotools的交互方式与用户构建代码的方式不同。

建设者通常使用以下众所周知的顺序:


   
   
$ ./configure
$ make
$ sudo make install

但是,为了使这种想法起作用,作为开发人员的您必须引导构建基础结构。 首先,运行autoreconf生成用户在运行make之前调用的配置脚本。 使用–install选项可引入辅助文件,例如,指向depcomp的符号链接,用于在编译过程中生成依赖项的脚本, 编译脚本的副本,用于解释语法差异的编译器的包装等。


   
   
$ autoreconf --install
configure.ac:3: installing './compile'
configure.ac:2: installing './install-sh'
configure.ac:2: installing './missing'

使用此开发构建环境,然后可以创建用于源代码分发的包:


   
   
$ make dist

dist目标是从Autotools获得“免费”的规则。
这是一项功能,该功能已内置到由您不起眼的Makefile.am配置生成的Makefile中 。 此目标将生成tar.gz归档文件,其中包含您的所有源代码和所有基本的Autotools基础结构,以便下载软件包的人员可以构建该项目。

在这一点上,您应该仔细检查档案的内容,以确保档案包含您打算交付给用户的所有内容。 当然,您还应该尝试自己构建它:


   
   
$ tar --extract --file penguin-0.0.1.tar.gz
$ cd penguin-0.0.1
$ ./configure
$ make
$ DESTDIR=/tmp/penguin-test-build make install

如果构建成功,则会找到由DESTDIR指定的已编译应用程序的本地副本(在本示例中为/ tmp / penguin-test-build )。


   
   
$ /tmp/example-test-build/usr/local/bin/example
hello world from GNU Autotools

是时候使用自动工具了

Autotools是用于可预测的自动发布过程的大量脚本。 如果您习惯使用Python或Bash构建器,那么此工具集可能对您来说是新的,但是可能值得学习它为项目提供的结构和适应性。

而且,Autotools也不仅仅用于代码。 自动工具可用于构建Docbook项目,保持媒体井井有条(我在音乐发行中使用自动工具),文档项目以及其他可从可自定义安装目标中受益的内容。

翻译自: https://opensource.com/article/19/7/introduction-gnu-autotools

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值