m4_version_compare не видит переменную - PullRequest
1 голос
/ 07 декабря 2011

Я хочу протестировать версию некоторого пакета (например, PCRE) в скрипте configure.in и соответствующим образом определить переменные C ++ в Makefile.Я думал, что функция 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 ]

3 голосов
/ 08 декабря 2011

Вы не можете использовать m4_version_compare для сравнения номеров версий, найденных в configure -time.

Макрос m4_version_compare принимает две строки, которые должны быть известны во время выполнения autoconf для создания сценария configure. Здесь вы сравниваете строку PCREVERSION со строкой 8.0, и первая, как сообщается, меньше последней.

На самом деле вы хотели бы использовать значение переменной оболочки с именем PCREVERSION, то есть $PCREVERSION, к сожалению, это значение известно только при запуске ./configure, поэтому оно не будет работать.

Вы должны сделать свое собственное сравнение, используя оболочку или другие средства. Лично я бы положился на 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])
2 голосов
/ 08 декабря 2011

Я получил это с помощью 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 для случая, когда версия не доступна напрямую из оболочки. Спасибо!

...