LINUX.ORG.RU

autotool, макро


0

0

Каким макросом проверить, установлен ли определённый пакет в системе? Даже не так, точнее - присутствует ли в $PATH искомая выполняемая программа.
То есть нужно что-то вроде 

???_CHECK_???(gnuplot,
             [AC_DEFINE([HAVE_GNUPLOT],,[plotting via gnuplot])],
             [AC_MSG_RESULT(no)])

Т.е. чтобы проверяло на наличие gnuplot, но не вываливалось с ошибкой, если его не найдёт.
anonymous

AC_PATH_PROG(GNUPLOT, gnuplot)

if [ test -z "$GNUPLOT" ];
then
    AC_MSG_WARN([GNUPLOT support is disabled]);
else
    AC_DEFINE([HAVE_GNUPLOT],,[plotting via gnuplot])
    AC_DEFINE_UNQUOTED(GNUPLOT, "$GNUPLOT", [gnuplot path])
fi

alex_custov ★★★★★
()
Ответ на: комментарий от alex_custov

Поаккуратнее с [ и ]

> if [ test -z "$GNUPLOT" ];

У Вас тут весьма забавный глючок.

$ [ test -z "$GNUPLOT" ]
-bash: [: -z: binary operator expected

Так что идеологически (и синтаксически) верно писать так:

if test -z "$GNUPLOT";

Забавно, что Ваш код таки будет работать. А все потому, что символы
[] -- это quotes. Потому после того, как макрос будет обработан m4, вместо
ошибочного

if [ test -z "$GNUPLOT" ];

получится синтаксически (в данном случае -- и семантически) правильный
вариант

if test -z "$GNUPLOT";

НО! Не всегда так везет. Иногда получается явно неправильный (синтаксически)
shell код. И это еще ничего. Хуже, если синтаксис верный, а смысл совсем
не тот, что изначально подразумевался. Пример:

cv_rlversion=`sed -e 's/[^0-9.]//g' 'conftest.out'`

m4 "съест" [], потому смысл будет совсем иной, чем хотелось. Правильно
будет так

cv_rlversion=`sed -e 's/[[^0-9.]]//g' 'conftest.out'`

Dselect ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.