Bazel 概念和術語

2021-10-08 07:16:42 字數 3281 閱讀 4225

目錄簡介

workspace, packages and targets

工作空間 (workspace)

倉庫 (repositories)

包 (packages)

目標 (targets)

標籤 (labels)

標籤的詞彙規範 (lexical specification of a label)

rules

build files

types of build rule

dependencies 參考

bazel根據在稱為工作空間的目錄中組織的源**構建軟體。 工作空間中的原始檔以包的巢狀層次結構進行組織,其中每個包都是包含一組相關原始檔和乙個build檔案的目錄。 build檔案指定可以從源構建哪些軟體輸出。

工作空間是檔案系統上的目錄,其中包含要構建的軟體的原始檔,以及指向包含構建輸出的目錄的符號鏈結。 每個工作空間目錄都有乙個名為 workspace 的文字檔案,該檔案可以為空,或者可以包含對構建輸出所需的外部依賴項的引用。

包含名為 workspace 的檔案的目錄被視為工作空間的根。 因此,bazel 會忽略以包含 workspace

檔案的子目錄為根的工作空間中的任何目錄樹(因為它們形成另乙個工作空間)。

bazel 還支援 workspace.bazel 檔案作為 workspace 檔案的別名。 如果兩個檔案都存在,則 workspace.bazel 將具有優先權。

**在倉庫中組織。 包含 workspace 檔案的目錄是主儲存庫的根,也稱為@。 其他(外部)儲存庫是使用工作區規則在 workspace 檔案中定義的。

與 bazel **在一起的工作空間規則記錄在 build encyclopedia 的「工作空間規則」部分以及有關嵌入式 starlark 儲存庫規則的文件中。

由於外部倉庫本身就是倉庫,因此它們通常也包含 workspace 檔案。 但是,bazel 將忽略這些其他 workspace 檔案。 特別是,不會自動新增依賴於傳遞的倉庫。

倉庫中**組織的主要單位是包。 包是相關檔案的集合,以及它們之間的依賴性說明。

包定義為乙個目錄,其中包含乙個名為 build 或 build.bazel 的檔案,位於工作空間的頂級目錄下。 包包括其目錄中的所有檔案,以及其下的所有子目錄,但那些子目錄本身包含 build 檔案。

包是容器。 包的元素稱為目標。 大多數目標是檔案和規則這兩種主要型別之一。 此外,還有另一種目標,即包組,但數量卻要少得多。

檔案進一步分為兩種。 原始檔通常是在人們的努力下編寫的,並檢入到儲存庫中。 生成的檔案(有時稱為派生檔案)未檢入,而是由構建工具根據特定規則從原始檔生成的。

第二類目標是規則。 規則指定一組輸入和一組輸出檔案之間的關係,包括從輸入派生輸出的必要步驟。 規則的輸出始終是生成的檔案。 規則的輸入可能是原始檔,但也可能是生成的檔案。 因此,一條規則的輸出可能是另一條規則的輸入,從而可以構建較長的規則鏈。

在大多數情況下,規則輸入是原始檔還是生成檔案都是無關緊要的。 重要的只是該檔案的內容。 這個事實使用規則生成的生成檔案替換複雜的原始檔變得很容易,例如,當手動維護高度結構化的檔案的負擔變得太累,而有人編寫程式來派生該檔案時,就會發生這種情況。 該檔案的使用者不需要更改。 相反,生成的檔案很容易被僅具有本地更改的原始檔替換。

規則的輸入也可以包括其他規則。 這種關係的確切含義通常非常複雜,並且依賴於語言或規則,但是從直觀上講很簡單:c++ 庫規則a可能有另乙個 c++ 庫規則 b 用於輸入。 這種依賴性的結果是,在編譯期間 b 的標頭檔案對 a 可用,在鏈結期間 b 的符號對 a 可用,而在執行期間 b 的執行時資料對 a 可用。

所有規則的不變之處在於,規則生成的檔案始終與規則本身屬於同一包; 無法將檔案生成到另乙個包中。 但是,規則的輸入來自另乙個程式包並不少見。

