Автоматическая проверка программы и ошибка, если она не найдена - PullRequest
15 голосов
/ 20 сентября 2011

Я создаю проект и использую инструменты GNU Autoconf для настройки и создания. Я настроил все проверки своей библиотеки и файла заголовка, но, похоже, не могу понять, как проверить, существует ли исполняемый файл в системе, и дать сбой, если он не существует.

Я пробовал:

AC_CHECK_PROG(TEST,testprogram,testprogram,AC_MSG_ERROR(Cannot find testprogram.))

Когда я configure работает и выдает:

Checking for testprogram... find: `testprogram. 15426 5 ': No such file or directory

но не подводит.

Ответы [ 6 ]

24 голосов
/ 21 сентября 2011

Я нашел, что это самый короткий подход.

AC_CHECK_PROG(FFMPEG_CHECK,ffmpeg,yes)
AS_IF([test x"$FFMPEG_CHECK" != x"yes"], [AC_MSG_ERROR([Please install ffmpeg before configuring.])])
10 голосов
/ 20 сентября 2011

Попробуйте это то, что я только что поднял из моего проекта, он ищет что-то под названием quantlib-config в пути:

# borrowed from a check for gnome in GNU gretl: def. a check for quantlib-config
AC_DEFUN(AC_PROG_QUANTLIB, [AC_CHECK_PROG(QUANTLIB,quantlib-config,yes)])
AC_PROG_QUANTLIB
if test x"${QUANTLIB}" == x"yes" ; then
    # use quantlib-config for QL settings
    [.... more stuff omitted here ...]
else
    AC_MSG_ERROR([Please install QuantLib before trying to build RQuantLib.])
fi
4 голосов
/ 08 мая 2013

Аналогично вышеописанному, но имеет преимущество в том, что также может взаимодействовать с automake путем экспорта переменной условия

AC_CHECK_PROG([ffmpeg],[ffmpeg],[yes],[no])
AM_CONDITIONAL([FOUND_FFMPEG], [test "x$ffmpeg" = xyes])
AM_COND_IF([FOUND_FFMPEG],,[AC_MSG_ERROR([required program 'ffmpeg' not found.])])
2 голосов
/ 03 апреля 2016

При использовании AC_CHECK_PROG это самая краткая версия, с которой я столкнулся:

AC_CHECK_PROG(BOGUS,[bogus],[bogus],[no])
test "$BOGUS" == "no" && AC_MSG_ERROR([Required program 'bogus' not found.])

Если программа отсутствует, будут сгенерированы следующие выходные данные:

./configure
...cut...
checking for bogus... no
configure: error: Required program 'bogus' not found.

Или в сочетании со встроенными программами автоматической проверки, используйте вместо этого:

AC_PROG_YACC
AC_PROG_LEX

test "$YACC" == ":" && AC_MSG_ERROR([Required program 'bison' not found.])
test "$LEX" == ":" && AC_MSG_ERROR([Required program 'flex' not found.])
1 голос
/ 26 марта 2019

Это не совсем короткий подход, это скорее общий подход (хотя, когда есть десятки программ для проверки, это может быть и самый короткий подход).Он взят из моего проекта (префикс NA_ означает « N ot A utotools»).

Макрос общего назначения

dnl  ***************************************************************************
dnl  NA_REQ_PROGS(prog1, [descr1][, prog2, [descr2][, etc., [...]]])
dnl
dnl  Checks whether one or more programs have been provided by the user or can
dnl  be retrieved automatically. For each program `progx` an uppercase variable
dnl  named `PROGX` containing the path where `progx` is located will be created.
dnl  If a program is not reachable and the user has not provided any path for it
dnl  an error will be generated. The program names given to this function will
dnl  be advertised among the `influential environment variables` visible when
dnl  launching `./configure --help`.
dnl  ***************************************************************************
AC_DEFUN([NA_REQ_PROGS], [
    m4_if([$#], [0], [], [
        AC_ARG_VAR(m4_translit([$1], [a-z], [A-Z]), [$2])
        AS_IF([test "x@S|@{]m4_translit([$1], [a-z], [A-Z])[}" = x], [
            AC_PATH_PROG(m4_translit([$1], [a-z], [A-Z]), [$1])
            AS_IF([test "x@S|@{]m4_translit([$1], [a-z], [A-Z])[}" = x], [
                AC_MSG_ERROR([$1 utility not found])
            ])
        ])
        m4_if(m4_eval([$# + 1 >> 1]), [1], [], [NA_REQ_PROGS(m4_shift2($*))])
    ])
])

Пример использования

NA_REQ_PROGS(
    [find],             [Unix find utility],
    [xargs],            [Unix xargs utility],
    [customprogram],    [Some custom program],
    [etcetera],         [Et cetera]
)

Так что в течение Makefile.am вы можете сделать

$(XARGS)

или

$(CUSTOMPROGRAM)

и т. д.

Функции

  • Он объявляет программы среди «влиятельных переменных среды», видимых приконечный пользователь запускает ./configure --help, так что может быть предоставлен альтернативный путь к программе
  • Переменная bash с именем с тем же именем программы, но в верхнем регистре, содержащим путь, где находится программа,
  • Ошибка возникает, если какая-либо из указанных программ не была найдена, и пользователь не указал для них альтернативный путь
  • Макрос может принимать бесконечные (пары) аргументов

Когда вы должны его использовать

  1. Когда программы для тестированияТед очень важен для компиляции вашего проекта, так что пользователь должен иметь возможность указать для него альтернативный путь, и должна появиться ошибка, если хотя бы одна программа вообще не доступна
  2. Когда условие № 1 применяется кболее чем одна программа, в этом случае нет необходимости писать макрос общего назначения, и вы должны просто использовать собственный настраиваемый код
1 голос
/ 04 апреля 2014

Наткнулся здесь при поиске этой проблемы, я должен отметить, что если вы хотите, чтобы ваша программа просто смотрела в pathm, достаточно теста во время выполнения:

if ! which programname >/dev/null ; then
   AC_MSG_ERROR([Missing programname]
fi
...