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; }'