Bazel responsitory_rule 创建一个 rule

bazel

respository_rule

主要功能是创建一个workspace 空间。对于package 内部的BUILD.tpl文件target 可以使用 responsity_ctx.file("//package") 创建 BUILD文件,或者repository_ctx.template(“BUILD”, build_tpl, {})对BUILD文件进行修改,然后通过@< name>//package:target 进行引用。
这个rule 当你创建的时候就会加载,这时Bazel 就会运行rule里面的
implementation 函数,这个implementation 函数描述了如何创建responsity、内容和BUILD文件。

一个简单的例子:

# 环境变量
_ENVIRONS = [
    _GCC_HOST_COMPILER_PATH,
    "GCC_HOST_COMPILER_PATH",
    "GCC_HOST_COMPILER_PREFIX",
    "TF_NEED_CUDA",
    "TF_CUDA_CLANG",
    "TF_CUDA_PATHS",
    "NVVMIR_LIBRARY_DIR",
]   

def raw_exec(responsitory_ctx, cmdline):
    # 使用 responsitory_ctx.execute() 执行cmdline
    return responsotory_ctx.execute(cmdline)

def get_cpu_value(responsitory_ctx):
    # 获取系统类型
    if is_windows(responsitory_ctx):
        return "Windows"
    # 如果是mac os ,result 是 Darwin
    # linux 系统, result 是 Linux    
    result = raw_exe(responsitory_ctx, ["uname", "-s"])
    return result.stdout.strip()

# 加载template 文件
def _tpl(responsitory_ctx, tpl, substitutions = {}, out=None):
    if not out:
        out = tpl.replace(":", "/")
    respinsitory_ctx.template(
        out,
        Label("//example/%s.tpl" % tpl),
        substitutions,
    )


def _create_local_responsity(responsitory_ctx):
    cpu_value = get_cpu_value()
    # 加载template 文件,替换文件中的 %{cuda_is_configure}为 指定的值
    _tpl(respinsitory_ctx,
        "cuda:build_defs.bzl",
        {
            "%{cuda_is_configure}": "False"
        }
    )
    # 创建文件 "cuda/cuda/include/cuda.h"
    repository_ctx.file("cuda/cuda/include/cuda.h")


example_configure = respository_rule(
    implementation = _create_local_responsity,
    environ =_ENVIRONS,
    remotable = True,
    attrs = {
        "environ": attr.string_dict(),
    } 

)

定义了example_configue,首先就可以在bzl函数中执行

example_configure(name="example_local")

然后在bazel 或者BUILD文件中,可以引用

load(
    "@example//:build_defs.bzl",
    "some_library",
)

热门文章

暂无图片
编程学习 ·

【数据结构与算法】排序算法之冒泡排序(C++、Python)

原理介绍: 假设有长度为n的数组a,按照从小到大的顺序进行排序。冒泡排序的思路为:首先从数组的第一个元素开始,对数组中相邻的两个元素进行比较大小。如果左边(即索引数字小的)元素的值大于右边的元素,则交换这两个元素在数组中的位置,一直到最后一个元素为止。此时数组…
暂无图片
编程学习 ·

kafka+zookeeper消息队列

软件包提取码:u3s1 kafka: 起初是做采集日志的,和zookeeper一起才能做消息队列,可持久化。kafka broker(server): 消息中间件处理的节点 一个Kafka节点就是一个broker(server) topic = vhost -类消息 对消息进行分类主题-个类型-个主题topic可以有多个 partition = que…
暂无图片
编程学习 ·

Layui实现动态加载Tree

目录前言实现步骤初步准备构建data数据源 前言有空研究了一下Layui,感觉相对于EasyUI来说,美观了不少,结合后台加载动态Tree带大家初步了解一下这个框架实现步骤 初步准备 Layui官网 去官网下载好Layui,里面有示例和css、js等文件具体使用步骤: 要使用Layui,必须引入css文件…
暂无图片
编程学习 ·

asp.net core 3.1 中配置跨域

// 1.跨域配置 注册策略 services.AddCors(options => {options.AddPolicy("CorsPolicy", builder =>{builder.SetIsOriginAllowed((x) => true).AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod();});});// 2. 添加使用注册的策略app.UseCors("…
暂无图片
编程学习 ·

数据库系统原理练习题(一)

