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="Ruby"'
+
   echo 'long_name="GNU Foo Interpreter"'
   echo 'src_sfx=".rb"'
+
   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 'RUBYPATH=/bin/false'
+
   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
 
# recheck the language
 
 
  if [ x"$1" = x-r ]
 
  if [ x"$1" = x-r ]
 
  then
 
  then
 +
  #
 +
  # Режим конфигурирования языка (-r)
 
   arg="$2"
 
   arg="$2"
   [ x"$2" != x ] && ruby="$2"
+
  # Если не задан явный путь к программе foo, устанавливаем его равным foo
   [ "${ruby}" = "" ] && ruby="ruby"
+
  # и расчитываем на то, что эта программа находится где-то в каталогах
 
+
  # задаваемых переменной окружения PATH
   [ "${verbose}" = 1 ] && echo -n "checking whether Ruby is available..." >&2
+
   [ x"$2" != x ] && foo="$2"
   "${ruby}" --version >/dev/null 2>&1 || failure
+
   [ "${foo}" = "" ] && foo="foo"
   version=`"${ruby}" --version 2>&1 | gawk '{ print $2; }'` || failure
+
  # Дополнительный вывод в 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
   RUBYPATH=`which "${ruby}"` || failure
+
   #
   [ "${RUBYPATH}" != "" ] || failure
+
  # Получаем полный путь к программе foo. Полный путь требуется в конструкции #!,
   echo "#! ${RUBYPATH}" > conftest.rb
+
  # которая помещается в начало программы
   echo 'puts "OK"' >> conftest.rb
+
  FOOPATH=`which "${foo}"` || failure
   chmod +x ./conftest.rb || failure
+
   [ "${FOOPATH}" != "" ] || failure
   ./conftest.rb >/dev/null 2>&1 || 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*
 
   rm -f ./conftest*
 +
  # Генерируем содержимое конфигурационного файла
 
   echo 'version="'"${version}"'"'
 
   echo 'version="'"${version}"'"'
 
   echo 'arg="'"${arg}"'"'
 
   echo 'arg="'"${arg}"'"'
 
   common_config
 
   common_config
   echo 'RUBYPATH="'"${RUBYPATH}"'"'
+
   echo 'FOOPATH="'"${FOOPATH}"'"'
   [ "${verbose}" = 1 ] && echo "yes, ${RUBYPATH}, ${version}" >&2
+
  # Дополнительный вывод об успешности конфигурации
 +
   [ "${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 "Ruby interpreter [http://www.ruby-lang.org]"
+
  # Запуск в режиме листинга (-l)
 +
   echo "GNU Foo Interpreter http://gnufoo.org"
 
   exit 0
 
   exit 0
 
  fi
 
  fi
 
+
#
  [ "${EJUDGE_LANG_CONFIG}" = "" ] && EJUDGE_LANG_CONFIG="${LANG_CONFIG_DIR}/ruby.cfg"
+
# Поддерживаем переменную окружения 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
   RUBYPATH="/usr/bin/ruby"
+
   # Некоторый путь по умолчанию, если конфигурационный файл не существует
 +
  FOOPATH="/usr/bin/foo"
 
  fi
 
  fi
 
+
#
  if [ x"${RUBYPATH}" = x -o x"${RUBYPATH}" = xfalse ]
+
# Проверка, что язык поддерживается в данной инсталляции
 +
  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
    echo "${RUBYPATH}"
+
  # Режим печати пути к интерпретатору foo
    exit 0
+
  echo "${FOOPATH}"
 +
  exit 0
 
  fi
 
  fi
 
+
#
  "${RUBYPATH}" --version 2>/dev/null >/dev/null || exit 1
+
# Проверяем, что foo запускается
   
+
  "${FOOPATH}" --version 2>/dev/null >/dev/null || exit 1
  [ x"$1" = x-f ] && echo -n "Ruby "
+
#
 
+
# Если требуется полный вывод (опция -f), начинаем печать
  "${RUBYPATH}" --version 2>&1 | gawk '{ print $2; }'
+
  [ 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; }'