blob: 366cad4cce55839a71676dfc26b1c009b2c04e91 [file] [log] [blame] [edit]
# Copyright (C) 2021 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Functions that are useful in the common kernel package (usually `//common`)."""
load("@bazel_skylib//lib:selects.bzl", "selects")
load("@bazel_skylib//rules:common_settings.bzl", "bool_flag")
load("@bazel_skylib//rules:write_file.bzl", "write_file")
load("@rules_pkg//pkg:install.bzl", "pkg_install")
load("@rules_pkg//pkg:mappings.bzl", "pkg_files", "strip_prefix")
load("//build/kernel/kleaf/artifact_tests:device_modules_test.bzl", "device_modules_test")
load("//build/kernel/kleaf/artifact_tests:kernel_test.bzl", "initramfs_modules_options_test")
load("//build/kernel/kleaf/impl:abi/kernel_abi_dist.bzl", "kernel_abi_wrapped_dist_internal")
load("//build/kernel/kleaf/impl:gki_artifacts.bzl", "gki_artifacts", "gki_artifacts_prebuilts")
load("//build/kernel/kleaf/impl:image/initramfs.bzl", "initramfs")
load("//build/kernel/kleaf/impl:image/kernel_images.bzl", "kernel_images_filegroup")
load("//build/kernel/kleaf/impl:kernel_filegroup_declaration.bzl", "kernel_filegroup_declaration")
load(
"//build/kernel/kleaf/impl:kernel_prebuilt_utils.bzl",
"CI_TARGET_MAPPING",
)
load("//build/kernel/kleaf/impl:kernel_sbom.bzl", "kernel_sbom")
load("//build/kernel/kleaf/impl:out_headers_allowlist_archive.bzl", "out_headers_allowlist_archive")
load("//build/kernel/kleaf/tests:runtime_protection_presence_test/symbol_presence_test.bzl", "symbol_presence_test")
load("//build/kernel/kleaf/tests/defconfig_test:pre_defconfig_fragments_menuconfig_test.bzl", "pre_defconfig_fragments_menuconfig_test")
load(
":kernel.bzl",
"kernel_abi",
"kernel_build",
"kernel_modules_install",
"kernel_unstripped_modules_archive",
"system_dlkm_image",
)
load(":print_debug.bzl", "print_debug")
# Always collect_unstripped_modules for common kernels.
_COLLECT_UNSTRIPPED_MODULES = True
# Always strip modules for common kernels.
_STRIP_MODULES = True
# Always keep a copy of Module.symvers and .config for common kernels.
_KEEP_MODULE_SYMVERS = True
_KEEP_DOT_CONFIG = True
# This transition is not needed for GKI
_GKI_ADD_VMLINUX = False
def common_kernel(
name,
outs,
makefile = None,
arch = None,
visibility = None,
defconfig = None,
pre_defconfig_fragments = None,
post_defconfig_fragments = None,
kmi_symbol_list = None,
additional_kmi_symbol_lists = None,
trim_nonlisted_kmi = None,
kmi_symbol_list_strict_mode = None,
kmi_symbol_list_add_only = None,
module_implicit_outs = None,
protected_exports_list = None,
protected_modules_list = None,
gki_system_dlkm_modules = None,
make_goals = None,
abi_definition_stg = None,
kmi_enforced = None,
build_gki_artifacts = None,
gki_boot_img_sizes = None,
page_size = None,
deprecation = None,
ddk_headers_archive = None,
ddk_module_headers = None,
extra_dist = None,
kcflags = None,
system_dlkm_extra_archive_files = None,
clang_autofdo_profile = None):
"""Macro for an Android Common Kernel.
The following targets are declared as public API:
- `<name>_sources` (e.g. `kernel_aarch64_sources`)
- Convenience filegroups that refers to all sources required to
build `<name>` and related targets.
- `<name>` (e.g. `kernel_aarch64`): [`kernel_build()`](kernel.md#kernel_build)
- This build the main kernel build artifacts, e.g. `vmlinux`, etc.
- `<name>_uapi_headers` (e.g. `kernel_aarch64_uapi_headers`)
- build `kernel-uapi-headers.tar.gz`.
- `<name>_modules` (e.g. `kernel_aarch64_modules`)
- `<name>_additional_artifacts` (e.g. `kernel_aarch64_additional_artifacts`)
- contains additional artifacts that may be added to
a distribution. This includes:
- Images, including `system_dlkm`, etc.
- `kernel-headers.tar.gz`
- `<name>_dist` (e.g. `kernel_aarch64_dist`)
- can be run to obtain a distribution outside the workspace.
**ABI monitoring**
If `kmi_symbol_list` is set, ABI monitoring is turned on.
- `<name>_abi` (e.g. `kernel_aarch64_abi`): [`kernel_abi()`](kernel.md#kernel_abi)
- `<name>_abi_dist` (e.g. `kernel_aarch64_abi_dist`)
Usually, for ABI monitoring to be fully turned on, you should set:
- `kmi_symbol_list`
- `additional_kmi_symbol_lists`
- `protected_exports_list`
- `protected_modules_list`
- `trim_nonlisted_kmi` to True
- `kmi_symbol_list_strict_mode` to True
- `abi_definition_stg` to the ABI definition
- `kmi_enforced` to True
Args:
name: name of the kernel_build().
outs: See [kernel_build.outs](kernel.md#kernel_build-outs)
arch: See [kernel_build.arch](kernel.md#kernel_build-arch)
makefile: See [kernel_build.makefile](kernel.md#kernel_build-makefile)
defconfig: See [kernel_build.defconfig](kernel.md#kernel_build-defconfig)
pre_defconfig_fragments: See [kernel_build.pre_defconfig_fragments](kernel.md#kernel_build-pre_defconfig_fragments)
post_defconfig_fragments: See [kernel_build.post_defconfig_fragments](kernel.md#kernel_build-post_defconfig_fragments)
kmi_symbol_list: See [kernel_build.kmi_symbol_list](kernel.md#kernel_build-kmi_symbol_list)
additional_kmi_symbol_lists: See [kernel_build.additional_kmi_symbol_lists](kernel.md#kernel_build-additional_kmi_symbol_lists)
trim_nonlisted_kmi: See [kernel_build.trim_nonlisted_kmi](kernel.md#kernel_build-trim_nonlisted_kmi)
kmi_symbol_list_strict_mode: See [kernel_build.kmi_symbol_list_strict_mode](kernel.md#kernel_build-kmi_symbol_list_strict_mode)
module_implicit_outs: See [kernel_build.module_implicit_outs](kernel.md#kernel_build-module_implicit_outs)
kmi_symbol_list_add_only: See [kernel_abi.kmi_symbol_list_add_only](kernel.md#kernel_abi-kmi_symbol_list_add_only)
protected_exports_list: See [kernel_build.protected_exports_list](kernel.md#kernel_build-protected_exports_list)
protected_modules_list: See [kernel_build.protected_modules_list](kernel.md#kernel_build-protected_modules_list)
make_goals: See [kernel_build.make_goals](kernel.md#kernel_build-make_goals)
abi_definition_stg: See [kernel_abi.abi_definition_stg](kernel.md#kernel_abi-abi_definition_stg)
kmi_enforced: See [kernel_abi.kmi_enforced](kernel.md#kernel_abi-kmi_enforced)
page_size: See [kernel_build.page_size](kernel.md#kernel_build-page_size)
ddk_module_headers: See [kernel_build.ddk_module_headers](kernel.md#kernel_build-ddk_module_headers)
gki_system_dlkm_modules: system_dlkm module_list
build_gki_artifacts: nonconfigurable. If true, build GKI artifacts under
target name `<name>_gki_artifacts`.
gki_boot_img_sizes: gki_artifacts.boot_img_sizes
visibility: default visibility for some targets instantiated with this macro
deprecation: If set, mark target deprecated with given message.
ddk_headers_archive: nonconfigurable. Target to the archive packing DDK headers
extra_dist: extra targets added to `<name>_dist`
kcflags: [kernel_build.kcflags](kernel.md#kernel_build-kcflags)
system_dlkm_extra_archive_files: [system_dlkm_image.internal_extra_archive_files](#system_dlkm_image-internal_extra_archive_files)
clang_autofdo_profile: See [kernel_build.clang_autofdo_profile](kernel.md#kernel_build-clang_autofdo_profile)
"""
json_target_config = dict(
name = name,
outs = outs,
arch = arch,
makefile = makefile,
defconfig = defconfig,
pre_defconfig_fragments = pre_defconfig_fragments,
post_defconfig_fragments = post_defconfig_fragments,
visibility = visibility,
kmi_symbol_list = kmi_symbol_list,
additional_kmi_symbol_lists = additional_kmi_symbol_lists,
trim_nonlisted_kmi = trim_nonlisted_kmi,
kmi_symbol_list_strict_mode = kmi_symbol_list_strict_mode,
module_implicit_outs = module_implicit_outs,
protected_exports_list = protected_exports_list,
protected_modules_list = protected_modules_list,
gki_system_dlkm_modules = gki_system_dlkm_modules,
make_goals = make_goals,
abi_definition_stg = abi_definition_stg,
kmi_enforced = kmi_enforced,
build_gki_artifacts = build_gki_artifacts,
gki_boot_img_sizes = gki_boot_img_sizes,
page_size = page_size,
deprecation = deprecation,
ddk_headers_archive = ddk_headers_archive,
ddk_module_headers = ddk_module_headers,
extra_dist = extra_dist,
)
print_debug(
name = name + "_print_configs",
content = "common_kernel({})".format("".join([
" {} = {},\n".format(k, repr(v))
for k, v in json_target_config.items()
])),
tags = ["manual"],
)
native.alias(
name = name + "_sources",
actual = ":common_kernel_sources",
)
all_kmi_symbol_lists = additional_kmi_symbol_lists
all_kmi_symbol_lists = [] if all_kmi_symbol_lists == None else list(all_kmi_symbol_lists)
# Add user KMI symbol lists to additional lists
additional_kmi_symbol_lists = all_kmi_symbol_lists + [
"//build/kernel/kleaf:user_kmi_symbol_lists",
]
if kmi_symbol_list:
all_kmi_symbol_lists.append(kmi_symbol_list)
native.filegroup(
name = name + "_all_kmi_symbol_lists",
srcs = all_kmi_symbol_lists,
)
kernel_build(
name = name,
srcs = [name + "_sources"],
outs = outs,
arch = arch,
implicit_outs = [
# Kernel build time module signing utility and keys
# Only available during GKI builds
# Device fragments need to add: '# CONFIG_MODULE_SIG_ALL is not set'
"scripts/sign-file",
"certs/signing_key.pem",
"certs/signing_key.x509",
],
build_config = Label("//build/kernel/kleaf:gki_build_config_fragment"),
makefile = makefile,
check_defconfig = select({
Label("//build/kernel/kleaf:gki_build_config_fragment_is_unset"): "match" if pre_defconfig_fragments else "minimized",
"//conditions:default": "disabled",
}),
defconfig = defconfig,
pre_defconfig_fragments = pre_defconfig_fragments,
post_defconfig_fragments = post_defconfig_fragments,
visibility = visibility,
collect_unstripped_modules = _COLLECT_UNSTRIPPED_MODULES,
strip_modules = _STRIP_MODULES,
keep_module_symvers = _KEEP_MODULE_SYMVERS,
keep_dot_config = _KEEP_DOT_CONFIG,
kmi_symbol_list = kmi_symbol_list,
additional_kmi_symbol_lists = additional_kmi_symbol_lists,
trim_nonlisted_kmi = trim_nonlisted_kmi,
kmi_symbol_list_strict_mode = kmi_symbol_list_strict_mode,
module_implicit_outs = module_implicit_outs,
protected_exports_list = protected_exports_list,
protected_modules_list = protected_modules_list,
make_goals = make_goals,
page_size = page_size,
deprecation = deprecation,
pack_module_env = True,
ddk_module_defconfig_fragments = [
Label("//build/kernel/kleaf/impl/defconfig:signing_modules_disabled"),
],
ddk_module_headers = ddk_module_headers,
kcflags = kcflags,
clang_autofdo_profile = clang_autofdo_profile,
)
kernel_abi(
name = name + "_abi",
kernel_build = name,
visibility = visibility,
define_abi_targets = bool(kmi_symbol_list),
# Sync with KMI_SYMBOL_LIST_MODULE_GROUPING
module_grouping = None,
abi_definition_stg = abi_definition_stg,
kmi_enforced = kmi_enforced,
kmi_symbol_list_add_only = kmi_symbol_list_add_only,
deprecation = deprecation,
enable_add_vmlinux = _GKI_ADD_VMLINUX,
)
# A subset of headers in OUT_DIR that only contains scripts/. This is useful
# for DDK headers interpolation.
out_headers_allowlist_archive(
name = name + "_script_headers",
kernel_build = name,
subdirs = ["scripts"],
)
native.filegroup(
name = name + "_ddk_allowlist_headers",
srcs = [
name + "_script_headers",
name + "_uapi_headers",
],
visibility = [
Label("//build/kernel/kleaf:__pkg__"),
],
)
kernel_modules_install(
name = name + "_modules_install",
# The GKI target does not have external modules. GKI modules goes
# into the in-tree kernel module list, aka kernel_build.module_implicit_outs.
# Hence, this is empty.
kernel_modules = [],
kernel_build = name,
)
kernel_unstripped_modules_archive(
name = name + "_unstripped_modules_archive",
kernel_build = name,
)
system_dlkm_image(
name = name + "_system_dlkm_image",
kernel_modules_install = name + "_modules_install",
build_flatten = True,
modules_list = gki_system_dlkm_modules,
fs_types = ["erofs", "ext4"],
internal_extra_archive_files = system_dlkm_extra_archive_files,
)
kernel_images_filegroup(
name = name + "_images",
srcs = [name + "_system_dlkm_image"],
deprecation = "Use {} instead".format(native.package_relative_label(name + "_system_dlkm_image")),
)
if build_gki_artifacts:
gki_artifacts(
name = name + "_gki_artifacts",
kernel_build = name,
boot_img_sizes = gki_boot_img_sizes,
arch = arch,
)
else:
native.filegroup(
name = name + "_gki_artifacts",
srcs = [],
)
# modules_staging_archive from <name>
native.filegroup(
name = name + "_modules_staging_archive",
srcs = [name],
output_group = "modules_staging_archive",
)
# All GKI modules
native.filegroup(
name = name + "_modules",
srcs = [
"{}/{}".format(name, module)
for module in (module_implicit_outs or [])
],
)
# The purpose of this target is to allow device kernel build to include reasonable
# defaults of artifacts from GKI. Hence, this target includes everything in name + "_dist",
# excluding the following:
# - UAPI headers, because device-specific external kernel modules may install different
# headers.
# - DDK; see _ddk_artifacts below.
native.filegroup(
name = name + "_additional_artifacts",
srcs = [
# Sync with additional_artifacts_items
name + "_headers",
name + "_system_dlkm_image",
name + "_kmi_symbol_list",
name + "_raw_kmi_symbol_list",
name + "_gki_artifacts",
],
)
filegroup_extra_deps = [
name + "_unstripped_modules_archive",
]
kernel_filegroup_declaration(
name = name + "_filegroup_declaration",
kernel_build = name,
extra_deps = filegroup_extra_deps,
images = name + "_system_dlkm_image",
ddk_module_headers = ddk_module_headers,
visibility = ["//visibility:private"],
)
target_mapping = CI_TARGET_MAPPING.get(name, {})
write_file(
name = name + "_download_configs",
content = [
json.encode_indent(target_mapping.get("download_configs", {})),
],
# / is needed to distinguish between variants as 16k (and avoid conflicts).
out = name + "/download_configs.json",
)
# Everything in name + "_dist" for the DDK.
# These are necessary for driver development. Hence they are also added to
# kernel_*_dist so they can be downloaded.
ddk_artifacts = [
name + "_download_configs",
name + "_filegroup_declaration",
name + "_unstripped_modules_archive",
]
if ddk_headers_archive:
ddk_artifacts.append(ddk_headers_archive)
native.filegroup(
name = name + "_ddk_artifacts",
srcs = ddk_artifacts,
)
dist_targets = (extra_dist or []) + [
name,
name + "_uapi_headers",
name + "_additional_artifacts",
name + "_ddk_artifacts",
name + "_modules",
name + "_modules_install",
# BUILD_GKI_CERTIFICATION_TOOLS=1 for all kernel_build defined here.
Label("//build/kernel:gki_certification_tools"),
"build.config.constants",
Label("//build/kernel:init_ddk_zip"),
]
kernel_sbom(
name = name + "_sbom",
srcs = dist_targets,
kernel_build = name,
)
dist_targets.append(name + "_sbom")
pkg_files(
name = name + "_dist_files",
srcs = dist_targets,
strip_prefix = strip_prefix.files_only(),
visibility = ["//visibility:private"],
)
pkg_install(
name = name + "_dist",
srcs = [name + "_dist_files"],
destdir = "out/{name}/dist".format(name = name),
)
kernel_abi_dist_name = name + "_abi_dist"
_common_kernel_abi_dist(
name = kernel_abi_dist_name,
kernel_abi = name + "_abi",
dist_targets = dist_targets,
)
_common_kernel_abi_dist(
name = name + "_abi_ignore_diff_dist",
kernel_abi = name + "_abi",
dist_targets = dist_targets,
ignore_diff = True,
no_ignore_diff_target = kernel_abi_dist_name,
)
_define_common_kernels_additional_tests(
name = name + "_additional_tests",
kernel_build_name = name,
kernel_modules_install = name + "_modules_install",
modules = (module_implicit_outs or []),
arch = arch,
page_size = page_size,
makefile = makefile,
defconfig = defconfig,
protected_exports_list = protected_exports_list,
)
native.test_suite(
name = name + "_tests",
tests = [
name + "_additional_tests",
name + "_test",
name + "_modules_test",
],
)
# TODO(b/291918087): Delete once users have migrated to @gki_prebuilts
# buildifier: disable=unnamed-macro
def define_prebuilts(**kwargs):
"""Define --use_prebuilt_gki and relevant targets.
You may set the argument `--use_prebuilt_gki` to a GKI prebuilt build number
on [ci.android.com](http://ci.android.com) or your custom CI host. The format is:
```
bazel <command> --use_prebuilt_gki=<build_number> <targets>
```
For example, the following downloads GKI artifacts of build number 8077484 (assuming
the current package is `//common`):
```
bazel build --use_prebuilt_gki=8077484 //common:kernel_aarch64_download_or_build
```
If you leave out the `--use_prebuilt_gki` argument, the command is equivalent to
`bazel build //common:kernel_aarch64`, which builds kernel from source.
`<name>_download_or_build` targets builds `<name>` from source if the `use_prebuilt_gki`
is not set, and downloads artifacts of the build number from
[ci.android.com](http://ci.android.com) (or your custom CI host) if it is set.
- `kernel_aarch64_download_or_build`
- `kernel_aarch64_additional_artifacts_download_or_build`
- `kernel_aarch64_uapi_headers_download_or_build`
Note: If a device should build against downloaded prebuilts unconditionally, set
`--use_prebuilt_gki` and a fixed build number in `device.bazelrc`. For example:
```
# device.bazelrc
build --use_prebuilt_gki
build --action_env=KLEAF_DOWNLOAD_BUILD_NUMBER_MAP="gki_prebuilts=8077484"
```
This is equivalent to specifying `--use_prebuilt_gki=8077484` for all Bazel commands.
You may set `--use_signed_prebuilts` to download the signed boot images instead
of the unsigned one. This requires `--use_prebuilt_gki` to be set to a signed build.
Args:
**kwargs: common kwargs to internal targets.
Deprecated:
See build/kernel/kleaf/docs/ddk/workspace.md for new ways to define prebuilts.
"""
# Legacy flag for backwards compatibility
# TODO(https://github.com/bazelbuild/bazel/issues/13463): alias to bool_flag does not
# work. Hence we use a composite flag here.
bool_flag(
name = "use_prebuilt_gki",
build_setting_default = False,
# emit a warning if the legacy flag is used.
deprecation = "Use {} or {} instead, respectively.".format(
Label("//build/kernel/kleaf:use_prebuilt_gki"),
Label("//build/kernel/kleaf:use_prebuilt_gki_is_true"),
),
)
native.config_setting(
name = "local_use_prebuilt_gki_set",
flag_values = {
":use_prebuilt_gki": "true",
},
visibility = ["//visibility:private"],
)
# Matches when --use_prebuilt_gki or --//<common_package>:use_prebuilt_gki is set
selects.config_setting_group(
name = "use_prebuilt_gki_set",
match_any = [
Label("//build/kernel/kleaf:use_prebuilt_gki_is_true"),
":local_use_prebuilt_gki_set",
],
)
for name, value in CI_TARGET_MAPPING.items():
repo_name = value["repo_name"]
deprecate_msg = "Use @{}//{} directly".format(repo_name, name)
not_available_msg = "This will no longer be available. File a bug if you rely on this target."
native.alias(
name = name + "_downloaded",
actual = name + "_files_downloaded",
deprecation = deprecate_msg,
)
# A kernel_filegroup that:
# - If --use_prebuilt_gki_num is set, use downloaded prebuilt of kernel_aarch64
# - Otherwise build kernel_aarch64 from sources.
native.alias(
name = name + "_download_or_build",
actual = select({
":use_prebuilt_gki_set": "@{}//{}".format(repo_name, name),
"//conditions:default": name,
}),
deprecation = deprecate_msg,
**kwargs
)
gki_artifacts_prebuilts(
name = name + "_gki_artifacts_downloaded",
srcs = select({
Label("//build/kernel/kleaf:use_signed_prebuilts_is_true"): [name + "_boot_img_archive_signed_downloaded"],
"//conditions:default": [name + "_boot_img_archive_downloaded"],
}),
outs = [name + "_gki_prebuilts_outs_downloaded"],
deprecation = deprecate_msg,
)
native.filegroup(
name = name + "_gki_artifacts_download_or_build",
srcs = select({
":use_prebuilt_gki_set": [name + "_gki_artifacts_downloaded"],
"//conditions:default": [name + "_gki_artifacts"],
}),
deprecation = deprecate_msg,
**kwargs
)
files_by_target_suffix = {}
for local_filename, config in value["download_configs"].items():
files_by_target_suffix.setdefault(config["target_suffix"], []).append(local_filename)
for target_suffix, files in files_by_target_suffix.items():
native.filegroup(
name = name + "_" + target_suffix + "_downloaded",
srcs = ["@{}//{}".format(repo_name, filename) for filename in files],
tags = ["manual"],
deprecation = deprecate_msg,
)
# A filegroup that:
# - If --use_prebuilt_gki_num is set, use downloaded prebuilt of kernel_{arch}_{target_suffix}
# - Otherwise build kernel_{arch}_{target_suffix}
native.filegroup(
name = name + "_" + target_suffix + "_download_or_build",
srcs = select({
":use_prebuilt_gki_set": [":" + name + "_" + target_suffix + "_downloaded"],
"//conditions:default": [name + "_" + target_suffix],
}),
deprecation = deprecate_msg,
**kwargs
)
additional_artifacts_items = [
name + "_headers",
name + "_system_dlkm_image",
name + "_kmi_symbol_list",
name + "_gki_artifacts",
]
native.filegroup(
name = name + "_additional_artifacts_downloaded",
srcs = [item + "_downloaded" for item in additional_artifacts_items],
deprecation = not_available_msg,
)
native.filegroup(
name = name + "_additional_artifacts_download_or_build",
srcs = [item + "_download_or_build" for item in additional_artifacts_items],
deprecation = not_available_msg,
)
def _define_common_kernels_additional_tests(
name,
kernel_build_name,
makefile,
defconfig,
kernel_modules_install,
modules,
arch,
page_size,
protected_exports_list):
fake_modules_options = Label("//build/kernel/kleaf/artifact_tests:fake_modules_options.txt")
initramfs(
name = name + "_fake_initramfs",
kernel_modules_install = kernel_modules_install,
modules_options = fake_modules_options,
)
initramfs_modules_options_test(
name = name + "_fake",
kernel_images = name + "_fake_initramfs",
expected_modules_options = fake_modules_options,
)
write_file(
name = name + "_empty_modules_options",
out = name + "_empty_modules_options/modules.options",
content = [],
)
initramfs(
name = name + "_empty_initramfs",
kernel_modules_install = kernel_modules_install,
# Not specify module_options
)
initramfs_modules_options_test(
name = name + "_empty",
kernel_images = name + "_empty_initramfs",
expected_modules_options = name + "_empty_modules_options",
)
device_modules_test(
name = name + "_device_modules_test",
srcs = [kernel_build_name + "_sources"],
base_kernel_label = native.package_relative_label(kernel_build_name),
base_kernel_module = min(modules) if modules else None,
arch = arch,
page_size = page_size,
)
kernel_build(
name = name + "_test_device_kernel",
arch = arch,
page_size = page_size,
makefile = makefile,
defconfig = defconfig,
pre_defconfig_fragments = [Label("//build/kernel/kleaf/tests/defconfig_test:pre_defconfig_fragment")],
base_kernel = native.package_relative_label(kernel_build_name),
make_goals = ["modules"],
# We don't actually build the kernel_build target, so we don't care about outputs
outs = [],
testonly = True,
tags = ["manual"],
visibility = ["//visibility:private"],
)
# Tests that, if the menuconfig command does not edit anything, the pre_defconfig_fragment
# should still stay the same.
pre_defconfig_fragments_menuconfig_test(
name = name + "_pre_defconfig_fragments_menuconfig_test",
kernel_build = name + "_test_device_kernel",
pre_defconfig_fragment = Label("//build/kernel/kleaf/tests/defconfig_test:pre_defconfig_fragment"),
visibility = ["//visibility:private"],
)
# Build ddk_examples to make sure our DDK examples are up-to-date. Note that these examples
# deliberately refers to //common explicitly to provide a clear example, so this build test
# is only included when we are building //common:kernel_aarch64.
extra_tests = []
if native.package_relative_label(kernel_build_name) == native.package_relative_label("//common:kernel_aarch64"):
extra_tests += [
Label("//build/kernel/kleaf/tests/built_with_ddk_test"),
Label("//build/kernel/kleaf/tests/ddk_examples"),
]
# Building pKVM module with DDK is only supported if the following file exists.
if native.glob(["arch/arm64/kvm/hyp/nvhe/Makefile.module"]):
extra_tests.append(
Label("//build/kernel/kleaf/tests/ddk_examples:pkvm_module_test"),
)
# This test internally adds the needed checks.
symbol_presence_test(
name = name + "_runtime_protection_symbol_presence_test",
kernel_build = kernel_build_name,
protected_exports_list = protected_exports_list,
visibility = ["//visibility:private"],
)
extra_tests.append(
name + "_runtime_protection_symbol_presence_test",
)
native.test_suite(
name = name,
tests = [
name + "_empty",
name + "_fake",
name + "_device_modules_test",
name + "_pre_defconfig_fragments_menuconfig_test",
] + extra_tests,
)
def _common_kernel_abi_dist(
name,
kernel_abi,
dist_targets,
ignore_diff = None,
no_ignore_diff_target = None):
"""Defines a `kernel_abi_wrapped_dist` for a common kernel."""
pkg_files(
name = name + "_internal_files",
srcs = dist_targets + [kernel_abi],
strip_prefix = strip_prefix.files_only(),
visibility = ["//visibility:private"],
)
pkg_install(
name = name + "_internal",
srcs = [name + "_internal_files"],
destdir = "out_abi/{name}/dist".format(name = name),
)
# TODO(b/231647455): Clean up hard-coded name "_abi_diff_executable".
kernel_abi_wrapped_dist_internal(
name = name,
dist = name + "_internal",
diff_stg = kernel_abi + "_diff_executable",
enable_add_vmlinux = _GKI_ADD_VMLINUX,
ignore_diff = ignore_diff,
no_ignore_diff_target = no_ignore_diff_target,
)