一、【问题描述】 1、 已知三个域:男人={李基,张鹏},女人={任方,刘玉},子女={李键,张睿,张峰}。这一-组域(男人,女人,子女)的笛卡尔积的基数为 A.12 B.9 C.7 D.27 2、现有如下关系:患者(患者编号,患者姓名,性别,出生日期),医疗(患者编号,患者姓名,医生编号,医生姓名…
暂无图片
编程学习 ·

关于this对象

this对象是是在运行时基于函数的执行环境绑定的 var object = {name: "My Object",getName: function(){return this.name; } } let b = object.getName; console.log(object.getName()); // "My Object" console.log(b()); // undefined 在全局函数中,…
暂无图片
编程学习 ·

[TypeScript] - TypeScript官方文档学习笔记-接口-上(二)

前言 接口只是在语法层面限制写法,从而使部分语句写法不出现,本质是语法规范 接口 TypeScript中接口用来定义结构类型,出于类型检查需要 编译转换后接口消失,仅用于语法检查 普通对象传入: function printLabel(labeledObj: { label: string }) {console.log(labeledObj.l…
暂无图片
编程学习 ·

Flink sql-client操作

版本信息 flink1.10 从官网下载kafka-connector支持的包和json的包 https://ci.apache.org/projects/flink/flink-docs-release-1.10/dev/table/connect.html在client中注册用于输出的表或者在ymal文件中注册表 CREATE TABLE sink-hehe ( id STRING, name STRING, age INT, hom…
暂无图片
编程学习 ·

手把手教你理解Volatile关键字

volatile关键字volatile 关键字是java提供的一种轻量级同步机制。他能够保证可见性和有序性,但是不能保证原子性。volatile可见性可见性表示被这个关键字所修饰的实例,在被修改后,其他的线程均可见。class MyData { // 如果没有volatile关键字的话,那我们在修改number的…
暂无图片
编程学习 ·

es6中map()、some()、every()、filter()的区别

ES的Array对象有map、some、every、filter几个方法都能对数组中的每个对象进行处理,但是他们之间的功能又各有差别map():通过指定函数处理数组的每个元素,并返回处理后的数组。var numbers = [4, 9, 16, 25];function myFunction() {console.log(numbers.map(Math.sqrt)); }…
暂无图片
编程学习 ·

halo

Halo开源博客项目配置 README 简介 Halo [ˈheɪloʊ],意为光环。Halo 是一款现代化的个人独立博客系统,给习惯写博客的同学多一个选择。当然,你也可以当成拼音读(哈喽)。 声明本项目旨在创造一个好的产品以供人们使用(虽然现在并不是太好),并非一个所谓提供学习的项目。…
暂无图片
编程学习 ·

分离springboot中的lib

仅供参考: 这次分离lib源于疫情期间连公司内网上传jar过于缓慢。在一个项目构建之初,所使用的依赖基本都已经确定,因此大概率不会对项目有大的影响。(非适用于所有场景) 首先我们要引入插件: <!-- 分离lib --> <plugin><groupId>org.apache.maven.plug…
暂无图片
编程学习 ·

CodeForces 1371C A Cookie for You (贪心)

题意:v个香草饼干,c个巧克力饼干。有两种人: ①a个,若v>c,拿走香草饼干,否则拿走巧克力饼干。 ②b个,若v>c,拿走巧克力饼干,否则拿走香草饼干。 求安排每个人的进场顺序,是否能让所有人都吃到饼干。 题解:贪心 我们发现,无论香草和巧克力饼干数量如何,若①无…
暂无图片
编程学习 ·

Crust ,波卡生态上的分布式存储走在时代风口

Crust 实现了去中心化存储的激励层协议,适配包括 IPFS 在内的多种存储层协议,并对应用层提供支持。同时 Crust 的架构也有能力对去中心化计算层提供支持,构建分布式云生态。6月19日,Crust Network 产品总监 Dean 受邀参加由一块+ 主办的 「Sub China Day」线上直播活动,与…
暂无图片
编程学习 ·

惟愿此生,岁月静好

惟愿此生,岁月静好 陌上拈一缕岁月的风,沐一场时光的雨,让心在平淡中盈满温润,回眸,有明天可以奔赴,有过往可回头,有温暖可相依,这样的日子,是我想要的岁月静好。 清晨迎着阳光,走在熙熙攘攘的人群中,感谢这美好的一天,给我的这份踏实安稳,夜晚走在夕阳里,心里装…
暂无图片
编程学习 ·

为城市空间插上智慧的翅膀 看盈嘉互联青云直上的数字孪生蓝图

从奇点爆炸之后,宇宙的状态由初始的“一”分裂开来,从而有了不同的存在形式、运动状态等差异,物与物的位置差异度量称之为“空间”,位置的变化则由“时间”度量。 空间承载了人们的生活、工作、生产和经营。过往,空间只是客观存在,与空间中的人不产生任何交互,空间的价值…
暂无图片
编程学习 ·

CAN协议要点及车辆CAN协议破解

一、CAN协议要点1. 电压2. 波形3. CAN报文概述CAN一共规定了5中类型的帧,帧也称为报文。CAN总线的数据帧有标准格式(Standard Format)和扩展格式(Extended Format)的区分。4. CAN报文编码格式Intel格式编码当一个信号的数据长度不超过1 Byte,并且信号在一个字节内实现时,…
暂无图片
编程学习 ·

终于弄清楚SDH、MSTP 、OTN和PTN的关系了

在开始之前,先要解释一下TDM的概念。 TDM,就是时分复用,就是将一个标准时长(1秒)分成若干段小的时间段(8000),每一个小时间段(1/8000=125us)传输一路信号。 SDH系统的电路调度均以TDM为基础,所以看到很多人说SDH业务就是TDM业务,就是传统的电路调度,是有理论依据的…
暂无图片
编程学习 ·

题解P1601 A+B problem(高精)

当时信奥老师叫我们做出A+B高精,于是我就做了一波 第一版:WA60 从高往低位。如果碰到进位后面加一下1,注意归零 还有字符串转字符。 #include<bits/stdc++.h> using namespace std; int g(char w){int t=1-1,d;d=w-t;return d; } int y(int a,int b){return a>b?a…