Makefile 在AC_OUTPUT()的参数中使用PACKAGE_VERSION

Makefile 在AC_OUTPUT()的参数中使用PACKAGE_VERSION,makefile,gnu,autotools,autoconf,automake,Makefile,Gnu,Autotools,Autoconf,Automake,我为我缺乏m4sh方面的经验提前道歉 我有一个configure.ac文件,其中包含以下行: AC_INIT([libhelloworld],[2.5]) ... 交流输出([ 生成文件 src/helloworld-${PACKAGE_VERSION}.pc src/Makefile ]) AC_OUTPUT()参数背后的原因是我希望避免在每次更新时在多个地方复制和粘贴程序的新版本。因此,我决定利用PACKAGE\u VERSION宏,该宏在configure.AC开头调用AC\u INIT

我为我缺乏m4sh方面的经验提前道歉

我有一个
configure.ac
文件,其中包含以下行:

AC_INIT([libhelloworld],[2.5])
...
交流输出([
生成文件
src/helloworld-${PACKAGE_VERSION}.pc
src/Makefile
])
AC_OUTPUT()
参数背后的原因是我希望避免在每次更新时在多个地方复制和粘贴程序的新版本。因此,我决定利用
PACKAGE\u VERSION
宏,该宏在
configure.AC
开头调用
AC\u INIT()
时自动定义

src/helloworld-${PACKAGE_VERSION}.pc
然后正确地展开为
src/helloworld-2.5.pc
,一切似乎都正常工作。不过,我有几个问题

  • 我使用
    ${PACKAGE\u VERSION}
    作为shell变量,但
    PACKAGE\u VERSION
    本身是一个m4宏。我能相信这会一直有效吗?当调用
    AC\u OUTPUT()
    时,它是否总是这样定义
  • configure.ac
    中是否有其他方法获取
    PACKAGE\u VERSION
    的值?例如,如果我在
    Makefile.am
    中而不是
    configure.ac
    ,我将不使用花括号,而是使用命令求值语法,如
    $(软件包版本)
    中所示。在
    configure.ac
    中执行我想要的操作的正确方法是什么

  • AC_INIT
    的文档说明,
    PACKAGE_VERSION
    是一个“输出变量”,这意味着当您调用
    AC_INIT
    时,会执行如下操作:

    AC_SUBST([PACKAGE_VERSION], [2.5])
    
    这允许输入文件的配置,例如
    Makefile.in
    (从
    Makefile.am
    生成)依赖于那些被
    2.5
    替换的文件中的
    @PACKAGE\u VERSION@

    如果您的方法有效,没有什么不对的,但是您可以考虑使用<代码> ASYVARYSET([HeloLoVix],[ACHPACKAGEXVALID])<代码>来设置<代码> HeloLogyValue< /Cult> shell变量和<代码> Src/HeloWord -${HeloLoValp}。PC < /代码>在Autoconf输入中。这样,即使Autoconf在将来的某个版本中不再公开

    PACKAGE\u版本
    shell变量,您的代码也不会中断,因为您将依赖自己的
    hello\u版本
    变量


    另外,当
    helloworld
    版本为1.0或更高版本(即API稳定)时,使用
    helloworld-2.5.pc
    有点不规则。常见的情况是
    helloworld.pc
    ,但当您发布3.0并将已安装的
    helloworld.pc
    的2.x版本替换为3.0版本时会发生什么问题:假设您使用语义版本控制,3.0与2.x不兼容,任何依赖于pkg config--libs helloworld之类的东西的代码都会崩溃

    你可以考虑使用<代码> HeloRoLLD-2 .PC < /Cord>,当你发布3时,你可以使用<代码> HeloRoLLD-3,PC < /代码>,以避免你的库的用户链接不正确的/不兼容的库(也允许用户按自己的步调移动到新版本);您也可以在Automake中为特定版本的头目录应用此思想:

    ## SOURCE PATH     => INSTALL PATH
    ## include/hello.h => $(includedir)/helloworld-2/hello.h
    helloincludedir = @includedir@/helloworld-@hello_major@
    helloinclude_HEADERS = include/hello.h
    
    Autoconf还允许您指定输出文件的输入,因此从源目录中的
    src/helloworld.pc
    可以生成构建目录中的输出文件
    src/helloworld-${hello\u major}.pc
    ,而无需在从2.x移动到3.0时更新
    src/helloworld.pc.in
    文件名;如果您对宏没有问题,这也可以用于
    AC_INIT
    ,允许您在一个中心位置控制版本信息:

    m4_define([hello_version_major], [2]) dnl
    m4_define([hello_version_minor], [5]) dnl
    m4_define([hello_version], [hello_version_major[.]hello_version_minor]) dnl
    AC_PREREQ([2.69])
    AC_INIT([libhelloworld], [hello_version])
    AS_VAR_SET([hello_major], [hello_version_major])
    AS_VAR_SET([hello_minor], [hello_version_minor])
    # For automake and configuration of pkg-config file
    AC_SUBST([hello_major])
    AC_SUBST([hello_minor])
    AC_SUBST([hello_version])
    ...
    AC_CONFIG_FILES([
        Makefile
        src/Makefile
        src/helloworld-]hello_version_major[.pc:src/helloworld.pc.in
    ])
    AC_OUTPUT
    
    我意识到它看起来比人们想象的要复杂得多,但这是你的Autoconf。请注意,我必须在
    AC_CONFIG_文件中使用一些奇怪的引号来使用宏。使用

    src/helloworld-${hello_major}.pc:src/helloworld.pc.in
    

    而不是宏导致在Autoconf 2.69中生成一个残废的
    config.status
    文件(尝试不带参数的
    config.status
    ,然后
    config.status src/helloworld-2.pc
    查看问题);我还没有测试过其他版本。我已经报告了这个错误,但是宏会一直工作到下一个版本。

    AC_INIT
    的文档说明
    PACKAGE_VERSION
    是一个“输出变量”,这意味着当您调用
    AC_INIT
    时,会执行类似的操作:

    AC_SUBST([PACKAGE_VERSION], [2.5])
    
    这允许输入文件的配置,例如
    Makefile.in
    (从
    Makefile.am
    生成)依赖于那些被
    2.5
    替换的文件中的
    @PACKAGE\u VERSION@

    如果您的方法有效,没有什么不对的,但是您可以考虑使用<代码> ASYVARYSET([HeloLoVix],[ACHPACKAGEXVALID])<代码>来设置<代码> HeloLogyValue< /Cult> shell变量和<代码> Src/HeloWord -${HeloLoValp}。PC < /代码>在Autoconf输入中。这样,即使Autoconf在将来的某个版本中不再公开

    PACKAGE\u版本
    shell变量,您的代码也不会中断,因为您将依赖自己的
    hello\u版本
    变量


    另外,当
    helloworld
    版本为1.0或更高版本(即API稳定)时,使用
    helloworld-2.5.pc
    有点不规则。常见的情况是
    helloworld.pc
    ,但当您发布3.0并将已安装的
    helloworld.pc
    的2.x版本替换为3.0版本时会发生什么问题:假设您使用语义版本控制,3.0与2.x不兼容,任何依赖于pkg config--libs helloworld之类的东西的代码都会崩溃

    你可以考虑使用<代码> HeloRoLLD-2。PC < /代码>,而当你发布3时,你将拥有<代码> HEL。