天天看点

利用 GNU autotools

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

撰写本书时, <code>工具</code> 可以设置为 <code>libtool</code>、 <code>libltdl</code>、 <code>autoconf</code>、 <code>autoheader</code>、 <code>automake</code> 或 <code>aclocal</code> 之一。

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

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

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

最后, 可以使用一个特殊的名为 <code>autotools</code> 的工具, 它会安装全部可用的 autotools 版本, 以适应跨平台开发的需要。 您可以通过安装 <code>devel/autotools</code> port 来达到这一目的。

使用 GNU 联编框架的共享库通常会使用 <code>libtool</code> 来调整共享库的编译和安装, 以便与所运行的操作系统相匹配。 通常的做法是使用应用程序所附带的 <code>libtool</code> 副本。 如果需要使用外部的 <code>libtool</code>, 则可以使用 Ports 套件提供的版本:

如果不使用额外的操作符, <code>libtool:版本</code> 表示希望联编框架使用 configure 脚本来对系统所安装的 <code>libtool</code> 进行修补。 这会暗含地定义 <code>GNU_CONFIGURE</code>。 更进一步, 联编框架还会设置一系列 make 和 shell 变量用于 port 后续的操作。 请参见 <code>bsd.autotools.mk</code> 了解进一步的详情。

如果指定了 <code>:env</code> 操作符, 则表示只设置环境, 而跳过其他的操作。

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

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

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

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

以及

上述设置会暗含使用 <code>autoconf:版本</code>。

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

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

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

类似地, 偶尔会有一些软件包不提供联编所需的 <code>aclocal.m4</code> 文件。 这些文件可以通过使用 <code>aclocal</code> 来扫描 <code>configure.ac</code> 或 <code>configure.in</code> 自动生成。

<code>aclocal</code> 与 <code>automake</code> 有和 <code>autoheader</code> 与 <code>autoconf</code> 在前面一节中所介绍的相类似的关系。 <code>aclocal</code> 会暗含使用 <code>automake</code>, 因此:

也自动暗含使用 <code>automake:版本</code>。

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

对于 <code>autoconf</code> 和 <code>autoheader</code> 而言, <code>automake</code> 和 <code>aclocal</code> 提供了对应的可选参数变量 <code>AUTOMAKE_ARGS</code> 和 <code>ACLOCAL_ARGS</code>, 如果需要的话, 可以在 port 的 <code>Makefile</code> 中指定。

继续阅读