Я пытаюсь написать компилятор, ну, оболочку 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 в цепочку инструментов?
Глядя на 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?
Глядя на python_bootstrap_template.txt#L139 возможно, мне нужно установить
RUNFILES_DIR
через аргумент envpy_binary
?