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"]),
)
相关推荐
你过来啊你6 分钟前
RecyclerView与ListView深度对比分析
android
_一条咸鱼_8 分钟前
Android Runtime内存访问越界检查源码解析(82)
android·面试·android jetpack
Cafeting10 分钟前
Android 必知必会:Task ‘ijDownloadArtifact‘ not found in project【已解决】
android·android studio
Dnelic-2 小时前
Android 实现:当后台数据限制开启时,仅限制互联网APN。
android·telephony·数据网络·移动网络·自学笔记·数据流量计费·datanetwork
_Shirley2 小时前
安卓开发使用Android Studio配置flutter环境
android·flutter·android studio
张风捷特烈3 小时前
Flutter 百题斩#16 | 收集 SDK 所有 Widget 组件基本信息
android·flutter
Dyan_csdn3 小时前
AndroidStudio环境搭建
android·android-studio
coderZzb3 小时前
Android Studio模拟器报错
android·ide·android studio
a3158238063 小时前
Android14 源码开发Launcher界面优化,显示AllApp 抽屉, 底部虚拟按键(Home,Back,Menu)变深色
android·framework·android14
阿华的代码王国3 小时前
【Android】CheckBox实现和监听
android·xml·java