Difference between revisions of "Специальная компиляция"
(Created page with "Навигация: Главная страница/Система ejudge/Использование/Специальная компиляция П...") |
(...) |
||
| 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".