2013-09-19 3 views
1

У меня есть немного тайны в сценарии autoconf, в частности AS_IF.autoconf AS_IF не выполняет правильную ветвь

Вот соответствующий код:

AC_CHECK_FUNCS([eventfd], [AC_DEFINE([NN_HAVE_EVENTFD])]) 
AC_CHECK_FUNCS([pipe], [AC_DEFINE([NN_HAVE_PIPE])]) 
AC_CHECK_FUNCS([pipe2], [ 
    AC_DEFINE([NN_HAVE_PIPE2]) 
    CPPFLAGS="$CPPFLAGS -D_GNU_SOURCE" 
]) 
AC_SEARCH_LIBS([socketpair], [], [AC_DEFINE([NN_HAVE_SOCKETPAIR])]) 

т.е. проверки их существования. Они работают правильно и определяют правильные символы. В этом случае определяется только NN_HAVE_PIPE и NN_HAVE_SOCKETPAIR, что является правильным, так как это система HP-UX.

Теперь к загадочной части. Позже в configure.ac, есть условное со ссылкой на эти символы:

echo "ac_cv_func_eventfd: $ac_cv_func_eventfd" 
AS_IF([test x"$ac_cv_func_eventfd"=xyes], [ 
    AC_DEFINE([NN_USE_EVENTFD])], [ 
    AS_IF([test x"$ac_cv_func_pipe"=xyes], [ 
     AC_DEFINE([NN_USE_PIPE])], [ 
     AS_IF([test x"$ac_cv_func_socketpair"=xyes], [ 
      AC_DEFINE([NN_USE_SOCKETPAIR])], [ 
      AC_MSG_ERROR([No signaling supported]) 
     ]) 
    ]) 
]) 

ac_cv_func_eventfd Несмотря на то, имеет значение no (я добавил эхо линии, чтобы убедиться), NN_USE_EVENTFD получает определенную в любом случае!

Как AS_IF макрос определяется как таковой:

AS_IF (test1, [run-if-true1], ..., [run-if-false]) 

Для меня код кажется совершенно правильным, нет? Есть ли кто-нибудь, кто может пролить свет на это поведение?

Autoconf версия 2.67. ОС - HP-UX 11.31 ia64.

ответ

2

Не совсем правильно. Вы должны исправить AS_IF тест из:

test x"$ac_cv_func_eventfd"=xyes 

в

test x"$ac_cv_func_eventfd" = xyes 

Примечание вставки пробелов вокруг =. То же самое касается других тестов в другом AS_IF s.

Чтобы убедиться в этом, вы можете попробовать увидеть в командной строке:

if test x"no"=xyes; then echo "yes"; else echo "no"; fi 

против

if test x"no" = xyes; then echo "yes"; else echo "no"; fi 
+0

гм ... да, теперь, когда вы упоминаете, что всегда имеет место в shell scripting ... Не думал об этом :( – pythonator

+0

Все 'AS_IF' завершают код сценария оболочки для переносимости. То же самое можно сказать и о большей части остальных макросов autoconf (M4sh, M4sugar, .m4). 'configure' - это просто большой скрипт оболочки. – ldav1s

 Смежные вопросы

  • Нет связанных вопросов^_^