6.4 利用 GNU autotools

6.4.1 入门

众多 GNU autotools 提供了一种在多重操作系统和机器架构之上构建软件的抽象机制。 在 Ports Collection 中, port 可以通过简单的方法来使用这些工具:

USE_AUTOTOOLS= 工具:版本[:操作] ...

撰写本书时, 工具 可以设置为 libtoollibltdlautoconfautoheaderautomakeaclocal 之一。

版本 用来指定希望使用的工具的特定版本 (参见 devel/{automake,autoconf,libtool}[0-9]+ 以了解有效的版本号)。

操作 是一个可选的扩展选项, 用于修改如何使用工具。

可以同时指定多个不同的工具, 可以在一行中指定, 也可以用 Makefile 的 += 结构。

在开始介绍其它工具之前, 需要强调的是, 这些结构只能用于构建 port。 如果希望进行跨平台的开发, 例如在 IDE 中, 则应使用 devel/gnu-{automake,autoconf,libtool} 这些 port。 devel/anjuta 以及 devel/kdevelop (分别对应于 GNOME 和 KDE) 是关于如何做到这一点的良好范例。

6.4.2 libtool

使用 GNU 构建框架的共享库通常会使用 libtool 来调整共享库的编译和安装, 以便与所运行的操作系统相匹配。 Ports Collection 提供了一系列经过修改以适应 FreeBSD 的不同版本的 libtool

USE_AUTOTOOLS= libtool:版本[:inc|:env]

如果不使用额外的操作符, libtool:版本 将告诉构建框架 port 希望使用 libtool, 这也暗含地定义了 GNU_CONFIGURE。 configure 脚本将使用系统安装的 libtool 版本进行修补。 更进一步, 还将设置一系列 make 和 shell 变量, 以便 port 使用。 请参见 bsd.autotools.mk 了解进一步的详情。

如果使用 :inc 操作符, 则会设置环境, 但使用一些略微不同的补丁。

如果使用 :env 操作符, 则只设置环境。

先前的写法 新的 USE_AUTOTOOLS 结构
USE_LIBTOOL_VER=13 libtool:13
USE_INC_LIBTOOL_VER=15 libtool:15:inc
WANT_LIBTOOL_VER=15 libtool:15:env

最后, LIBTOOLFLAGSLIBTOOLFILES 可以用来替换最常修改的参数, 以及将被 libtool 修补的文件。 多数 port 不需要这样做。 请参见 bsd.autotools.mk 以了解进一步的细节。

6.4.3 libltdl

一些 ports 会使用 libltdl 库, 后者是 libtool 软件包的一部分。 使用这个库并不意味着必须使用 libtool 本身, 因此提供了另一组结构。

USE_AUTOTOOLS= libltdl:版本

目前, 这一设置所做的全部工作是将 LIB_DEPENDS 设置为适当的 libltdl port, 并作为一项方便的功能, 协助开发人员消除在 USE_AUTOTOOLS 框架以外的, 对于 autotools port 的依赖。 这个工具并不提供其它的操作符。

先前的写法 新的 USE_AUTOTOOLS 结构
USE_LIBLTDL=YES libltdl:15

6.4.4 autoconfautoheader

某些 port 并没有直接提供 configure 脚本, 但包含了作为 autoconf 模板的 configure.ac 文件。 可以用下列设置来要求 autoconf 创建 configure 脚本, 并使用 autoheader 来为 configure 脚本创建模板头文件。

USE_AUTOTOOLS= autoconf:版本[:env]

以及

USE_AUTOTOOLS= autoheader:版本

上述设置会暗含使用 autoconf:版本

对于 libtool, 设置与前面类似。 如果指定可选的 :env 操作符, 则表示只设置用于后续工作的环境。 如果不指定, 则会对 port 进行相应的修补和重新配置。

先前的写法 新的 USE_AUTOTOOLS 结构
USE_AUTOCONF_VER=213 autoconf:213
WANT_AUTOCONF_VER=259 autoconf:259:env
USE_AUTOHEADER_VER=253 autoheader:253 (implies autoconf:253)

其它的可选变量, 如 AUTOCONF_ARGSAUTOHEADER_ARGS 可以通过 port 的 Makefile 来显式地指定替换。 类似 libtool, 多数 port 并不需要这样做。

6.4.5 automakeaclocal

某些软件包只提供了 Makefile.am 文件。 这些文件必须首先用 automake 转换为 Makefile.in 并使用 configure 来生成实际的 Makefile

类似地, 偶尔会有一些软件包不提供构建所需的 aclocal.m4 文件。 这些文件可以通过使用 aclocal 来扫描 configure.acconfigure.in 自动生成。

aclocalautomake 有和 autoheaderautoconf 在前面一节中所介绍的相类似的关系。 aclocal 会暗含使用 automake, 因此:

USE_AUTOTOOLS= automake:版本[:env]

USE_AUTOTOOLS= aclocal:版本

也自动暗含使用 automake:版本

libtool 类似, autoconf 如果使用了可选的 :env 操作符表示仅仅设置用于后续使用的环境, 如果不设置, 则会对 port 进行重新配置。

先前的写法 USE_AUTOTOOLS construct
USE_AUTOMAKE_VER=14 automake:14
WANT_AUTOMAKE_VER=15 automake:15:env
USE_ACLOCAL_VER=19 aclocal:19 (implies automake:19)

As with autoconfautoheaderautomakeaclocal 提供了对应的可选参数变量 AUTOMAKE_ARGSACLOCAL_ARGS, 如果需要的话, 可以在 port 的 Makefile 中指定。

若您有关于 FreeBSD ports 系统的问题, 请发送电子邮件至 <ports@FreeBSD.org>。
关于此文档的任何问题, 请致函 <doc@FreeBSD.org>。