bazel學習

bazel學習

a fast, scalable, multi-language and extensible build system

bazel就是一個編譯打包工具,類似於make、cmake等

安裝

⚠️:Centos7系統安裝bazel4

參考:https://docs.bazel.build/versions/5.0.0/install.html

image-20221121155314062

學習

如何使用bazel這個工具呢?

1、建立工作空間
在構建項目之前,您需要設置其工作空間,工作空間是一個包含項目源文件和 Bazel 構建後文件輸出的目錄, 它還包含 Bazel 認爲特殊的文件:WORKSPACE 文件,它將目錄及其中的內容標記爲 Bazel 工作區,並位於項目目錄結構的根目錄中,可以使用一個或多個 BUILD 文件,它們告訴 Bazel 如何構建項目的不同部分。(工作空間中包含 BUILD 文件的目錄稱爲一個包(package))

2、理解Build文件
一個 BUILD 文件包含幾種不同類型的 Bazel 指令。 最重要的類型是構建規則,它告訴 Bazel 如何構建所需的輸出,例如可執行的二進制文件或庫。 BUILD 文件中構建規則的每個實例稱爲目標,一個目標可以指向一組特定的源文件和依賴項, 也可以指向其他目標。

看一下cpp-tutorial/stage1/main目錄下的BUILD文件:

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
)

hello-world 目標實例化了 Bazel 的內置 cc_binary 規則,該規則告訴 Bazel 從 hello-world.cc 源文件構建一個獨立的,沒有依賴關係的可執行二進制文件。

目標中的屬性明確聲明其依賴項和選項,雖然 name 屬性是強制性的,但許多是可選的。 例如,在 hello-world 目標中,name 是必需的且不言自明,而 srcs 是可選的,意味着指定 Bazel 從中構建目標的源文件。

3、構建工程

爲了構建您的示例項目,請跳轉到 cpp-tutorial/stage1 目錄並運行:

cd examples/cpp-tutorial/stage1/
bazel build //main:hello-world

在目標標籤中,//main: 是 BUILD 文件在工作空間根目錄的位置,hello-world 是BUILD 文件中的目標名稱(name)。

Bazel 產生類似於以下內容的輸出:

Starting local Bazel server and connecting to it...
INFO: Analyzed target //main:hello-world (37 packages loaded, 161 targets configured).
INFO: Found 1 target...
Target //main:hello-world up-to-date:
  bazel-bin/main/hello-world
INFO: Elapsed time: 7.820s, Critical Path: 0.59s
INFO: 6 processes: 4 internal, 2 linux-sandbox.
INFO: Build completed successfully, 6 total actions

Bazel 將構建的輸出文件放在工作空間根目錄的 bazel-bin 目錄中。

現在測試新構建的二進制文件:

bazel-bin/main/hello-world

學習bazel_test/examples/cpp-tutorial下的三個項目:參考

共有三組文件,每組代表本教程中的一個階段.:

  • 在第一階段,將構建單個包中的單個目標。
  • 在第二階段,將項目拆分爲多個目標,但將其保存在一個包中。
  • 在第三個階段,將項目拆分爲多個包並使用多個目標構建它。

stage1

image-20221121161753275

load("@rules_cc//cc:defs.bzl", "cc_binary")

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
)

第一階段,只有一個單一的目標,它構建一個沒有額外依賴項的單一源文件:

圖片

stage2

image-20221121164005430

如果希望將較大的項目拆分爲多個目標和包,以允許快速增量構建(即僅重建已更改的內容)並通過構建項目的多個部分來加速構建。

load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")

cc_library(
    name = "hello-greet",
    srcs = ["hello-greet.cc"],
    hdrs = ["hello-greet.h"],
)

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
    deps = [
        ":hello-greet",
    ],
)

使用這個 BUILD 文件,Bazel 首先構建 hello-greet 庫(使用 Bazel 的內置 cc_library 規則),然後是 hello-world 二進制文件。 hello-world 目標中的 deps 屬性告訴 Bazel,構建 hello-world 二進制文件需要 hello-greet 庫。

圖片

該階段使用兩個目標構建了項目。 hello-world 目標構建一個源文件並依賴於另一個目標 (//main:hello-greet),該庫是由兩個額外的源文件構建的。

stage3

image-20221121164342218

這裏將其中一個功能放在另外一個文件夾//lib下:

//main:
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")

cc_library(
    name = "hello-greet",
    srcs = ["hello-greet.cc"],
    hdrs = ["hello-greet.h"],
)

cc_binary(
    name = "hello-world",
    srcs = ["hello-world.cc"],
    deps = [
        ":hello-greet",
        "//lib:hello-time",
    ],
)

//lib:
load("@rules_cc//cc:defs.bzl", "cc_library")

cc_library(
    name = "hello-time",
    srcs = ["hello-time.cc"],
    hdrs = ["hello-time.h"],
    visibility = ["//main:__pkg__"],
)

可以看出主包中的 hello-world 目標依賴於 lib 包中的 hello-time 目標(因此目標標籤爲 //lib:hello-time) - Bazel 通過 deps 屬性知道這一點。

圖片

第三階段師將項目構建爲具有三個目標的兩個包,並瞭解它們之間的依賴關係。

使用

bazel_test

cc_library(
    name = "lib",
    srcs = ["lib/lib.cc"],
    hdrs = ["lib/lib.h"],
)

cc_binary(
    name = "main.out",
    srcs = ["main.cc"],
    deps = [
        ":lib",
    ],
)

編譯

bazel build //main:main.out

運行

./bazel-bin/main/main.out

更多

1、https://bazel.build/tutorials/cpp-use-cases

2、程序見Github

參考

1、https://blog.csdn.net/weixin_36354875/article/details/124822985

2、https://blog.csdn.net/butterfly5211314/article/details/125349431

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章