【问题标题】:Autotool automake output executable filename with versionAutotool automake 输出带有版本的可执行文件名
【发布时间】: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

【问题讨论】:

    标签: c autotools automake


    【解决方案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 文件。我只用我的版本定义对其进行了修改。
    猜你喜欢
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2022-01-25
    • 1970-01-01
    • 2015-10-25
    相关资源
    最近更新 更多