以下の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