Bazel中的Symbol, Rule, Macro, Target, Provider, Aspect 等概念
学习Bazel ,就要学习Bazel 的规则定义, 弄清各个概念是重要的一个步骤。 在 Bazel 规则定义中,Symbol、Rule 和 Macro 是常见的概念。除此之外,Bazel 还有 Target、Provider、Aspect Repository、Package、 Workspace、 Configuration、Build Event Protocol、 Starlark、Transition、Action 等重要概念。
| 概念 | 类别 | 作用 |
|---|---|---|
| Symbol(符号) | 基础概念 | Bazel 规则、目标、属性等命名的标识符。 |
| Rule(规则) | 规则 | 定义 Bazel 构建逻辑,如 cc_library、py_binary。 |
| Macro(宏) | 代码复用 | 通过 Starlark 编写的函数,封装多个规则以简化 BUILD 文件。 |
| Target(目标) | 构建单元 | BUILD 文件中的规则实例,如 cc_library(name = "lib")。 |
| Provider(提供者) | 数据传递 | 规则间传递构建信息的方式,如 DefaultInfo(files = depset([...]))。 |
| Aspect(切面) | 依赖扩展 | 扩展规则行为,访问依赖的构建信息,如 bazel_aspect()。 |
| Repository(仓库) | 外部依赖管理 | 定义和下载外部依赖,如 http_archive()、git_repository()。 |
| Package(包) | 代码组织 | 以 BUILD 文件为单位的代码组织单元,每个 BUILD 目录即一个 package。 |
| Workspace(工作区) | 项目根目录 | 由 WORKSPACE 文件定义的 Bazel 项目,管理外部依赖。 |
| Configuration(构建配置) | 编译参数 | 影响构建方式,如 --cpu=x86_64、--compilation_mode=opt。 |
| Build Event Protocol(BEP) | 日志分析 | 记录 Bazel 构建事件,生成 JSON 或 Proto 格式日志。 |
| Starlark(Bazel 语言) | 语言 | Bazel 使用的 Python 语法子集,编写规则、宏和构建逻辑。 |
| Transition(配置转换) | 配置管理 | 允许在不同规则间修改构建配置,如改变 --cpu。 |
| Action(构建动作) | 执行单元 | 最小的构建执行单位,如 ctx.actions.run_shell() 运行 shell 命令。 |
下面将对它们做详细的解释:
1. Symbol(符号)
在 Bazel 中,symbol(符号) 指的是 .bzl 文件中定义的变量、函数、规则、宏等。
当你使用 load() 语句时,你在导入的就是 symbols。
示例:
load("@rules_python//python:packaging.bzl", "py_package", "py_wheel")
-
这里
py_package和py_wheel就是packaging.bzl文件中定义的 symbols。 -
symbols可以是宏(macro)、规则(rule),或者普通的 函数/变量。
2. Rule(规则)
Bazel rule(规则) 是 Bazel 构建系统的核心,用于定义如何构建目标(target)。
特性:
-
规则(rules)是 Starlark 代码,它们通常由
native.rule()定义。 -
每个规则都能创建一个或多个 targets(构建目标),并由 Bazel 执行。
-
规则可以使用 providers 来定义输入/输出关系。
规则示例
Bazel 内置了一些规则,比如 cc_binary 和 py_binary:
cc_binary(
name = "hello",
srcs = ["hello.cc"],
deps = [":hello_lib"],
)
-
cc_binary是一个规则(rule),用于编译 C++ 可执行文件。 -
name是目标名称,srcs是源代码文件,deps是依赖项。
自定义规则(User-defined Rule)
def _my_rule_impl(ctx):# 规则的核心逻辑 passmy_rule = rule( implementation = _my_rule_impl, attrs = { "srcs": attr.label_list(allow_files=True),},
)
-
my_rule是 Bazel 自定义规则,用于处理srcs作为输入。 -
implementation是规则的实现函数_my_rule_impl。
官方文档:
Build Rules Guide
3. Macro(宏)
宏(macro) 是 封装多个 Bazel 规则的函数,用于提高可复用性。
-
Macros 只是 Starlark 层面的封装,不会创建新的 build actions。
-
它们只是规则的组合,而不修改规则本身。
宏示例
def my_py_library(name, srcs, deps = []):native.py_library(name = name,srcs = srcs,deps = deps + ["//common:utils"],)
使用时:
load("//build_defs:my_macros.bzl", "my_py_library")my_py_library(name = "my_lib",srcs = ["lib.py"],
)
-
my_py_library宏封装了py_library规则,并默认加上//common:utils作为deps依赖项。 -
与规则(rule)不同,宏不会创建新类型的 build target,只是对已有规则的包装。
4. Target(目标)
Target(构建目标) 是 Bazel 构建系统的最小单位,它由 BUILD 文件中的规则实例化生成。
cc_library(name = "hello_lib",srcs = ["hello_lib.cc"],
)
-
这里
hello_lib是一个 target,它是cc_library规则的一个实例。
Target vs Rule
-
Rule 是构建的“蓝图”(定义构建逻辑)。
-
Target 是具体的构建对象(每个
name定义一个 target)。
5. Provider(提供者)
Provider(提供者) 是规则之间的数据传递机制。
它允许规则将信息传递给依赖项。
示例
MyProvider = provider(fields = ["output"])def _my_rule_impl(ctx):output_file = ctx.actions.declare_file(ctx.label.name + ".out")ctx.actions.run_shell(outputs = [output_file],command = "echo 'Hello' > " + output_file.path,)return [MyProvider(output = output_file)]my_rule = rule(implementation = _my_rule_impl,
)
-
MyProvider是一个自定义提供者,它包含output字段。 -
_my_rule_impl生成一个output_file并通过MyProvider返回它。 -
在规则之间,提供者用于共享构建信息。
官方文档:
Bazel Providers
6. Aspect(切面)
Aspect(切面) 允许在不修改规则的情况下为规则添加额外的行为。
它们通常用于分析或生成额外的输出。
Aspect 示例
def _my_aspect_impl(target, ctx):for src in target[DefaultInfo].files.to_list():print("Analyzing file:", src)my_aspect = aspect(implementation = _my_aspect_impl,
)
应用 aspect
cc_binary(name = "hello",srcs = ["hello.cc"],
)my_aspect(target = "//:hello",
)
-
my_aspect允许分析cc_binary目标的输入文件,而不修改cc_binary规则。
官方文档:
Bazel Aspects
7. Repository(外部仓库)
Repository(仓库) 是 Bazel 外部依赖管理的机制,用于拉取和管理外部代码库(如第三方库、工具链等)。
Bazel 支持多种类型的仓库,包括:
-
http_archive(下载 tar/zip 并解压) -
git_repository(从 Git 拉取) -
local_repository(使用本地路径) -
new_local_repository(定义新的本地仓库)
示例
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")http_archive(name = "rules_vcc",url = "https://example.com/rules_vcc.tar.gz",sha256 = "abc123...",strip_prefix = "rules_vcc-main",
)
-
@rules_vcc就是一个 外部仓库,可用于load("@rules_vcc//...")。
官方文档:
Bazel External Repositories
8. Package(包)
Package(包) 是 Bazel 代码的组织单元,即一个 BUILD 文件及其所在目录。
-
一个 Bazel 工作区(workspace)可以有多个 package。
-
每个 package 都有一个
BUILD文件,用于定义规则和目标。
示例
/workspace_root/WORKSPACE/src/BUILD # 这是一个 packagemain.cc/lib/BUILD # 这是另一个 packagelib.cc
-
src/和src/lib/都是 package,因为它们各自有BUILD文件。
官方文档:
Bazel Packages
9. Workspace(工作区)
Workspace(工作区) 是 Bazel 项目的根目录,由 WORKSPACE 文件定义。
-
所有 Bazel 构建都发生在某个工作区中。
-
WORKSPACE文件 用于声明外部依赖,如http_archive()、git_repository()等。
示例
/my_project/WORKSPACE # 定义 Bazel 工作区/src/BUILDmain.cc/third_party/BUILD
-
my_project/是 Bazel 工作区,因为它有WORKSPACE文件。
官方文档:
Bazel Workspaces
10. Configuration(构建配置)
Configuration(构建配置) 指的是 Bazel 对构建参数的管理,如:
-
CPU/架构 (
--cpu=x86_64) -
编译模式 (
--compilation_mode=opt/debug) -
工具链选择 (
--host_crosstool_top=@bazel_tools//tools/cpp:toolchain)
示例
bazel build //src:main --cpu=arm64 --compilation_mode=opt
-
--cpu=arm64选择 ARM64 架构 -
--compilation_mode=opt进行优化编译
官方文档:
Bazel Configurations
11. Build Event Protocol(构建事件协议, BEP)
BEP 用于 跟踪和分析 Bazel 构建过程,常用于 CI/CD 系统集成。
BEP 可以输出 构建日志、失败原因、性能数据等,并提供 JSON 或 Proto 格式。
示例
bazel build //src:main --build_event_json_file=build_events.json
-
生成
build_events.json,可用于分析构建信息。
官方文档:
Bazel Build Event Protocol
12. Starlark(Bazel 语言)
Starlark 是 Bazel 的 配置语言,基于 Python 语法但有严格限制:
-
无副作用(不能修改全局变量)
-
无 I/O 操作(不能读写文件)
-
只能调用
ctx.actions进行构建
示例
def _my_rule_impl(ctx):output = ctx.actions.declare_file(ctx.label.name + ".txt")ctx.actions.write(output, "Hello, Bazel!")return [DefaultInfo(files = depset([output]))]my_rule = rule(implementation = _my_rule_impl)
官方文档:
Bazel Starlark
13. Transition(配置转换)
Transition(配置转换) 允许修改构建配置,比如 改变目标平台或优化级别。
示例
def _my_transition_impl(settings, attr):return {"//command_line_option:cpu": "arm64"}my_transition = transition(implementation = _my_transition_impl,inputs = [],outputs = ["//command_line_option:cpu"],
)
-
默认情况下,Bazel 规则会继承全局构建配置。
-
使用
transition可以修改某些规则的配置,如强制某些目标在 ARM64 上构建。
官方文档:
Bazel Transitions
14. Action(构建动作)
Action(构建动作) 是 Bazel 执行构建的最小单位,如:
-
编译(gcc、clang)
-
链接(ld)
-
拷贝文件
-
执行 Shell 脚本
每个 rule 由 多个 action 组成。
示例
def _my_rule_impl(ctx):output = ctx.actions.declare_file("output.txt")ctx.actions.run_shell(outputs = [output],command = "echo Hello > " + output.path,)return [DefaultInfo(files = depset([output]))]
-
ctx.actions.run_shell()定义了一个 Action,用于执行 shell 命令。
官方文档:
Bazel Actions
相关文章:
Bazel中的Symbol, Rule, Macro, Target, Provider, Aspect 等概念
学习Bazel ,就要学习Bazel 的规则定义, 弄清各个概念是重要的一个步骤。 在 Bazel 规则定义中,Symbol、Rule 和 Macro 是常见的概念。除此之外,Bazel 还有 Target、Provider、Aspect Repository、Package、 Workspace、 Configura…...
Open-Sora:开源AI视频生成的新星
一.引言 近年来,AI视频生成技术快速发展,从文本生成图像(如Stable Diffusion、DALLE)到文本生成视频(如Runway、Pika),AI在多媒体创作领域的应用日益广泛。近期,Open-Sora作为一款开…...
【堆】《深入剖析优先级队列(堆):数据结构与算法的高效搭档》
文章目录 前言例题一、最后一块石头的重量二、数据流中的第 K 大元素三、前K个高频单词四、数据流的中位数 结语 前言 什么是优先级队列算法呢?它的算法原理又该怎么解释? 优先级队列(堆)算法是一种特殊的数据结构和算法…...
【CMOS输出缓冲器驱动强度】
一 、学习笔记 原始资料:https://www.ti.com.cn/cn/lit/an/zhcae18/zhcae18.pdf?ts1743589394832 Q1、电平转换芯片的其中一个关键指标是转换速率,转换速率跟什么因素有关系呢? 1、瞬态驱动强度 上升或下降时间用于评估瞬态驱动强度。需要…...
【C++】Cplusplus进阶
模板的进阶: 非类型模板参数 是C模板中允许使用具体值(而非类型)作为模板参数的特性。它们必须是编译时常量,且类型仅限于整型、枚举、指针、引用。(char也行) STL标准库里面也使用了非类型的模板参数。 …...
透明的卡组收费模式IC++
IC是信用卡处理商用来计算每笔交易相关费用的定价模型。与统一或混合定价相比,IC提供了额外的透明度。 作为企业主,了解IC定价的来龙去脉至关重要,以确定它是否对您的运营有意义。 什么是IC? IC或interchange plus是一种流行的定…...
虚拟试衣间微信小程序解决方案
目录 项目名称: 云尚衣橱 核心功能模块: 技术栈选型: 架构设计概览: 详细功能点实现思路: 数据库设计 (MongoDB 示例): 开发步骤建议: 关键注意事项和挑战: 项目名称: 云尚衣橱 核心功能模块: 用户系统 (User System) 我的衣柜 (My Wardrobe) 虚拟试衣间 (Vir…...
吾爱置顶软件,吊打电脑自带功能!
今天我给大家带来一款超棒的软件,它来自吾爱论坛的精选推荐,每一款都经过精心挑选,绝对好用! S_Clock 桌面计时软件 这款软件的界面设计特别漂亮,简洁又大方。它是一款功能齐全的时钟计时倒计时软件,既能正…...
使用MFC ActiveX开发KingScada控件(OCX)
最近有个需求,要在KingScada上面开发一个控件。 原来是用的WinCC,WinCC本身是支持调用.net控件,就是winform控件的,winform控件开发简单,相对功能也更丰富。奈何WinCC不是国产的。 话说KingScada,国产组态软…...
应用安全系列之四十五:日志伪造(Log_Forging)之二
日志伪造(Log Forging)是一种常见的安全威胁,攻击者通过注入恶意内容破坏日志完整性。不同编程语言的防御方式有所不同,本文主要介绍Java、C#、Node.js、Rails(Ruby)和Go语言中的防护方法。 1、Java 在另外一篇博客里已经描述的比较详细,可…...
【AI论文】CodeARC:评估归纳程序合成中大语言模型代理的推理能力基准
摘要:归纳程序合成,或称示例编程,要求从输入输出示例中合成能够泛化到未见输入的函数。尽管大型语言模型代理在自然语言指导下的编程任务中展现出了潜力,但它们在执行归纳程序合成方面的能力仍待深入探索。现有的评估协议依赖于静…...
加密解密工具箱 - 专业的在线加密解密工具
加密解密工具箱 - 专业的在线加密解密工具 您可以通过以下地址访问该工具: https://toolxq.com/static/hub/secret/index.html 工具简介 加密解密工具箱是一个功能强大的在线加密解密工具,支持多种主流加密算法,包括 Base64、AES、RSA、DES…...
抖音短视频安卓版流畅度测评 - 真实
对于抖音短视频安卓版的流畅度,实际体验可以受到多方面因素的影响,比如设备性能、系统优化、网络情况和应用本身的优化程度。以下是一些常见的测评维度和抖音安卓版本流畅度的实际表现: 1.启动速度 抖音的启动速度通常较快,但如果…...
基于javaweb的SSM+Maven机房管理系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
发动机试验台底座:汽车研发的关键支撑(北重制造厂家)
发动机试验台底座是汽车研发过程中的重要组成部分,它承载着发动机及相关部件,在试验过程中提供稳定的支撑。底座的设计和制造对于发动机试验的精度和可靠性至关重要,它需要具备足够的承载能力、稳定性和耐久性,以确保试验过程的准…...
firefox 136.0.4版本离线安装MarkDown插件
系统:centos7.9 firefox:136.0.4 1、下载firefox的版本 Directory Listing: /pub/firefox/releases/136.0.4/ 选择自己想要的版本,这边选的是 linux-x86-64/en-US/版本的。 Directory Listing: /pub/firefox/releases/136.0.4/linux-x86…...
Linux红帽:RHCSA认证知识讲解(九)标准输入输出、重定向、过滤器与管道
Linux红帽:RHCSA认证知识讲解(九)标准输入输出、重定向、过滤器与管道 前言一、标准输入与输出、重定向,使用过滤器筛选文件信息1.1 Linux 的标准输入与输出1.2 什么是输入重定向1.3 输出重定向1.4 标准错误输出重定向1.5 使用过滤…...
移动端六大语言速记:第6部分 - 错误处理与调试
移动端六大语言速记:第6部分 - 错误处理与调试 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在错误处理与调试方面的特性,帮助开发者理解和掌握各语言的异常处理机制。 6. 错误处理与调试 6.1 异常处理 各语言异常处理的语法对比:…...
云计算:基础、概念与未来展望
摘要 云计算已从一个新兴技术概念演变为现代信息技术(IT)基础设施的基石。它彻底改变了企业和个人存储、访问、处理数据以及部署应用程序的方式。本文旨在深入探讨云计算的核心概念、基本原理、关键技术、服务模型、部署模式及其带来的优势与挑战。通过…...
hanzi-writer-miniprogram真机显示不出来Path2D问题已解决(真机能显示了!)
要么cdn字库问题,要么是下面的问题 cdn问题 即https://cdn.jsdelivr.net/npm/hanzi-writer-data的问题 见node_modules\hanzi-writer\dist\hanzi-writer.js的getCharDataUrl 这里笔画数据是在线请求cdn, 请求多了有时候也会失败 Path2D的问题 我安装的是最新的一…...
智慧园区大屏如何实现全局监测:监测意义、内容、方式
智慧园区的价值不容小觑呀,可以说园区的大部分数据都在这个大屏上,监测数据越多,那么大屏的价值就越大。很多小伙伴拿到需求后感觉无从下手,本文在这里智慧园区大屏可以监测哪些内容、监测的意义、监测的方式等,欢迎点…...
LangChain核心解析:掌握AI开发的“链“式思维
0. 思维导图 1. 引言 🌟 在人工智能快速发展的今天,如何有效地利用大语言模型(LLM)构建强大的应用成为众多开发者关注的焦点。前面的课程中,我们学习了正则表达式以及向量数据库的相关知识,了解了如何处理文档并将其附加给大模型。本章我们将深入探讨LangChain中的核心概…...
[CISSP] [6] 密码学和对称密钥算法
密码学的目标 1. 机密性(Confidentiality) 目标:保护信息不被未授权访问。 通过 加密(Encryption)技术确保数据只能被授权方解密和读取。主要方法: 对称加密(AES、3DES)ÿ…...
思维链编程模式下可视化医疗编程具体模块和流程架构分析(全架构与代码版)
引言 随着人工智能在医疗领域的广泛应用,医疗AI思维链可视化编程工具应运而生,旨在为非技术背景的医疗从业者提供便捷的AI模型开发平台。这个工具通过直观的可视化界面,简化了AI模型的构建过程,帮助用户高效完成数据处理、模型训…...
AI与玩具结合的可行性分析
文章目录 一、市场需求:教育与陪伴的双重驱动(一)教育需求(二)情感陪伴需求(三)消费升级 二、技术发展:赋能玩具智能化(一)AI技术的成熟(二&#…...
软考又将迎来新的改革?
3月26日,工信部所属事业单位发布了一则招聘公告,其中,工信教考中心面相符合条件的博士招聘1名“考务处技术研究岗”的人员,具体岗位内容: 其岗位简介中,有一条“研究、制定考试技术改革方案,并组…...
Python入门(8):文件
1. 文件基本概念 文件:存储在计算机上的数据集合,Python 通过文件对象来操作文件。 文件类型: 文本文件:由字符组成,如 .txt, .py 二进制文件:由字节组成,如 .jpg, .mp3 2. 文件打开与关闭…...
HTML5 Video(视频)学习笔记
一、HTML5 视频简介 HTML5 引入了 <video> 元素,用于在网页上嵌入视频内容。这种方式取代了传统的 Flash 插件,使得视频的展示更加标准化和便捷。HTML5 的 <video> 元素为开发者提供了一种简单且兼容性强的方法来嵌入视频,同时也…...
怎么让一台云IPPBX实现多家酒店相同分机号码一起使用
下面用到的IPPBX是我们二次开发后的成品,支持各种云服务器一键安装,已经写好了一键安装包,自动识别系统环境,安装教程这里就不再陈述了! 前言需求 今天又遇到了一个客户咨询,关于部署一台云IPPBX…...
Java模板方法模式详解
模板方法模式详解 一、模式定义 模板方法模式(Template Method Pattern)定义一个操作中的算法骨架,将某些步骤延迟到子类实现。 二、核心结构 1. 抽象模板类 public abstract class AbstractTemplate {// 模板方法(final防止子类覆盖)pu…...
