Difference between revisions of "Foo-version.in"
From EjudgeWiki
Line 4: | Line 4: | ||
LANG_CONFIG_DIR="@lang_config_dir@" | LANG_CONFIG_DIR="@lang_config_dir@" | ||
# | # | ||
− | # Функция, выводящая параметры | + | # Функция, выводящая параметры ЯП, не зависящие от его наличия в данной инсталляции |
function common_config() | function common_config() | ||
{ | { | ||
Line 13: | Line 13: | ||
# | # | ||
# Функция, генерирующая содержимое конфигурационного файла в случае ошибки | # Функция, генерирующая содержимое конфигурационного файла в случае ошибки | ||
− | # при конфигурировании | + | # при конфигурировании ЯП foo |
function failure() | function failure() | ||
{ | { | ||
Line 29: | Line 29: | ||
# | # | ||
# Сбрасываем переменные окружения, отвечающие за языковое окружение | # Сбрасываем переменные окружения, отвечающие за языковое окружение | ||
− | # так как они могут влиять на вывод программ, который анализируется | + | # так как они могут влиять на вывод программ, который анализируется нашим скриптом |
unset LANG | unset LANG | ||
unset LC_ALL | unset LC_ALL | ||
Line 44: | Line 44: | ||
then | then | ||
# | # | ||
− | # Режим конфигурирования | + | # Режим конфигурирования ЯП (-r) |
arg="$2" | arg="$2" | ||
# Если не задан явный путь к программе foo, устанавливаем его равным foo | # Если не задан явный путь к программе foo, устанавливаем его равным foo | ||
Line 59: | Line 59: | ||
# Теперь выделяем номер версии из вывода программы | # Теперь выделяем номер версии из вывода программы | ||
# Обратите внимание, что правила выделения номера версии зависят от формата вывода, | # Обратите внимание, что правила выделения номера версии зависят от формата вывода, | ||
− | # который для разных | + | # который для разных ЯП не фиксирован, поэтому для нового ЯП здесь может |
# находиться совершенно другая команда | # находиться совершенно другая команда | ||
version=`"${foo}" --version 2>&1 | gawk '{ print $2; }'` || failure | version=`"${foo}" --version 2>&1 | gawk '{ print $2; }'` || failure | ||
Line 98: | Line 98: | ||
# | # | ||
# Поддерживаем переменную окружения EJUDGE_LANG_CONFIG, с помощью которой | # Поддерживаем переменную окружения EJUDGE_LANG_CONFIG, с помощью которой | ||
− | # можно явно задать путь к конфигурационному файлу | + | # можно явно задать путь к конфигурационному файлу ЯП |
[ "${EJUDGE_LANG_CONFIG}" = "" ] && EJUDGE_LANG_CONFIG="${LANG_CONFIG_DIR}/foo.cfg" | [ "${EJUDGE_LANG_CONFIG}" = "" ] && EJUDGE_LANG_CONFIG="${LANG_CONFIG_DIR}/foo.cfg" | ||
# | # | ||
− | # Считываем конфигурационный файл | + | # Считываем конфигурационный файл ЯП, если он существует |
if [ -f "${EJUDGE_LANG_CONFIG}" ] | if [ -f "${EJUDGE_LANG_CONFIG}" ] | ||
then | then | ||
Line 110: | Line 110: | ||
fi | fi | ||
# | # | ||
− | # Проверка, что | + | # Проверка, что ЯП поддерживается в данной инсталляции |
if [ x"${FOOPATH}" = x -o x"${FOOPATH}" = x/bin/false ] | if [ x"${FOOPATH}" = x -o x"${FOOPATH}" = x/bin/false ] | ||
then | then | ||
Line 119: | Line 119: | ||
if [ x"$1" = x-p ] | if [ x"$1" = x-p ] | ||
then | then | ||
− | # Режим печати пути к | + | # Режим печати пути к ЯП foo |
echo "${FOOPATH}" | echo "${FOOPATH}" | ||
exit 0 | exit 0 | ||
Line 130: | Line 130: | ||
[ x"$1" = x-f ] && echo -n "GNU Foo Interpreter " | [ x"$1" = x-f ] && echo -n "GNU Foo Interpreter " | ||
# | # | ||
− | # Извлекаем из вывода номер версии | + | # Извлекаем из вывода номер версии ЯП |
# См. комментарий выше | # См. комментарий выше | ||
"${FOOPATH}" --version 2>&1 | gawk '{ print $2; }' | "${FOOPATH}" --version 2>&1 | gawk '{ print $2; }' |
Latest revision as of 10:23, 8 August 2008
#!/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; }'