Я пытаюсь написать собственное правило для компиляции кода C ++ с использованием API cc_common.Вот моя текущая попытка реализации:
load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain")
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "C_COMPILE_ACTION_NAME")
def _impl(ctx):
cc_toolchain = find_cpp_toolchain(ctx)
feature_configuration = cc_common.configure_features(
cc_toolchain = cc_toolchain,
unsupported_features = ctx.disabled_features,
)
compiler = cc_common.get_tool_for_action(
feature_configuration=feature_configuration,
action_name=C_COMPILE_ACTION_NAME
)
compile_variables = cc_common.create_compile_variables(
feature_configuration = feature_configuration,
cc_toolchain = cc_toolchain,
)
compiler_options = cc_common.get_memory_inefficient_command_line(
feature_configuration = feature_configuration,
action_name = C_COMPILE_ACTION_NAME,
variables = compile_variables,
)
outfile = ctx.actions.declare_file("test.o")
args = ctx.actions.args()
args.add_all(compiler_options)
ctx.actions.run(
outputs = [outfile],
inputs = ctx.files.srcs,
executable = compiler,
arguments = [args],
)
return [DefaultInfo(files = depset([outfile]))]
Однако, это терпит неудачу с ошибкой "execvp(external/local_config_cc/wrapped_clang, ...)": No such file or directory
.Я предполагаю, что это потому, что get_tool_for_action
возвращает строку, представляющую путь, а не объект File, поэтому Bazel не добавляет wrapped_clang
в песочницу.Выполнение правила с отключенной изолированной программной средой, кажется, подтверждает это, поскольку оно успешно завершается.
Есть ли способ реализовать это пользовательское правило без отключения изолированной программной среды?