Использование текущей цепочки инструментов в правиле bazel

#static-libraries #bazel #bazel-rules

Вопрос:

Я использую приведенное ниже правило bazel для создания статических библиотек с помощью bazel:

 def _cc_static_library_impl(ctx):
    cc_deps = [dep[CcInfo] for dep in ctx.attr.deps]
    libraries = []
    for cc_dep in cc_deps:
        for link_input in cc_dep.linking_context.linker_inputs.to_list():
            for library in link_input.libraries:
                libraries  = library.pic_objects
    args = ["r", ctx.outputs.out.path]   [f.path for f in libraries]
    ctx.actions.run(
        inputs = libraries,
        outputs = [ctx.outputs.out],
        executable = "/usr/bin/ar",
        arguments = args,
    )
    return [DefaultInfo()]

cc_static_library = rule(
    implementation = _cc_static_library_impl,
    attrs = {
        "deps": attr.label_list(providers = [CcInfo]),
    },
    outputs = {"out": "lib%{name}.a"},
)
 

Как я могу извлечь команду для использования из текущей цепочки инструментов вместо использования жестко /usr/bin/ar закодированной ? Я основал это правило на том, что нашел в Интернете, и у меня очень ограниченные знания об этом. Этот пример, кажется, делает что-то связанное:
https://github.com/bazelbuild/rules_cc/blob/main/examples/my_c_archive/my_c_archive.bzl

Ответ №1:

Это важная часть my_c_archive :

     archiver_path = cc_common.get_tool_for_action(
        feature_configuration = feature_configuration,
        action_name = CPP_LINK_STATIC_LIBRARY_ACTION_NAME,
    )
 

Это даст вам путь, а затем вам нужно добавить cc_toolchain.all_files его в свой ctx.actions.run вызов, чтобы он выглядел так:

     ctx.actions.run(
        inputs = depset(
            direct = [libraries],
            transitive = [
                cc_toolchain.all_files,
            ],
        ),
        outputs = [ctx.outputs.out],
        executable = archiver_path,
        arguments = args,
    )
 

Однако вы также заметите, что my_c_archive это создает командную строку и переменные среды для вызова архиватора. Простой набор инструментов не будет иметь ничего, что нужно передать ни в одном из них, но более сложный может работать неправильно без их добавления (например, передачи -m32 или настройки PATH ).

Часть реализации cc_import starlark _create_archive_action в cc_import.bzl-хорошее место для начала работы со всеми тонкостями. Он создает действие для создания статической библиотеки из набора объектных файлов с гибкостью для работы со многими цепочками инструментов.