Bazel中的Symbol, Rule, Macro, Target, Provider, Aspect 等概念

news2025/4/16 2:27:24

学习Bazel ,就要学习Bazel 的规则定义, 弄清各个概念是重要的一个步骤。 在 Bazel 规则定义中,SymbolRuleMacro 是常见的概念。除此之外,Bazel 还有 TargetProviderAspect Repository、Package、 Workspace、 Configuration、Build Event Protocol、 Starlark、Transition、Action 等重要概念。

概念类别作用
Symbol(符号)基础概念Bazel 规则、目标、属性等命名的标识符。
Rule(规则)规则定义 Bazel 构建逻辑,如 cc_librarypy_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_packagepy_wheel 就是 packaging.bzl 文件中定义的 symbols

  • symbols 可以是宏(macro)规则(rule),或者普通的 函数/变量


2. Rule(规则)

Bazel rule(规则) 是 Bazel 构建系统的核心,用于定义如何构建目标(target)

特性:

  • 规则(rules)是 Starlark 代码,它们通常由 native.rule() 定义。

  • 每个规则都能创建一个或多个 targets(构建目标),并由 Bazel 执行。

  • 规则可以使用 providers 来定义输入/输出关系。

规则示例

Bazel 内置了一些规则,比如 cc_binarypy_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):
    # 规则的核心逻辑 
    pass

my_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         # 这是一个 package
    main.cc
    /lib/
      BUILD       # 这是另一个 package
      lib.cc

 

  • src/src/lib/ 都是 package,因为它们各自有 BUILD 文件。

官方文档:
Bazel Packages


9. Workspace(工作区)

Workspace(工作区)Bazel 项目的根目录,由 WORKSPACE 文件定义。

  • 所有 Bazel 构建都发生在某个工作区中

  • WORKSPACE 文件 用于声明外部依赖,如 http_archive()git_repository() 等。

示例

/my_project/
  WORKSPACE        # 定义 Bazel 工作区
  /src/
    BUILD
    main.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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2327845.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Open-Sora:开源AI视频生成的新星

一.引言 近年来,AI视频生成技术快速发展,从文本生成图像(如Stable Diffusion、DALLE)到文本生成视频(如Runway、Pika),AI在多媒体创作领域的应用日益广泛。近期,Open-Sora作为一款开…

【堆】《深入剖析优先级队列(堆):数据结构与算法的高效搭档》

文章目录 前言例题一、最后一块石头的重量二、数据流中的第 K 大元素三、前K个高频单词四、数据流的中位数 结语 前言 什么是优先级队列算法呢?它的算法原理又该怎么解释? 优先级队列(堆)算法是一种特殊的数据结构和算法&#xf…

【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是一种流行的定…

吾爱置顶软件,吊打电脑自带功能!

今天我给大家带来一款超棒的软件,它来自吾爱论坛的精选推荐,每一款都经过精心挑选,绝对好用! S_Clock 桌面计时软件 这款软件的界面设计特别漂亮,简洁又大方。它是一款功能齐全的时钟计时倒计时软件,既能正…

使用MFC ActiveX开发KingScada控件(OCX)

最近有个需求,要在KingScada上面开发一个控件。 原来是用的WinCC,WinCC本身是支持调用.net控件,就是winform控件的,winform控件开发简单,相对功能也更丰富。奈何WinCC不是国产的。 话说KingScada,国产组态软…

【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、系统功能实现、代码编写、论文编写和辅导、论文…

发动机试验台底座:汽车研发的关键支撑(北重制造厂家)

发动机试验台底座是汽车研发过程中的重要组成部分,它承载着发动机及相关部件,在试验过程中提供稳定的支撑。底座的设计和制造对于发动机试验的精度和可靠性至关重要,它需要具备足够的承载能力、稳定性和耐久性,以确保试验过程的准…

Linux红帽:RHCSA认证知识讲解(九)标准输入输出、重定向、过滤器与管道

Linux红帽:RHCSA认证知识讲解(九)标准输入输出、重定向、过滤器与管道 前言一、标准输入与输出、重定向,使用过滤器筛选文件信息1.1 Linux 的标准输入与输出1.2 什么是输入重定向1.3 输出重定向1.4 标准错误输出重定向1.5 使用过滤…

智慧园区大屏如何实现全局监测:监测意义、内容、方式

智慧园区的价值不容小觑呀,可以说园区的大部分数据都在这个大屏上,监测数据越多,那么大屏的价值就越大。很多小伙伴拿到需求后感觉无从下手,本文在这里智慧园区大屏可以监测哪些内容、监测的意义、监测的方式等,欢迎点…

LangChain核心解析:掌握AI开发的“链“式思维

0. 思维导图 1. 引言 🌟 在人工智能快速发展的今天,如何有效地利用大语言模型(LLM)构建强大的应用成为众多开发者关注的焦点。前面的课程中,我们学习了正则表达式以及向量数据库的相关知识,了解了如何处理文档并将其附加给大模型。本章我们将深入探讨LangChain中的核心概…

思维链编程模式下可视化医疗编程具体模块和流程架构分析(全架构与代码版)

引言 随着人工智能在医疗领域的广泛应用,医疗AI思维链可视化编程工具应运而生,旨在为非技术背景的医疗从业者提供便捷的AI模型开发平台。这个工具通过直观的可视化界面,简化了AI模型的构建过程,帮助用户高效完成数据处理、模型训…

AI与玩具结合的可行性分析

文章目录 一、市场需求:教育与陪伴的双重驱动(一)教育需求(二)情感陪伴需求(三)消费升级 二、技术发展:赋能玩具智能化(一)AI技术的成熟(二&#…

软考又将迎来新的改革?

3月26日,工信部所属事业单位发布了一则招聘公告,其中,工信教考中心面相符合条件的博士招聘1名“考务处技术研究岗”的人员,具体岗位内容: 其岗位简介中,有一条“研究、制定考试技术改革方案,并组…

怎么让一台云IPPBX实现多家酒店相同分机号码一起使用

下面用到的IPPBX是我们二次开发后的成品,支持各种云服务器一键安装,已经写好了一键安装包,自动识别系统环境,安装教程这里就不再陈述了! 前言需求 今天又遇到了一个客户咨询,关于部署一台云IPPBX&#xf…

蓝桥杯2024JavaB组的一道真题的解析

文章目录 1.问题描述2.问题描述3.思路分析4.代码分析 1.问题描述 这个是我很久之前写的一个题目,当时研究了这个题目好久,发布了一篇题解,后来很多人点赞,我都没有意识到这个问题的严重性,我甚至都在怀疑自己&#xf…