Autotool automake 输出带有版本的可执行文件名

Posted

技术标签:

【中文标题】Autotool automake 输出带有版本的可执行文件名【英文标题】:Autotool automake output executable filename with version 【发布时间】:2015-12-10 14:58:10 【问题描述】:

我正在尝试将版本号添加到自动工具项目的输出可执行文件名中。

使用 libs 非常简单:你可以在Makefile.am 中添加-version-info 选项

我怎样才能用bin_PROGRAMS做同样的事情

到目前为止我尝试过:

HELLO_VERSION_CURRENT = 1
HELLO_VERSION_REVISION = 2
HELLO_VERSION_AGE = 1

bin_PROGRAMS = hello_$HELLO_VERSION_CURRENT_$HELLO_VERSION_REVISION_$HELLO_VERSION_AGE
hello_SOURCES = hello.c

由于SOURCES 必须是:hello_1_2_1_SOURCES,因此无法编译,但我不知道如何告诉自动生成。

另一种方法是运行构建后脚本:如何将构建后操作添加到Makefile.am

【问题讨论】:

【参考方案1】:

在你的Makefile.am 中使用一些preset autoconf output variables 怎么样:

bin_PROGRAMS = hello_@PACKAGE_VERSION@

hello_@PACKAGE_VERSION@_SOURCES = hello.c

前面的代码在 Darwin 上适用于我,autoconf v2.69 和 automake v1.15。

在您的源代码中使用PACKAGE_VERSION 更加容易:#include "config.h",所有 autoconf 输出变量都是#defined。例如:

/* config.h.  Generated from config.h.in by configure. */
/* config.h.in.  Generated from configure.ac by autoheader. */

...

#define PACKAGE_VERSION "1.2.3-rc-whatever"

参考:

https://www.gnu.org/software/autoconf/manual/autoconf#Output-Variable-Index

【讨论】:

好的。有用。谢谢。我对这个解决方案的问题是:如何访问源代码中的版本字符串?我试过 -D@PACKAGE_VERSION@ 但它不起作用。 @LPs,请参阅我关于#include "config.h" 的最新编辑。 autoconf-generated config.h 包含(几乎)所有此类输出变量的预处理器定义。【参考方案2】:

你可以这样做:

HELLO_VERSION_CURRENT = 1
HELLO_VERSION_REVISION = 2
HELLO_VERSION_AGE = 1

bin_PROGRAMS = hello_$(HELLO_VERSION_CURRENT)_$(HELLO_VERSION_REVISION)_$(HELLO_VERSION_AGE)
hello_$(HELLO_VERSION_CURRENT)_$(HELLO_VERSION_REVISION)_$(HELLO_VERSION_AGE)_SOURCES = hello.c

不过,在这种情况下,我建议使用更短的变量名...

【讨论】:

这是我尝试的第一个解决方案,但没有奏效。由于生成的 Makefile 出错,给了我编译错误。 您原来的帖子中有curly braces;你试过(parentheses)吗? 不,我没有。好提示。我试试看,我会告诉你的。 我找到了下划线的正确方法。 hello___HELLO_VERSION_CURRENT____HELLO_VERSION_REVISION____HELLO_VERSION_AGE__SOURCES【参考方案3】:

最后我将以下内容添加到我的Makefile.am

all:
    cp ./.libs/hello ./.libs/hello_$HELLO_VERSION_CURRENT_$HELLO_VERSION_REVISION_$HELLO_VERSION_AGE

编辑 我找到了一个新的解决方案

HELLO_VERSION_CURRENT = 1
HELLO_VERSION_REVISION = 2
HELLO_VERSION_AGE = 1

bin_PROGRAMS = hello_$(HELLO_VERSION_CURRENT)_$(HELLO_VERSION_REVISION)_$(HELLO_VERSION_AGE)
hello___HELLO_VERSION_CURRENT____HELLO_VERSION_REVISION____HELLO_VERSION_AGE__SOURCES = hello.c

hello___HELLO_VERSION_CURRENT____HELLO_VERSION_REVISION____HELLO_VERSION_AGE__CFLAGS =
hello___HELLO_VERSION_CURRENT____HELLO_VERSION_REVISION____HELLO_VERSION_AGE__LDFLAGS =

AM_CFLAGS = @hello___HELLO_VERSION_CURRENT____HELLO_VERSION_REVISION____HELLO_VERSION_AGE__CFLAGS@
AM_LDFLAGS = @hello___HELLO_VERSION_CURRENT____HELLO_VERSION_REVISION____HELLO_VERSION_AGE__LDFLAGS@

CLEANFILES = *~ 

【讨论】:

我不清楚你为什么(取消)将 hello___... 变量定义为空,然后再分配给 AM_... 变量相同的值。您是否尝试清除默认编译器和链接器标志? @rubicks 这是使用该 sintax 的 autotool 生成的默认 am 文件。我只用我的版本定义对其进行了修改。

以上是关于Autotool automake 输出带有版本的可执行文件名的主要内容,如果未能解决你的问题,请参考以下文章

大型项目使用Automake/Autoconf完成编译配置

automake 1.12 更改 bison/yacc 输出名称,向后不兼容的更改?

大型项目使用Automake/Autoconf完成编译配置(标准的编译过程已经变成了简单的三部曲:configure/make/make install,)

Automake:使用 make dist 删除配置脚本检查

如何正确使用带有子目录的 automake/autoconf?

选择 autoconf 和 automake 版本