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() { ...) |
|||
(One intermediate revision by the same user not shown) | |||
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; }' |
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; }'