bazel rules 获取所有deps依赖的资源或者整个依赖链路

目录结构:
image.png

BUILD

load(":getdeps.bzl", "getdeps")
getdeps(
    name = "testA",
    srcs = ["a.txt"],
    deps = [":testB"]
)
getdeps(
    name = "testB",
    srcs = ["b.txt"],
    deps = [":testC"]
)
getdeps(
    name = "testC",
    srcs = ["c.txt"],
)
如果只是获取当前target的资源, 以及依赖了哪些 就是下面的代码:

getdeps.bzl

def _getdeps(ctx):
    srcs = ctx.attr.srcs
    deps = ctx.attr.deps
    print("srcs:",srcs)
    print("deps:",deps)
    
getdeps = rule(
    implementation = _getdeps,
    attrs = {
        "srcs":attr.label_list(allow_files = True),
        "deps":attr.label_list(),
    }

)

调用 bazel build //getDeps:testB

image.png

能看到每个target的srcs 和deps , 都是BUILD里面写的一样
下面让我们来获取所有的srcs 或者deps
image.png

代码

FooFiles = provider(fields = ["getDeps", "getSrcs"])

获取目标及其传递依赖项的源文件。

#参数:
#src:源文件的列表
#Deps:直接依赖的目标列表
#返回:
#传递源的集合
def get_transitive_srcs(srcs,deps): 
     return depset(
            srcs,
            transitive = [dep[FooFiles].getSrcs for dep in deps],
        )


def get_transitive_srcs2(srcs,deps): 
     return depset(
            deps,
            transitive = [dep[FooFiles].getDeps for dep in deps],
        )


def _getdeps(ctx):
    print("---------%s---------"%(ctx.attr.name))
    srcs = ctx.attr.srcs
    deps = ctx.attr.deps

    trans_srcs = get_transitive_srcs(srcs,deps)
    trans_deps = get_transitive_srcs2(srcs,deps)
    print("trans_srcs:",trans_srcs)
    print("trans_deps:",trans_deps)
    print("---------%s---------\n\n\n"%(ctx.attr.name))

    return [
        FooFiles(getSrcs = trans_srcs,getDeps = trans_deps),
    ]


    
getdeps = rule(
    implementation = _getdeps,
    attrs = {
        "srcs":attr.label_list(allow_files = True),
        "deps":attr.label_list(),
    }
)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概念和术语 说明 本文档概述了Bazel构建源代码树形结构和Bazel中使用的术语。翻译来源:https://do...
    YottaYuan阅读 2,738评论 0 2
  • Change log 目录 [bazel]-导读[https://www.jianshu.com/p/727cbf...
    Sunxxxxx丶阅读 53,473评论 1 8
  • 官网:https://www.bazel.build[https://www.bazel.build/]Githu...
    贰爷阅读 938评论 0 0
  • 简介 Bazel是一个类似于Make,Maven和Gradle的开源构建和测试工具。Bazel支持多种语言混编的项...
    小村医阅读 35,464评论 0 10
  • 原文:http://bazel.io/docs/getting-started.html 译者:chai2010 ...
    chai2010阅读 54,403评论 3 15