m4_version_compare看不到变量

时间:2011-12-07 11:18:21

标签: autoconf

我想在configure.in脚本中测试某个包的版本(例如PCRE),并相应地在Makefile中定义C ++变量。我认为autoconf函数m4_version_compare可以解决问题,但我无法让它工作。我确信我没有正确使用它。 我在configure.in中有以下内容:

AC_INIT([MyPackage], 0.4)
# Checks for common programs using default macros
AC_PROG_CC

PCREVERSION=`pcre-config --version`
AC_MSG_RESULT([Detected PCRE version ${PCREVERSION}])
PCRE_POST_8_0=m4_version_compare([PCREVERSION], [8.0])
AC_MSG_RESULT([PCRE version >= 8.0: ${PCRE_POST_8_0}])

AC_SUBST(PCRE_POST_8_0)
AC_OUTPUT(src/Makevars)

然后autoconf + ./configure产生以下输出:

checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables... 
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
Detected PCRE version 8.12
PCRE version >= 8.0: -1
configure: creating ./config.status
config.status: creating src/Makevars

我做错了什么?似乎m4_version_compare将变量PCREVERSION视为0.我应该以另一种方式定义此变量吗?怎么样? 谢谢。

雷诺

2 个答案:

答案 0 :(得分:3)

您无法使用m4_version_compare来比较在configure - 时间找到的版本号。

m4_version_compare宏需要在autoconf运行时必须知道的两个字符串才能构建configure脚本。在这里,您将字符串PCREVERSION与字符串8.0进行比较,并且报告前者比后者更小。

您想要使用的实际上是名为PCREVERSION的shell变量的值,即$PCREVERSION,遗憾的是,此值仅在./configure运行时已知,因此赢了不行。

你应该使用shell或其他方法进行自己的比较。 Personaly我会依赖AC_PREPROC_IFELSE让预处理器一次做两个测试:确保pcre.h文件存在并且它已经足够了。这样的事情可能有用(未经测试):

AC_PREPROC_IFELSE(
[AC_LANG_PROGRAM([[#include "pcre.h"
#if PCRE_MAJOR < 8 
#error out of date
#endif]], [[]])],
[pcre8available=yes],
[pcre8available=no])

答案 1 :(得分:2)

我使用AS_VERSION_COMPARE工作,它在运行时运行(与adl指出的m4_version_compare不同)。因此,我最终用于实现此目的的代码是:

AC_INIT([MyPackage], 0.4)
# Checks for common programs using default macros
AC_PROG_CC

PCREVERSION=`pcre-config --version`
CMPV="8.0"
AC_MSG_CHECKING([is PCRE version >= ${CMPV}])
AS_VERSION_COMPARE(${PCREVERSION}, ${CMPV}, [PCRE_POST_8_0=-1], [PCRE_POST_8_0=0],[PCRE_POST_8_0=1])    
AS_IF([test "${PCRE_POST_8_0}" != "-1"], AC_MSG_RESULT([yes]), AC_MSG_RESULT([no]))

AC_SUBST(PCRE_POST_8_0)
AC_OUTPUT(src/Makevars)

我认为它很好,因为它是通用的,可以与任何提供命令来检索其版本的程序一起使用。 但是,对于无法直接从shell访问版本的情况,我将牢记adl的诀窍。谢谢!