【问题标题】:autotools: propagating package version into subpackageautotools:将包版本传播到子包中
【发布时间】:2013-06-09 09:11:31
【问题描述】:

我有一个基于 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)], ...)

由于循环引用而无法工作。

有什么想法吗?

【问题讨论】:

    标签: sh autotools autoconf


    【解决方案1】:

    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 正在调用系统命令,因此您可以随意获取版本字符串。

    【讨论】:

    • 感谢您的回答。实际上,我正在使用 git-version-gen 来生成顶级包版本。我想我也可以修改它以在执行 autoreconf 时将版本字符串保存到文件中,并按照您的建议在子包中读取相同的字符串。但是,我希望找到一种不那么模糊的参数传递方式;)
    • 我建议反其道而行之:让 Foo 使用 subBar 的版本号。这样你仍然可以在 subBar 中 make dist 并拥有一个独立的包。
    【解决方案2】:

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

    这是一个您可以采用的 shell 脚本文件……对于那些不熟悉的人……然后将名称定制为两个单独的变量文件集,例如 .subBar-tarball-version.tarball-version.subBar-version.version

    【讨论】:

      猜你喜欢
      • 2016-08-08
      • 1970-01-01
      • 2016-06-22
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多