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

學習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):# 規則的核心邏輯 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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75547.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75547.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75547.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入探究 Hive 中的 MAP 類型:特點、創建與應用

摘要 在大數據處理領域,Hive 作為一個基于 Hadoop 的數據倉庫基礎設施,提供了方便的數據存儲和分析功能。Hive 中的 MAP 類型是一種強大的數據類型,它允許用戶以鍵值對的形式存儲和操作數據。本文將深入探討 Hive 中 MAP 類型的特點,詳細介紹如何創建含有 MAP 類型字段的表…

基于Java的區域化智慧養老系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘 要 時代在飛速進步,每個行業都在努力發展現在先進技術,通過這些先進的技術來提高自己的水平和優勢,區域化智慧養老系統當然不能排除在外。區域化智慧養老系統是在實際應用和軟件工程的開發原理之上,運用Java語言、JSP技術以及…

關于JVM和OS中的指令重排以及JIT優化

關于JVM和OS中的指令重排以及JIT優化 前言: 這東西應該很重要才對,可是大多數博客都是以訛傳訛,全是錯誤,尤其是JVM會對字節碼進行重排都出來了,明明自己測一測就出來的東西,寫出來誤人子弟… 研究了兩天&…

VS2022遠程調試Linux程序

一、 1、VS2022安裝參考 VS Studio2022安裝教程(保姆級教程)_visual studio 2022-CSDN博客 注意:勾選的時候,要勾選下方的選項,才能調試Linux環境下運行的程序! 2、VS2022遠程調試Linux程序測試 原文參…

WPF設計學習記錄滴滴滴4

<Button x:Name"btn"Content"退出"Width" 100"Height"25"Click"btn_Click" IsDefault"True"/> <Button x:Name"btn" <!-- 控件標識&#xff1a;定義按鈕的實例名稱為"btn&…

JVM 有哪些垃圾回收器

垃圾收集算法 標記-復制算法(Copying): 將可用內存按容量劃分為兩個區域,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活著的對象復制到另外一塊上面, 然后再把已使用過的內存空間一次清理掉。 標記-清除算法(Mark-Sweep): 算法分為“標記” 和“清除”兩個…

React DndKit 實現類似slack 類別、頻道拖動調整位置功能

一周調試終于實現了類 slack 類別、頻道拖動調整位置功能。 歷經四個版本迭代。 實現了類似slack 類別、頻道拖動調整功能 從vue->react &#xff1b;更喜歡React的生態及編程風格&#xff0c;新項目用React來重構了。 1.zustand全局狀態 2.DndKit 拖動 功能視頻&…

新浪財經股票每天10點自動爬取

老規矩還是先分好三步&#xff0c;獲取數據&#xff0c;解析數據&#xff0c;存儲數據 因為股票是實時的&#xff0c;所以要加個cookie值&#xff0c;最好分線程或者爬取數據時等待爬取&#xff0c;不然會封ip 廢話不多數&#xff0c;直接上代碼 import matplotlib import r…

使用Android 原生LocationManager獲取經緯度

一、常用方案 1、使用LocationManager GPS和網絡定位 缺點&#xff1a;個別設備,室內或者地下停車場獲取不到gps定位,故需要和網絡定位相結合使用 2、使用Google Play服務 這種方案需要Android手機中有安裝谷歌服務,然后導入谷歌的第三方庫&#xff1a; 例如&#xff1a;i…

驗證碼實現

驗證碼案例 學了Spring MVC &#xff0c;配置 相關章節&#xff0c; 現可以嘗試寫一個前后端交互的驗證碼 文章目錄 驗證碼案例前言一、驗證碼是什么&#xff1f;二、需求1.引入依賴2.導入前端頁面3.約定前后段交互接口 三、代碼解析Controllermodelapplication.xml 四丶結果五…

查詢當前用戶的購物車和清空購物車

業務需求&#xff1a; 在小程序用戶端購物車頁面能查到當前用戶的所有菜品或者套餐 代碼實現 controller層 GetMapping("/list")public Result<List<ShoppingCart>> list(){List<ShoppingCart> list shoppingCartService.shopShoppingCart();r…

(多看) CExercise_05_1函數_1.2計算base的exponent次冪

題目&#xff1a; 鍵盤錄入兩個整數&#xff1a;底(base)和冪指數(exponent)&#xff0c;計算base的exponent次冪&#xff0c;并打印輸出對應的結果。&#xff08;注意底和冪指數都可能是負數&#xff09; 提示&#xff1a;求冪運算時&#xff0c;基礎的思路就是先無腦把指數轉…

【nacos安裝指南】

Nacos安裝指南 1.Windows安裝 開發階段采用單機安裝即可。 1.1.下載安裝包 在Nacos的GitHub頁面&#xff0c;提供有下載鏈接&#xff0c;可以下載編譯好的Nacos服務端或者源代碼&#xff1a; GitHub主頁&#xff1a;https://github.com/alibaba/nacos GitHub的Release下載…

通過發音學英語單詞:從音到形的學習方法

&#x1f4cc; 通過發音學英語單詞&#xff1a;從音到形的學習方法 英語是一種 表音語言&#xff08;phonetic language&#xff09;&#xff0c;但不像拼音文字&#xff08;如漢語拼音、西班牙語等&#xff09;那么規則&#xff0c;而是 部分表音部分表意。這意味著我們可以通…

列表某個字段由多個值組成,使用id匹配展示

說明&#xff1a;列表中字段A的值由多個值組成&#xff0c;但是后端返回的是這多個值的id字符串&#xff0c;需要前端拿著多個id組成的字符串去另一個接口數據源匹配展示 列表后端返回多個字符串如下&#xff1a; sectorName: "1899292545382895618,1907311191514636289…

MQL5教程 05 指標開發實戰:雙色線、雙線變色MACD、跨時間周期均線

文章目錄 一、雙色線指標二、雙線變色MACD指標三、跨時間周期均線 一、雙色線指標 這里的類型中&#xff0c;Color開頭的&#xff0c;是可以選擇多個顏色的。 #property indicator_chart_window #property indicator_buffers 18 #property indicator_plots 7 //--- plot xian…

Java全棧面試寶典:線程安全機制與Spring Boot核心原理深度解析

目錄 一、Java線程安全核心原理 &#x1f525; 問題1&#xff1a;線程安全的三要素與解決方案 線程安全風險模型 線程安全三要素 synchronized解決方案 &#x1f525; 問題2&#xff1a;synchronized底層實現全解析 對象內存布局 Mark Word結構&#xff08;64位系統&…

【Cursor】設置語言

Ctrl Shift P 搜索 configure display language選擇“中文-簡體”

【新能源汽車整車動力學模型深度解析:面向MATLAB/Simulink仿真測試工程師的硬核指南】

1. 前言 作為MATLAB/Simulink仿真測試工程師,掌握新能源汽車整車動力學模型的構建方法和實現技巧至關重要。本文將提供一份6000+字的深度技術解析,涵蓋從基礎理論到Simulink實現的完整流程。內容經過算法優化設計,包含12個核心方程、6大模塊實現和3種驗證方法,滿足SEO流量…

Java 線程池與 Kotlin 協程 高階學習

以下是Java 線程池與 Kotlin 協程 高階學習的對比指南&#xff0c;結合具體代碼示例&#xff0c;展示兩者在異步任務處理中的差異和 Kotlin 的簡化優勢&#xff1a; 分析&#xff1a; 首先&#xff0c;我們需要回憶Java中線程池的常見用法&#xff0c;比如通過ExecutorService創…