使用 autotools 在一个中心位置维护版本信息

Maintain Version Information in one central place with autotools

我使用 gnu autools(autoconf、automake、libtool)构建共享库和相关二进制文件,以及 texinfo 文档。

在configure.ac中维护了一个版本信息

例如,现在在 texinfo 源中,我想包括当前版本。

 @set VERSION 0.0.1
 @set UPDATED 18 June 2018

我想只定义一次版本并在适用的整个代码库中重复使用它们,因此在捆绑发布时我不会最终得到例如版本错误的 pdf。这有固定的模式吗?

I would like to define versions only once and reuse them throughout the code base where applicable, so when bundling a release I don't end up having for example a pdf with the wrong version. Is there an established pattern for this?

当然可以。正如您已经观察到的,configure.ac 包含版本信息,实际上通常在最顶部指定版本信息,作为 AC_INIT 宏的参数。从它构建的 configure 脚本的主要功能是通过用已知或发现的值填充模板文件来构建构建中使用的其他文件。以这种方式准备的最常见文件是 Makefile,但 Autotools configure 脚本绝非特定于这些文件。以同样的方式,他们可以准备 headers、文档文件和几乎任何其他可以作为文本处理的文件。

例如,如果您想自动将构建或版本号编码到您的源代码中,那么您可以通过管理包含该信息的 header 文件来实现。

要实现这一点,您只需在 AC_CONFIG_FILES 宏的参数中命名要构建的文件(如果您愿意,可以使用多个):

AC_CONFIG_FILES([src/version.h])

默认情况下,configure 将期望通过添加后缀 .in 来命名该输出文件的模板( src/version.h.in ).在其中,按名称引用 Autoconf 输出变量,以“@”字符为界:@VERSION@。当 configure 运行时(或者实际上当生成的脚本 config.status 运行时)它将通过复制模板创建指定的输出文件,用发现的输出变量值替换输出变量引用。

由于在许多情况下您想要填充版本信息的情况都是相似的,因为可配置部分在整个文件中所占的比例非常小,因此利用诸如 Texinfo 的 @include 之类的功能来隔离通常很方便小的、单独的文件中的可配置部分。 header 示例演示了这一点。

然而,特别是对于 texinfo,Automake 包括 a special provision 沿着这些行以获取 texinfo 源中的版本信息。如果你在 TEXINFO primary 中命名一个 .texi 源文件,并且那个文件 @include 的名字与 glob vers*.texi 匹配,那么 Automake 将安排自动生成包含的文件(除非你把在您自己的构建规则中)。那么,在 texinfo 版本控制的特定情况下,使用该工具生成和合并版本数据比滚动生成自己的版本文件更可取。