Специальная компиляция
Навигация: Главная страница/Система ejudge/Использование/Специальная компиляция
Поддерживается с версии 3.10.2.
Некоторые задачи на прораммирование формулируются только для
какого-то одного языка программирования. Если этот язык
уже поддерживается в ejudge, то можно ограничить множество
доступных языков в турнире или воспользоваться конфигурационной
переменной enable_language
.
Если язык не поддерживается в ejudge, можно добавить язык в ejudge на постоянной основе. Но это может быть нецелесообразным или сложным. В этом случае можно воспользоваться механизмом специальной компиляции.
В режиме специальной компиляции задачу можно сдавать только на одном языке
программирования, который называется custom
. Его особенность в том,
что скрипт компиляции, выполняющий компиляцию исходного текста посылки,
задается в каждой задаче независимо от других задач.
Таким образом, язык custom в каждой задаче может означать совершенно разное.
Настройка сервера компиляции ej-compile
Для активации языка custom
необходимо добавить этот
язык программирования в конфигурационный файл compile.cfg
,
который обычно находиться по пути /home/judges/compile/conf/compile.cfg
. В конец списка языков нужно добавить запись:
[language] id = 77 short_name = "custom" long_name = "Custom" src_sfx = ".txt" enable_custom cmd = "custom"
У этого языка должен быть задан параметр
enable_custom
.
Суффикс исходных файлов оставьте .txt
. Команда
компиляции cmd
не важна, но должна быть указана произвольная.
Убедитесь, что идентификатор языка id
, в данном примере 77,
уникален среди идентификаторов языков программирования.
После модификации файла конфигурации потребуется перезапуск ejudge.
Добавление специального языка в турнир
Для использования механизма специальной компиляции в турнире в конфигурационный файл турнира нужно добавить этот язык. В конец списка языков в конфигурационном файле нужно добавить запись
[language] id = 77 short_name = "custom" long_name = "" src_sfx = ".txt" enable_custom
Язык, отмеченный флагом enable_custom
должен быть только один
в списке языков. Этот язык недоступен для выбора в обычных задачах.
Настройка задачи
В задаче со специальной компиляцией должен быть установлен конфигурационный
параметр custom_compile_cmd
. Пример:
[problem] super = "Generic" short_name = "E" long_name = "Custom problem" use_stdin use_stdout use_corr custom_compile_cmd = "compile" custom_lang_name = "bash" standard_checker = "cmp_int"
Конфигурационный параметр custom_compile_cmd
задает имя скрипта компиляции, который будет использоваться
в этой задаче, а параметр custom_lang_name
задает имя языка программирования, отображаемое участнику турнира.
В этой задаче будет доступен только этот язык программирования, независимо
от того, какие языки доступны в турнире в других задачах.
Если не указан полный путь, путь к скрипту компиляции отсчитывается от
каталога задачи. В случае выше скрипт компиляции должен находиться
в каталоге problems/E/compile
каталога турнира. Скрипт
компиляции должен быть доступен на выполнение всем пользователям.
Компиляция программы на специальном языке выполняется, как обычно, компонентом ej-compile. Возможно, что компиляция будет выполняться под другим пользователем и в контейнеризированном окружении. Перед запуском скрипт будет скопирован в рабочий каталог компиляции.
Скрипт компиляции запускается с двумя аргументами командной строки: имя входного файла, содержащего текст программы для компиляции, и имя файла с результатом компиляции, который должен быть самодостаточным исполняемым файлом или скриптом. Например, следующий скрипт "компилирует" программу для bash:
#! /bin/bash -x in="$1" out="$2" > "$out" chmod 700 "$out" echo "#! /bin/bash" >> "$out" echo >> "$out" cat "$in" >> "$out"
Он, в общем, не отличается от скриптов компиляции для обычных скриптовых языков, которые доступны в системе. Но возможны и более сложные скрипты компиляции.
Если модифицируется конфигурационный файл турнира serve.cfg, не забывайте перезагружать настройки турнира в сервере с помощью кнопки "Reload contest settings".