当前位置: 首页 > 科技观察

GNUAutotools简介

时间:2023-03-13 23:45:03 科技观察

如果您还没有使用过Autotools,这篇文章将改变您提交代码的方式。您是否曾经下载过流行软件项目的源代码,要求您输入几乎是仪式性的./configure序列?make&&makeinstall命令来构建和安装它?如果是这样,您已经在使用GNUAutotools。如果您曾经研究过此类项目附带的一些文件,您可能已经被这个构建系统的明显复杂性吓倒了。好消息是GNUAutotools的设置比您想象的要简单得多,GNUAutotools本身可以为您生成这数千行配置文件。是的,您可以编写20或30行设置代码并免费获得另外4,000行。Autotools的工作原理如果您是Linux的新用户,并且正在寻找有关如何安装应用程序的信息,则不必阅读本文!如果你想学习如何构建软件,欢迎阅读;但是如果你只想安装一个新的应用程序,请阅读我关于在Linux上安装应用程序的文章。对于开发人员来说,Autotools是一种管理和打包源代码的快捷方式,因此用户可以编译和安装软件。Autotools还得到DEB和RPM等主要打包格式的良好支持,因此软件存储库的维护人员可以轻松管理使用Autotools构建的项目。Autotools工作步骤:首先,在./configure步骤中,Autotools扫描主机系统(即当前运行的计算机)以发现默认设置。默认设置包括支持库所在的位置,以及新软件应放置在系统中的位置。接下来,在make步骤中,Autotools构建应用程序,通常是将人类可读的源代码转换为机器语言。最后,在makeinstall步骤中,Autotools将其构建的文件复制到计算机上的适当位置(在配置阶段检测到)。该过程看起来很简单,与您使用Autotools所做的相同。Autotools的优势GNUAutotools是我们大多数人认为理所当然的重要软件。与GCC(GNU编译器集合)一起,Autotools是一个脚手架,支持将免费软件构建和安装到正在运行的系统中。如果您运行的是POSIX系统,可以肯定地说,在您的计算机操作系统上运行的大多数软件都是以这种方式构建的。即使您的项目是一个玩具项目而不是操作系统,您也可能会认为Autotools对您的需求来说太过分了。但是尽管名声在外,Autotools有许多小功能,即使您的项目只是一个相对简单的应用程序或一系列脚本,也可能使您受益。可移植性首先,Autotools考虑到了可移植性。虽然它不会使您的项目在所有POSIX平台上工作(这取决于您,编码员),但Autotools可以确保您标记为安装的文件安装到已知平台上最合理的位置。得益于Autotools,高级用户可以根据自己的系统条件轻松自定义和覆盖任何非最佳设置。使用Autotools,您只需知道需要安装文件的大致位置即可。它会处理其他一切。不需要可能破坏未经测试的操作系统的自定义安装脚本。PackagingAutotools也得到了很好的支持。将带有Autotools的项目交给分发打包器,无论他们将其打包为RPM、DEB、TGZ还是其他任何东西,都很简单。打包工具了解Autotools,因此可能不需要修补、修改或调整。在许多情况下,甚至可以通过将Autotools项目合并到流程中来实现自动化。如何使用Autotools要使用Autotools,必须安装它。您的发行版可能会提供单个包来帮助开发人员构建项目,或者它可能会为每个组件提供单独的包,因此您可能需要在您的平台上进行一些研究以发现安装Bag所需的内容。Autotools的组件是:automakeautoconfautomakemakeAutotools可以很好地处理不需要编译的脚本或二进制文件,尽管您可能需要安装项目所需的编译器(例如GCC)。其实Autotools对这类项目很有用,因为它提供了一个makeuninstall脚本,方便卸载。安装所有组件后,现在让我们看一下项目文件的结构。Autotools项目结构GNUAutotools有非常具体的期望,如果您经常下载和构建源代码,其中的大部分可能很熟悉。首先,源代码本身应该在一个名为src的子目录中。您的项目不必遵循所有这些预期的规范,但如果您将文件放在非标准位置(从Autotools的角度来看),那么您将不得不稍后在Makefile中调整它们。此外,这些文件是必需的:新闻自述文件作者更改日志您不必主动使用这些文件,它们可以是指向包含所有信息的单个摘要文档(如README.md)的符号链接,但它们必须存在。Autotools配置在项目的根目录中创建一个名为configure.ac的文件。autoconf使用此文件来创建用户在构建之前运行的configureshell脚本。该文件必须至少包含AC_INIT和AC_OUTPUTM4宏。您无需了解任何有关M4语言的知识即可使用这些宏;它们是为您编写的,所有与Autotools相关的内容都在本文档中定义。在您喜欢的文本编辑器中打开此文件。AC_INIT宏可以包含包名、版本、报告错误的电子邮件地址、项目URL和可选的源TAR文件名等参数。AC_OUTPUT宏更简单,没有任何参数。AC_INIT([penguin],[2019.3.6],[[seth@example.com][8]])AC_OUTPUT如果此时运行autoconf,会根据你的configure.ac文件生成configure脚本,可以被运行。但仅此而已,因为到目前为止您所做的只是定义项目的元数据并需要创建配置脚本。您必须在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][8]])AC_OUTPUTAM_INIT_AUTOMAKEAC_CONFIG_FILES([Makefile])AC_PROG_CXX保存文件。现在让我们把注意力转向Makefile。生成一个AutotoolsMakefileMakefile手写并不难,但是Autotools可以为你写一个,它生成的那个将使用在./configure步骤中检测到的配置选项,它包含的内容比你考虑的或想要的要多自己写还有很多选择。但是,Autotools不会检测您的项目需要构建的所有内容,因此您必须在文件Makefile.am中添加一些细节,然后automake在构建Makefile时使用它。Makefile.am使用与Makefile相同的语法,因此如果您曾经从头编写过Makefile,那么该过程将会很熟悉且简单。通常,一个Makefile.am文件只需要几个变量定义来指示要构建哪些文件以及它们应该安装在哪里。以_PROGRAMS结尾的变量标识要构建的代码(这通常被认为是原始的主要目标;这是Makefile的主要目的)。Automake还可以识别其他原语,例如_SCRIPTS、_DATA、_LIBRARIES以及构成软件项目的其他常用部分。如果您的应用程序需要在构建过程中实际编译,那么您可以使用bin_PROGRAMS变量将其标记为二进制程序,然后使用该程序名称作为变量前缀来引用构建它所需的源代码的任何部分(这些部分可能是将被编译和链接在一起的一个或多个文件):bin_PROGRAMS=penguinbin_PROGRAMS的penguin_SOURCES=penguin.cpp目标安装在bindir中,用户可在编译期间对其进行配置。如果您的应用程序实际上没有编译,那么您的项目根本不需要bin_PROGRAMS变量。例如,如果您的项目是用Bash、Perl或类似的解释性语言编写的脚本,请改为定义一个_SCRIPTS变量:bin_SCRIPTS=bin/penguinAutomake期望源代码位于名为src的目录中,因此如果您的项目要使用用于布局的备用目录结构,您必须告诉Automake接受来自外部源的代码:AUTOMAKE_OPTIONS=foreignsubdir-objects最后,您可以在Makefile.am中创建任何自定义Makefile规则,它们将逐字复制到生成的Makefile中间。例如,如果你知道在安装前需要替换源代码中的一些临时值,你可以为这个过程创建自定义规则:all-am:penguintouchbin/penguin.shpenguin:bin/penguin.sh@sed"s|__datadir__|@datadir@|"$<>bin/$@一个特别有用的技巧是扩展现有的clean目标,至少在开发期间是这样。makeclean命令通常会删除除Automake基础结构之外的所有生成的构建文件。之所以这样设计,是因为大多数用户很少希望makeclean删除有助于构建代码的文件。但是,在开发过程中,您可能需要一种方法来可靠地将项目返回到相对不受Autotools影响的状态。在这种情况下,您可能需要添加:clean-local:@rmconfig.statusconfigureconfig.log@rmMakefile@rm-rautom4te.cache/@rmaclocal.m4@rmcompileinstall-shmissingMakefile。这里有很大的灵活性,如果您还不熟悉Makefile,可能很难知道您的Makefile.am需要什么。最基本的需求是原始目标,无论是二进制程序还是脚本,以及源代码所在位置的指示(无论是通过_SOURCES变量还是使用AUTOMAKE_OPTIONS告诉Automake到哪里寻找源代码)。一旦定义了这些变量和设置,如下一节所示,您可以尝试生成构建脚本并调整任何缺失的内容。生成Autotools构建脚本现在您已经构建了您的基础架构,是时候让Autotools做它最擅长的事情了:自动化您的项目工具。Autotools的界面对于开发人员(您)和构建代码的用户是不同的。构建者通常使用这个众所周知的序列:$./configure$make$sudomakeinstall然而,为了使这个咒语起作用,作为开发者的你必须引导构建这些基础设施。首先,运行autoreconf以生成用户在运行make之前调用的配置脚本。使用-install选项将辅助文件(例如符号链接)引入depcomp(这是在编译期间生成依赖项的脚本),以及编译脚本的副本(编译器周围的包装器,用于说明语法等)。$autoreconf--installconfigure.ac:3:安装'./compile'configure.ac:2:安装'./install-sh'configure.ac:2:安装'./missing'使用这个开发构建环境,您可以创建源代码分发:$makedistdisttarget是从Autotools“免费”获得的规则。这是Makefile中内置的功能,它是使用简单的Makefile.am配置生成的。此目标生成包含所有源代码和所有必要的Autotools基础结构的tar.gz存档,以便下载包的人可以构建项目。此时,您应该仔细检查存档文件的内容,以确保它包含您要发送给用户的所有内容。当然,您也应该尝试自己构建它:$tar--extract--filepenguin-0.0.1.tar.gz$cdpenguin-0.0.1$./configure$make$DESTDIR=/tmp/penguin-test-buildmakeinstall如果构建成功,您将找到DESTDIR指定的已编译应用程序的本地副本(在本例中为/tmp/penguin-test-build)。$/tmp/example-test-build/usr/local/bin/examplehelloworld从GNUAutotools使用AutotoolsAutotools是一个很好的脚本集合,用于可预测的自动化发布过程。如果您习惯使用Python或Bash构建器,这个工具集对您来说可能是新的,但它为您的项目提供的结构和适应性可能值得学习。Autotools也不仅仅适用于代码。Autotools可用于构建Docbook项目、组织媒体(我将Autotools用于音乐发布)、文档项目以及任何其他可以从可定制安装目标中受益的项目。