微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 bazel 规则中使用当前工具链

如何解决在 bazel 规则中使用当前工具链

我已经使用以下 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

解决方法

这是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),更复杂的工具链可能无法正常工作。

_create_archive_action in cc_import.bzlcc_import 的部分实现是处理所有复杂问题的好起点。它创建了一个操作来从一组目标文件生成一个静态库,并且可以灵活地使用许多工具链。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。