Как предоставить файлы запуска py_binary в цепочку инструментов C в Bazel

Я пытаюсь написать компилятор, ну, оболочку Python для Clang, которая выполняет некоторые функции, специфичные для платформы, в Bazel. Я создал MRE, где могу воспроизвести свою проблему здесь: https://github.com/allsey87/custom_cc_toolchain

Предполагается, что рабочее пространство будет создано с помощью следующей команды:

bazel build --platforms=//:custom_platform //:test

Основываясь на следующем выводе Bazel, я думаю, что мой py_binary был создан и найден, однако в коде оболочки Python Bazel есть ошибочное утверждение:

$ bazel clean --expunge
INFO: Starting clean (this may take a while). Consider using --async if the clean takes more than several minutes.
$ bazel build --verbose_failures --sandbox_debug --platforms=//:custom_platform //:test 
Starting local Bazel server and connecting to it...
WARNING: --enable_bzlmod is set, but no MODULE.bazel file was found at the workspace root. Bazel will create an empty MODULE.bazel file. Please consider migrating your external dependencies from WORKSPACE to MODULE.bazel. For more details, please refer to https://github.com/bazelbuild/bazel/issues/18958.
INFO: Analyzed target //:test (87 packages loaded, 754 targets configured).
ERROR: /workspaces/bazel_test/BUILD:23:10: Compiling empty.c failed: (Exit 1): process-wrapper failed: error executing CppCompile command 
  (cd /home/developer/.cache/bazel/_bazel_developer/e4895a8da4e216f782d166038e1bbca2/sandbox/processwrapper-sandbox/1/execroot/_main && \
  exec env - \
    PATH=/vscode/vscode-server/bin/linux-x64/5437499feb04f7a586f677b155b039bc2b3669eb/bin/remote-cli:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
    PWD=/proc/self/cwd \
    TMPDIR=/tmp \
  /home/developer/.cache/bazel/_bazel_developer/install/937e6e0d806e40997135c14c1d61532a/process-wrapper '--timeout=0' '--kill_delay=15' '--stats=/home/developer/.cache/bazel/_bazel_developer/e4895a8da4e216f782d166038e1bbca2/sandbox/processwrapper-sandbox/1/stats.out' bazel-out/k8-opt-exec-ST-d57f47055a04/bin/clang_wrapper -MD -MF bazel-out/k8-fastbuild/bin/_objs/test/empty.d '-frandom-seed=bazel-out/k8-fastbuild/bin/_objs/test/empty.o' -iquote . -iquote bazel-out/k8-fastbuild/bin -iquote external/bazel_tools -iquote bazel-out/k8-fastbuild/bin/external/bazel_tools -c empty.c -o bazel-out/k8-fastbuild/bin/_objs/test/empty.o)
Traceback (most recent call last):
  File "/home/developer/.cache/bazel/_bazel_developer/e4895a8da4e216f782d166038e1bbca2/sandbox/processwrapper-sandbox/1/execroot/_main/bazel-out/k8-opt-exec-ST-d57f47055a04/bin/clang_wrapper", line 559, in <module>
    Main()
  File "/home/developer/.cache/bazel/_bazel_developer/e4895a8da4e216f782d166038e1bbca2/sandbox/processwrapper-sandbox/1/execroot/_main/bazel-out/k8-opt-exec-ST-d57f47055a04/bin/clang_wrapper", line 457, in Main
    module_space = FindModuleSpace(main_rel_path)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/developer/.cache/bazel/_bazel_developer/e4895a8da4e216f782d166038e1bbca2/sandbox/processwrapper-sandbox/1/execroot/_main/bazel-out/k8-opt-exec-ST-d57f47055a04/bin/clang_wrapper", line 172, in FindModuleSpace
    raise AssertionError('Cannot find .runfiles directory for %s' % sys.argv[0])
AssertionError: Cannot find .runfiles directory for bazel-out/k8-opt-exec-ST-d57f47055a04/bin/clang_wrapper
Target //:test failed to build
INFO: Elapsed time: 5.067s, Critical Path: 0.05s
INFO: 7 processes: 7 internal.
ERROR: Build did NOT complete successfully

Как я могу предоставить этот каталог .runfiles в цепочку инструментов?

Глядя на python_bootstrap_template.txt#L139 возможно, мне нужно установить RUNFILES_DIR через аргумент env py_binary?

mallwright 03.07.2024 18:37
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Глядя на https://github.com/bazelbuild/bazel/blob/674e67bdc3c08b5ac72d5f1ce456bb52766a0f84/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainConfigInfo.java#L56 Я не убедитесь, что цепочка инструментов cc настроена на прием целей, имеющих файлы запуска. Похоже, он ожидает автономные/предварительно скомпилированные двоичные файлы, потому что я не вижу ничего, что отслеживало бы файлы запуска в классах ActionConfig или Tool.

Поэтому наиболее целесообразным будет сделать ваш py_binary автономным исполняемым файлом. В py_binary есть группа вывода под названием ptyhon_zip_file, которая должна создавать самоисполняемый zip-файл Python, но похоже, что существует проблема, из-за которой #!/usr/bin/env python3 не добавляется в zip-файл: https://github.com/bazelbuild/ bazel/issues/17629 Один из обходных путей — добавить хэшбанг в генруле:

py_binary(
  name = "clang_wrapper",
  srcs = ["clang_wrapper.py"],
)
filegroup(
  name = "clang_wrapper_zip",
  srcs = [":clang_wrapper"],
  output_group = "python_zip_file",
)
genrule(
  name = "clang_wrapper_zip_py_executable",
  srcs = [":clang_wrapper_zip"],
  outs = ["clang_wrapper_zip_py_executable.zip"],
  cmd = "echo '#!/usr/bin/env python3' | cat - $< >$@",
  executable = True,
)

custom_cc_toolchain_config_rule(
  name = "custom_toolchain_config",
  compiler = ":clang_wrapper_zip_py_executable"
)

filegroup(name = "empty")

cc_toolchain(
    name = "custom_cc_toolchain",
    all_files = ":empty",
    ar_files = ":empty",
    as_files = ":empty",
    compiler_files = ":clang_wrapper_zip_py_executable",
    dwp_files = ":empty",
    linker_files = ":empty",
    objcopy_files = ":empty",
    strip_files = ":empty",
    toolchain_config = "custom_toolchain_config",
    toolchain_identifier = "custom_toolchain_identifier",
)

Обратите внимание, что это, вероятно, работает только в Linux и Mac — в Windows для создания py_binary используется другой кодовый путь в exe, и правило, вероятно, приведет к сбою всего этого в Windows.

Ха, это немного обидно. Я не думаю, что rules_python дает нам больше гибкости по сравнению с поддержкой Python, встроенной в Bazel?

mallwright 04.07.2024 08:34

Другие вопросы по теме