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