包組是一組包,其目的是限制某些規則的可訪問性。 包組由 package_group 函式定義。 它們具有兩個屬性:它們包含的軟體包列表及其名稱。 引用它們的唯一允許方式是來自規則的可見性屬性或包函式的 default_visibility 屬性。 它們不生成或使用檔案。 有關更多資訊,請參閱「構建百科全書」的相應部分。

所有目標完全屬於乙個包。 目標的名稱稱為其標籤,標準格式的典型標籤如下所示:

在標籤引用它所在的相同倉庫的典型情況下,可能會忽略倉庫名稱。 因此,在 @myrepo 內部,此標籤通常寫為:

標籤的語法是故意嚴格的,以禁止對 shell 具有特殊含義的元字元。 這有助於避免無意的引號問題,並使得構建用於操縱標籤的工具和指令碼(例如 bazel query language)更加容易。 允許的目標名稱的詳細資訊如下:

目標名字://...:target-name

包名字://package-name:...

規則指定輸入和輸出之間的關係,以及構建輸出的步驟。 規則可以是許多不同種類或類中的一種,它們可以生成編譯的可執行檔案和庫,測試可執行檔案和其他受支援的輸出,如 構建百科全書 中所述。

每個規則都有乙個由 name 屬性指定的字串型別的名稱。 該名稱必須是語法有效的目標名稱,如上所述。 在某些情況下,名稱有些隨意,而由規則生成的檔案的名稱更有趣。 屬實是正確的。 在其他情況下,名稱是有意義的:例如,對於 *_binary 和 *_test 規則,規則名稱確定構建生成的可執行檔案的名稱。

cc_binary(

deps = [

"//absl/base",

"//absl/strings",

],)

每個規則都有一組屬性。 給定規則的適用屬性以及每個屬性的重要性和語義是規則類別的函式;有關規則及其對應屬性的列表,請參見構建百科全書。 每個屬性都有乙個名稱和乙個型別。 屬性可以具有的一些常見型別是整數,標籤,標籤列表,字串,字串列表,輸出標籤,輸出標籤列表。 並非在每個規則中都需要指定所有屬性。 因此,屬性形成了乙個從鍵(名稱)到可選的,鍵入的值的字典。

許多規則中存在的 srcs 屬性的型別為「標籤列表」; 其值(如果存在)是標籤列表,每個標籤都是作為該規則輸入的目標名稱。

許多規則中存在的 outs 屬性的型別為「輸出標籤列表」; 這與 srcs 屬性的型別相似,但是在兩個重要方面有所不同。 首先,由於規則的輸出與規則本身屬於同一包,因此輸出標籤不能包含包元件。 它們必須採用上面顯示的「相對」形式之一。 其次,(普通)標籤屬性所隱含的關係與輸出標籤所隱含的關係相反:乙個規則取決於其 srcs ,而另乙個規則取決於其 outs。 因此,兩種型別的標籤屬性將方向分配給目標之間的邊緣,從而產生依賴圖。

to be continued ...

concepts and terminology

bazel user manual

bazel build encyclopedia of functions

5 2 術語和概念

關係 relationship 是事物之間的聯絡。在物件導向的建模中,最重要的 3 中關係是 依賴 泛化和關聯。在圖形上,把關係圖畫成一條線,並用不同的線區別關係的種類。5.2.1 依賴 dependency 是一種使用關係,說明乙個事物 如類 window 使用另乙個事物 如類event 的資訊和...

儲存常見術語和概念

1 條帶化 striping 把資料分片,儲存在多個磁碟以提高資料並行訪問速率,從而提公升i o效能 影響條帶化效能有兩個關鍵指標,條帶大小和條帶寬度,條帶大小 striping size 即分片的資料塊大小,資料塊分得越多,就可以並行儲存到更多的磁碟,傳輸效能更高,自然要求控制器有更強的資料塊分片...

基本概念和術語

資料型別和抽象資料型別 本篇文章將講解資料結構的基本概念和術語,這種概念性的東西往往是催人入睡的,當然了,沒有誰能把概念講出花來,概念就是枯燥的。由於專欄的體系,我有必要講一講關於資料結構的基本概念和術語。資料是指能輸入計算機且能被計算機處理的各種符號的集合。資料是資訊的載體,是對客觀事物符號化的表...