Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Переменные окружения для компиляторов: EJUDGE_ADD_FLAGS, EJUDGE_ADD_LIBS #125

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

vvd170501
Copy link
Contributor

С помощью новых переменных в задаче можно добавить флаги компилятора или библиотеки, не перезаписывая стандартный список флагов/библиотек, применяющийся для языка.

Пример файла serve.cfg:

[language]
id = 2
short_name = "gcc"
long_name = "GNU C 11.3.0"
src_sfx = ".c"
compiler_env = "EJUDGE_FLAGS=-O2 -Wall -Werror -std=gnu11"

...

# Задача с компиляцией решения из нескольких файлов
[problem]
short_name = "test problem"
...
enable_language = "gcc"
# Старый вариант: нужно скопировать все флаги языка, сложно добавить новый флаг для всех задач (его нужно продублировать во всех задачах с переопределёнными флагами)
# lang_compiler_env = "gcc=EJUDGE_FLAGS=-O2 -Wall -Werror -std=gnu11 ${problem.problem_dir}/main.c"
# Новый вариант
lang_compiler_env = "gcc=EJUDGE_ADD_FLAGS=${problem.problem_dir}/main.c"

# Задача с UBSan
[problem]
short_name = "test problem"
...
enable_language = "gcc"
# lang_compiler_env = "gcc=EJUDGE_FLAGS=-O2 -Wall -Werror -std=gnu11 -fsanitize=undefined -fno-sanitize-recover=all"
lang_compiler_env = "gcc=EJUDGE_ADD_FLAGS=-fsanitize=undefined -fno-sanitize-recover=all"

@vvd170501
Copy link
Contributor Author

Где ещё применяется EJUDGE_FLAGS:

  1. if (!strncmp(lang->compiler_env[j], "EJUDGE_FLAGS=", 13)) {

    Вроде парсинг конфигов. Если я правильно понимю, здесь используются только глобальные флаги (на уровне языка).
    Ещё странный момент:
    sstate->lang_libs[lang->id] = xstrmerge1(sstate->lang_libs[lang->id], lang->compiler_env[j] + 12);

    Если у EJUDGE_FLAGS или EJUDGE_LIBS есть несколько значений, то они конкатенируются? Пока не понял, где это отображается. В скрипты для компиляции попадает только последнее значение переменной.

  2. if (!strncmp(lang->compiler_env[i], "EJUDGE_FLAGS=", 13)

    Unparse конфигов, вроде тоже только глобальные флаги.

  3. static const unsigned char compiler_flags_prefix[] = "EJUDGE_FLAGS=";

    Используется в генерации мейкфайлов для задач. Не сосем уверен, но похоже, что здесь тоже только глобальные флаги. Протестировать генерацию не получиллось, пока не стал трогать этот файл.

  4. if (!strncmp(lang->compiler_env[i], "EJUDGE_FLAGS=", 13)) {

    Опции компиляторов на главной странице, здесь ничего дописывать не нужно.

  5. ejudge_flags = getenv("EJUDGE_FLAGS");

    Для javac флаги из EJUDGE_ADD_FLAGS добавляются в scripts/javac.in и scripts/javac7.in.

@avm
Copy link
Contributor

avm commented Sep 23, 2024

Если починить конфликты, получится ли это помержить?

@blackav
Copy link
Owner

blackav commented Sep 30, 2024

Я постараюсь посмотреть после реализации более приоритетных вещей

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants