autotools:将包版本传播到子包中

时间:2013-06-09 09:11:32

标签: sh autotools autoconf

我有一个基于autotools的包调用Foo。由于历史原因(有没有其他原因?),这包含一个子包subBar。

Foo -|
     |- configure.ac
     |- Makefile.am
     |- subBar -|
                |- configure.ac
                |- Makefile.am

subBar的configure.ac非常复杂,如果可以避免的话我希望不要弄乱它。另一方面,subBar与Foo紧密集成,因此为它保留单独的版本号是没有意义的。

有没有办法将Foo的版本(从AC_INIT)传播到subBar?显而易见:

subBar/configure.ac:
  AC_INIT([subBar], [$(VERSION)], ...)

由于循环引用而无效。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

manual提供了一种可能的解决方案:

  

AC_INIT的参数必须是静态的,即不应该有任何参数   shell计算,引号或换行符,但它们可以通过计算   M4 ...允许使用m4_esyscmd或m4_esyscmd_s   计算每次提交到版本时更改的版本字符串   控制系统(实际上,Autoconf就是这样做的,适用于所有版本的   发布之间的开发树。)

由于autoconf本身在自己的configure.ac中使用了这个:

AC_INIT([GNU Autoconf],
        m4_esyscmd([build-aux/git-version-gen .tarball-version]),
        [bug-autoconf@gnu.org])

您需要将其替换为您自己的系统命令或shell脚本以获取版本字符串。例如,名为.foo-version并带有“MAJOR.MINOR”的顶级文件,并从git-version-gen借用,例如:m4_esyscmd([tr -d '\n' < ../.foo-version])

我想您可以在顶级包中使用相同的命令,当然用../替换./。由于m4正在调用系统命令,因此您可以随意获取版本字符串。

答案 1 :(得分:0)

https://github.com/ClusterLabs/libqb/blob/master/build-aux/git-version-gen

这是一个你可以采用的shell脚本文件...对于那些不熟悉的人...然后将名称定制为两个单独的变量文件集,如docker run --entrypoint "/usr/bin/python2.7 startup.py" .subBar-tarball-version以及.tarball-version.subBar-version