Foo-version.in

From EjudgeWiki
#!/bin/sh
#
# Подстановка для каталога, из которого будет загружаться файл foo.cfg
LANG_CONFIG_DIR="@lang_config_dir@"
#
# Функция, выводящая параметры ЯП, не зависящие от его наличия в данной инсталляции
function common_config()
{
  echo 'long_name="GNU Foo Interpreter"'
  echo 'src_sfx=".foo"'
  echo 'arch="linux-shared"'
}
#
# Функция, генерирующая содержимое конфигурационного файла в случае ошибки
# при конфигурировании ЯП foo
function failure()
{
  # очищаем за собой временные файлы
  rm -f conftest*
  # генерируем пустую версию
  echo 'version='
  echo 'arg="'"${arg}"'"'
  common_config
  echo 'FOOPATH=/bin/false'
  # в режиме -v довыводим "no"
  [ "${verbose}" = 1 ] && echo "no" >&2
  exit 1
}
#
# Сбрасываем переменные окружения, отвечающие за языковое окружение
# так как они могут влиять на вывод программ, который анализируется нашим скриптом
unset LANG
unset LC_ALL
unset LC_MESSAGES
unset LANGUAGE
#
# Если указана опция -v, включить флаг verbose
if [ x"$1" = x-v ]
then
  verbose=1
  shift
fi
if [ x"$1" = x-r ]
then
  #
  # Режим конфигурирования ЯП (-r)
  arg="$2"
  # Если не задан явный путь к программе foo, устанавливаем его равным foo
  # и расчитываем на то, что эта программа находится где-то в каталогах
  # задаваемых переменной окружения PATH
  [ x"$2" != x ] && foo="$2"
  [ "${foo}" = "" ] && foo="foo"
  # Дополнительный вывод в verbose-режиме
  [ "${verbose}" = 1 ] && echo -n "checking whether GNU Foo Interpreter is available..." >&2
  #
  # Предварительный запуск программы foo. Проверяем, что она вообще запускается
  # и поддерживает опцию --version
  "${foo}" --version >/dev/null 2>&1 || failure
  # Теперь выделяем номер версии из вывода программы
  # Обратите внимание, что правила выделения номера версии зависят от формата вывода,
  # который для разных ЯП не фиксирован, поэтому для нового ЯП здесь может
  # находиться совершенно другая команда
  version=`"${foo}" --version 2>&1 | gawk '{ print $2; }'` || failure
  # Если номер версии выделить не получилось, конфигурация неудачна
  [ "${version}" != "" ] || failure
  #
  # Получаем полный путь к программе foo. Полный путь требуется в конструкции #!,
  # которая помещается в начало программы
  FOOPATH=`which "${foo}"` || failure
  [ "${FOOPATH}" != "" ] || failure
  #
  # Генерируем маленькую программку чтобы проверить работоспособность foo
  echo "#! ${FOOPATH}" > conftest.foo
  echo 'puts "OK"' >> conftest.foo
  chmod +x ./conftest.foo || failure
  #
  # Запускаем ее и проверяем, что код завершения 0
  ./conftest.foo >/dev/null 2>&1 || failure
  #
  # Удаляем рабочие файлы за собой
  rm -f ./conftest*
  # Генерируем содержимое конфигурационного файла
  echo 'version="'"${version}"'"'
  echo 'arg="'"${arg}"'"'
  common_config
  echo 'FOOPATH="'"${FOOPATH}"'"'
  # Дополнительный вывод об успешности конфигурации
  [ "${verbose}" = 1 ] && echo "yes, ${FOOPATH}, ${version}" >&2
  exit 0
fi
#
if [ x"$1" = x-l ]
then
  # Запуск в режиме листинга (-l)
  echo "GNU Foo Interpreter http://gnufoo.org"
  exit 0
fi
#
# Поддерживаем переменную окружения EJUDGE_LANG_CONFIG, с помощью которой
# можно явно задать путь к конфигурационному файлу ЯП
[ "${EJUDGE_LANG_CONFIG}" = "" ] && EJUDGE_LANG_CONFIG="${LANG_CONFIG_DIR}/foo.cfg"
#
# Считываем конфигурационный файл ЯП, если он существует
if [ -f "${EJUDGE_LANG_CONFIG}" ]
then
  . "${EJUDGE_LANG_CONFIG}"
else
  # Некоторый путь по умолчанию, если конфигурационный файл не существует
  FOOPATH="/usr/bin/foo"
fi
#
# Проверка, что ЯП поддерживается в данной инсталляции
if [ x"${FOOPATH}" = x -o x"${FOOPATH}" = x/bin/false ]
then
  echo "This language is not supported." >&2
  exit 1
fi
#
if [ x"$1" = x-p ]
then
  # Режим печати пути к ЯП foo
  echo "${FOOPATH}"
  exit 0
fi
#
# Проверяем, что foo запускается
"${FOOPATH}" --version 2>/dev/null >/dev/null || exit 1
#
# Если требуется полный вывод (опция -f), начинаем печать
[ x"$1" = x-f ] && echo -n "GNU Foo Interpreter "
#
# Извлекаем из вывода номер версии ЯП
# См. комментарий выше
"${FOOPATH}" --version 2>&1 | gawk '{ print $2; }'