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 输出变量都是#define
d。例如:
/* 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 1.12 更改 bison/yacc 输出名称,向后不兼容的更改?
大型项目使用Automake/Autoconf完成编译配置(标准的编译过程已经变成了简单的三部曲:configure/make/make install,)
Automake:使用 make dist 删除配置脚本检查