2011-12-07 43 views
1

我想在configure.in腳本中測試某些軟件包(例如PCRE)的版本,並相應地在Makefile中定義C++變量。我認爲autoconf函數m4_version_compare可以做到這一點,但我無法讓它工作。我相信我沒有正確使用它。 我在configure.in如下:m4_version_compare沒有看到變量

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.我應該用另一種方式定義這個變量嗎?怎麼樣? 謝謝。

雷諾

回答

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]) 
+0

我正要更新我的問題。感謝您的解釋,我最終使用AS_VERSION_COMPARE工作。現在將發佈我的答案。 – Renaud

2

我使用AS_VERSION_COMPARE這方面的工作,這是在運行時運行(與m4_version_compare,由ADL指出)。所以,我最終使用了實現這一目標的代碼是:

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) 

我認爲這是很好的,因爲它是通用的,將提供一個命令檢索其版本的任何程序中工作。 但是我會記住adl的訣竅,它不能從shell直接訪問版本。謝謝!