У меня есть немного тайны в сценарии 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.
гм ... да, теперь, когда вы упоминаете, что всегда имеет место в shell scripting ... Не думал об этом :( – pythonator
Все 'AS_IF' завершают код сценария оболочки для переносимости. То же самое можно сказать и о большей части остальных макросов autoconf (M4sh, M4sugar, .m4). 'configure' - это просто большой скрипт оболочки. – ldav1s