Makefile 在AC_OUTPUT()的参数中使用PACKAGE_VERSION
我为我缺乏m4sh方面的经验提前道歉 我有一个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
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。