由于缺乏m4sh的经验,我向您致歉。
我有一个configure.ac
文件,其中包含以下几行:
AC_INIT([libhelloworld], [2.5])
...
AC_OUTPUT([
Makefile
src/helloworld-${PACKAGE_VERSION}.pc
src/Makefile
])
AC_OUTPUT()
参数背后的原因是,我希望避免在每次更新时将我的程序的新版本复制并粘贴到多个位置。因此,我决定使用PACKAGE_VERSION
的宏,该宏在AC_INIT()
的开头调用configure.ac
时自动定义。
然后,行src/helloworld-${PACKAGE_VERSION}.pc
正确地扩展为src/helloworld-2.5.pc
,一切似乎都工作正常。但是我有几个问题。
${PACKAGE_VERSION}
作为shell变量,但是PACKAGE_VERSION
本身是一个m4宏。我可以相信这将一直有效吗?调用AC_OUTPUT()
时是否总是这样定义?PACKAGE_VERSION
中configure.ac
的值?例如,如果我不是configure.ac
,而是在Makefile.am
里面,则不使用大括号,而是使用命令评估语法,如$(PACKAGE_VERSION)
所示。在configure.ac
内做我想做的事正确的正确方法是什么?答案 0 :(得分:2)
AC_INIT
的文档指出PACKAGE_VERSION
是一个“输出变量”,这意味着当您调用AC_INIT
时,将执行以下操作:
AC_SUBST([PACKAGE_VERSION], [2.5])
这允许诸如Makefile.in
(从Makefile.am
生成)之类的输入文件的配置依赖于被@PACKAGE_VERSION@
替换的那些文件中的2.5
。
如果可行,您的方法没有错,但是您可以考虑使用AS_VAR_SET([hello_version], [AC_PACKAGE_VERSION])
在Autoconf输入中设置hello_version
shell变量和src/helloworld-${hello_version}.pc
。这样,即使Autoconf在将来的发行版中不再公开PACKAGE_VERSION
shell变量,您的代码也不会中断,因为您将依靠自己的hello_version
变量。
顺便说一句,当helloworld-2.5.pc
版本为1.0或更高(即API稳定)时,使用helloworld
有点不规则。看到helloworld.pc
是很常见的,除了那是一个问题,当您发布3.0并将helloworld.pc
的已安装2.x版本替换为3.0版本时:假设您使用的是语义版本控制3.0与2.x不兼容,任何依赖于pkg-config --libs helloworld
之类的代码都将中断。
然后您可以考虑使用helloworld-2.pc
来代替,而在您发布3.0时,您应该选择helloworld-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-${hello_major}.pc
生成构建目录中的输出文件src/helloworld.pc.in
,而无需更新{{1}从2.x移至3.0时的文件名;如果您可以使用宏,也可以将其与src/helloworld.pc.in
一起使用,从而可以在一个中央位置控制版本信息:
AC_INIT
我意识到它看起来比预期的要复杂得多,但这就是Autoconf。请注意,我必须在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
中使用一些奇数引号来使用宏。使用
AC_CONFIG_FILES
而不是宏导致在Autoconf 2.69中生成了残缺的src/helloworld-${hello_major}.pc:src/helloworld.pc.in
文件(尝试config.status
不带参数,然后config.status
来查看问题);我还没有测试过其他版本。我已经报告了该错误,但是该宏在下一个版本之前一直有效。