Difference between revisions of "Специальная компиляция"

From EjudgeWiki
 
(...)
Line 2: Line 2:
  
 
Поддерживается с версии [[Изменения в версии 3.10.2|3.10.2]].
 
Поддерживается с версии [[Изменения в версии 3.10.2|3.10.2]].
 +
 +
Некоторые задачи на прораммирование формулируются только для
 +
какого-то одного языка программирования. Если этот язык
 +
уже поддерживается в ejudge, то можно ограничить множество
 +
доступных языков в турнире или воспользоваться конфигурационной
 +
переменной <code>[[serve.cfg:problem:enable_language|enable_language]]</code>.
 +
 +
Если язык не поддерживается в ejudge, можно [[Добавление нового языкового процессора|добавить язык в ejudge]] на постоянной основе. Но это может быть
 +
нецелесообразным или сложным. В этом случае можно воспользоваться
 +
механизмом специальной компиляции.
 +
 +
В режиме специальной компиляции задачу можно сдавать только на одном языке
 +
программирования, который называется <code>custom</tt>. Его особенность в том,
 +
что скрипт компиляции, выполняющий компиляцию исходного текста посылки,
 +
задается в каждой задаче независимо от других задач.
 +
Таким образом, язык custom в каждой задаче может означать совершенно разное.
 +
 +
=== Настройка сервера компиляции ej-compile ===
 +
 +
Для активации языка <code>custom</code> необходимо добавить этот
 +
язык программирования в конфигурационный файл <code>compile.cfg</code>,
 +
который обычно находиться по пути <code>/home/judges/compile/conf/compile.cfg</code>. В конец списка языков нужно добавить запись:
 +
 +
[language]
 +
id = 77
 +
short_name = "custom"
 +
long_name = "Custom"
 +
src_sfx = ".txt"
 +
enable_custom
 +
cmd = "custom"
 +
 +
У этого языка должен быть задан параметр
 +
<code>[[serve.cfg:language:enable_custom|enable_custom]]</code>.
 +
Суффикс исходных файлов оставьте <code>.txt</code>. Команда
 +
компиляции <code>cmd</code> не важна, но должна быть указана произвольная.
 +
 +
Убедитесь, что идентификатор языка <code>id</code>, в данном примере 77,
 +
уникален среди идентификаторов языков программирования.
 +
 +
После модификации файла конфигурации потребуется перезапуск ejudge.
 +
 +
=== Добавление специального языка в турнир ===
 +
 +
Для использования механизма специальной компиляции в турнире
 +
в конфигурационный файл турнира нужно добавить этот язык.
 +
В конец списка языков в конфигурационном файле нужно добавить запись
 +
 +
[language]
 +
id = 77
 +
short_name = "custom"
 +
long_name = ""
 +
src_sfx = ".txt"
 +
enable_custom
 +
 +
Язык, отмеченный флагом <code>enable_custom</code> должен быть только один
 +
в списке языков. Этот язык недоступен для выбора в обычных задачах.
 +
 +
=== Настройка задачи ===
 +
 +
В задаче со специальной компиляцией должен быть установлен конфигурационный
 +
параметр <code>[[Serve.cfg:problem:custom_compile_cmd|custom_compile_cmd]]</code>. Пример:
 +
 +
[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"
 +
 +
Конфигурационный параметр <code>[[Serve.cfg:problem:custom_compile_cmd|custom_compile_cmd]]</code> задает имя скрипта компиляции, который будет использоваться
 +
в этой задаче, а параметр <code>[[Serve.cfg:problem:custom_lang_name|custom_lang_name]]</code> задает имя языка программирования, отображаемое участнику турнира.
 +
В этой задаче будет доступен только этот язык программирования, независимо
 +
от того, какие языки доступны в турнире в других задачах.
 +
 +
Если не указан полный путь, путь к скрипту компиляции отсчитывается от
 +
каталога задачи. В случае выше скрипт компиляции должен находиться
 +
в каталоге <code>problems/E/compile</code> каталога турнира. Скрипт
 +
компиляции должен быть доступен на выполнение всем пользователям.
 +
 +
Компиляция программы на специальном языке выполняется, как обычно,
 +
компонентом [[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".

Revision as of 06:01, 25 March 2023

Навигация: Главная страница/Система 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".