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"]),
)
相关推荐
urkay-9 小时前
Android 中实现 HMAC-SHA256
android·开发语言·python
YIN_尹9 小时前
【MySQL】增删查改的艺术——数据库CRUD完全指南(下)
android·数据库·mysql
m0_748233179 小时前
PHP8.0新特性全解析
android
一起养小猫10 小时前
Flutter for OpenHarmony 实战:从零开发一款五子棋游戏
android·前端·javascript·flutter·游戏·harmonyos
●VON10 小时前
从像素到语义:React Native Text 组件在 OpenHarmony 上的渲染哲学与工程实现
android·react native·react.js
henysugar10 小时前
Android studio编译aidl若干问题记录
android·ide·android studio·aidl
阿斌_bingyu70910 小时前
FastAdmin 混合式语言包添加繁体中文(zh-tw)完整教程
android·ide
CreeLu10 小时前
Android抓取火焰图
android
Minilinux201811 小时前
Android系列之 屏幕触控机制(三)
android·屏幕触控·viewroot·android touch·安卓系列
消失的旧时光-194311 小时前
Android 系统层学习目录
android·学习