Пользовательское правило C ++ с API cc_common - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь написать собственное правило для компиляции кода 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 в песочницу.Выполнение правила с отключенной изолированной программной средой, кажется, подтверждает это, поскольку оно успешно завершается.

Есть ли способ реализовать это пользовательское правило без отключения изолированной программной среды?

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Bazel не добавляет файлы в качестве входных данных действия автоматически, вы должны делать это явно, как вы это делали во втором подходе (ctx.attr._cc_toolchain.files).При этом ctx.actions.run должно работать просто отлично.

0 голосов
/ 22 октября 2018

Если вы используете ctx.actions.run_shell, вы можете добавить файлы, связанные с цепочкой инструментов, к входу (ctx.attr._cc_toolchain.files).Также вы захотите добавить переменные среды компилятора.Например,

srcs = depset(ctx.files.srcs)
tools = ctx.attr._cc_toolchain.files
...
compiler_env = cc_common.get_environment_variables(
   feature_configuration = feature_configuration,
   action_name = C_COMPILE_ACTION_NAME,
   variables = compiler_variables,
)
...
args = ctx.actions.args()
args.add_all(compiler_options)
ctx.actions.run_shell(
    outputs = [outfile],
    inputs = depset(transitive = [srcs, tools]), # Merge src and tools depsets
    command = "{compiler} $*".format(compiler = compiler),
    arguments = [args],
    env = compiler_env,
)
...