#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-хорошее место для начала работы со всеми тонкостями. Он создает действие для создания статической библиотеки из набора объектных файлов с гибкостью для работы со многими цепочками инструментов.