Building Android Kernels with Bazel

Bazel 概念

复制代码
工作区 (Workspace): 包含 WORKSPACE 文件的目录

包 (Package): 包含 BUILD.bazel 文件的目录

目标 (Target): 文件或规则

    规则 (Rules): 可以构建的目标 (类似于 make 中的 phony 目标)

    文件 (Files): 源文件或生成的文件

标签 (Label): 目标的名称。唯一标识一个目标。

https://docs.bazel.build/versions/main/build-ref.html

小型 Bazel 项目示例

复制代码
my-project/
├── WORKSPACE
└── my-package/
    ├── hello.c
    └── BUILD.bazel
c 复制代码
# my-project/WORKSPACE
# Empty file
# Tells Bazel where the root is
# For kernel, the WORKSPACE file should be placed 
# right below ${ROOT_DIR}
c 复制代码
# my-project/my-package/BUILD.bazel
cc_binary(
  name = "hello",
  srcs = ["hello.c"],
)
c 复制代码
$ bazel build //my-package:hello

/my-package:hello 是目标的完整名称(即目标的标签)。你可以在工作区内的任何位置引用或使用它。

c 复制代码
// my-project/my-package/hello.c
#include <stdio.h>
int main(int argc, char** argv) {
    printf("hello!\n");
    return 0;
}
c 复制代码
$ bazel run //my-package:hello
hello!
c 复制代码
bazel build <label>
    如果目标已过期,则构建它。如果目标是最新的,则跳过构建。
bazel run <label>
    如果目标已过期,则构建它。如果目标是最新的,则跳过构建。
    运行一个目标。仅当该目标是脚本/可执行文件等时才有意义。

Depend on targets (same package)

一个 target 可以依赖于同一 package 内的其他 targets 或 files;在引用时,其名称前的冒号是可选的,但惯例是在规则定义的 target 前加上冒号,而对于实际的 file 则不加。

c 复制代码
# my-project/my-package/BUILD.bazel
filegroup(
  name = "hello_srcs",
  srcs = ["hello.c"],     
  # Usually no colon for files. ":hello.c" is also valid.
)
cc_binary(
  name = "hello",
  srcs = [":hello_srcs"], 
  # Usually add colon for targets. "hello_srcs" is also valid.
)

Depend on targets from other packages

c 复制代码
my-project/
├── WORKSPACE
├── my-lib/
│   ├── lib.h
│   ├── lib.c
│   └── BUILD.bazel
└── my-binary/
    ├── hello.c
    └── BUILD.bazel
c 复制代码
# my-project/my-lib/BUILD.bazel
cc_library(
  name = "libhello",
  srcs = ["lib.c"],
  visibility = ["//my-binary:__pkg__"],
)
c 复制代码
# my-project/my-binary/BUILD.bazel
cc_binary(
  name = "hello",
  srcs = ["hello.c"],
  static_libs = ["//my-lib:libhello"],
)

Bazel extensions *.bzl

c 复制代码
# my-project/my-package/myrules.bzl
def my_fancy_binary(name, srcs, **kwargs):
    native.filegroup(name = name + "_srcs", 
                     srcs = srcs,
                     **kwargs)
    cc_binary(name = name, 
              srcs = [":" + name + "_srcs"],
              **kwargs)
c 复制代码
# my-project/my-package/BUILD.bazel
# load is Bazel's "import"
load("//my-package:myrules.bzl", "my_fancy_binary")
my_fancy_binary(name = "fancy_hello", srcs = ["hello

... is equivalent to ...

c 复制代码
cc_binary(name = "fancy_hello", srcs = ["hello.c"])
filegroup(name = "fancy_hello_srcs", srcs = ["hello.c"])

Bazel 构建文件:.bzl 与 BUILD.bazel 的区别

在 Bazel 中,.bzl 文件和 BUILD.bazel 文件在构建流程中扮演着不同的、但又相互关联的角色。我们可以将它们与 Makefile 和 Kbuild 进行类比来更好地理解。

*.bzl 文件

复制代码
类比: 类似于 Makefile.* 文件,用于定义构建逻辑。

目的: 包含如何构建事物的定义。

内容:

    Rule definitions(规则定义):定义新的自定义构建规则(例如,你可以想象它包含了 cc_binary 这种内置规则的底层实现逻辑)。

    Macro definitions(宏定义):定义可重用的构建函数,它们封装了一个或多个规则(例如,my_fancy_binary 可能内部调用 cc_binary 和 filegroup 等)。

    其他用于构建逻辑的 Starlark 函数和变量。

BUILD.bazel 文件

复制代码
类比: 类似于 Kbuild 文件(或内核构建中的子目录 Makefile)。

目的: 通过调用或实例化已定义的构建规则和宏,在 package 内注册特定的 targets。

内容:

    Rule instantiations(规则实例化):调用预定义或自定义规则来创建具体的 targets(例如,cc_library(name = "libhello", ...) 实例化 cc_library 规则以创建 libhello target;cc_binary(name = "hello", ...), 创建 hello target)。

    Macro invocations(宏调用):调用已定义的宏来创建复合 targets(例如,fancy_hello(...) 调用 fancy_hello 宏)。

    为这些 targets 指定属性。

排除

c 复制代码
# my-project/my-package/BUILD.bazel
cc_binary(
  name = "hello",
  srcs = glob(["*.c"], 
              exclude = ["exclude.c"]),
)
相关推荐
阿巴斯甜21 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker21 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android
阿巴斯甜2 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇2 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android