summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYifan Hong <elsk@google.com>2024-03-11 19:08:36 -0700
committerYifan Hong <elsk@google.com>2024-03-15 20:45:21 +0000
commitd4d063963778f294f747f778cf75692aeacf9106 (patch)
treec552f65cc582ed9bcfde27fde0188c7432216d55
parent13efb6e4f49d407ee06f44c28b5ebce1afda8aea (diff)
downloadbuild-d4d063963778f294f747f778cf75692aeacf9106.tar.gz
kleaf: Add kernel_filegroup_declaration rule.
Given a kernel_build, this rule generates an archive containing some files and a fragment of a BUILD.bazel file with the kernel_filegroup declaration. Generally, all files and info comes from kernel_build. There are a few exceptions; e.g. kernel_build emits KernelUnstrippedModulesInfo, but kernel_filegroup requires unstripped_modules.tar.gz that is emitted by a different rule, kernel_unstripped_modules_archive. Bug: 298416462 Change-Id: Ie6d79f31558df77b025ab511187d82fcc21f2759
-rw-r--r--kleaf/common_kernels.bzl14
-rw-r--r--kleaf/impl/BUILD.bazel1
-rw-r--r--kleaf/impl/common_providers.bzl31
-rw-r--r--kleaf/impl/constants.bzl5
-rw-r--r--kleaf/impl/kernel_build.bzl44
-rw-r--r--kleaf/impl/kernel_filegroup_declaration.bzl148
-rw-r--r--kleaf/impl/kernel_prebuilt_utils.bzl4
7 files changed, 241 insertions, 6 deletions
diff --git a/kleaf/common_kernels.bzl b/kleaf/common_kernels.bzl
index 64ba5aa..73a0e18 100644
--- a/kleaf/common_kernels.bzl
+++ b/kleaf/common_kernels.bzl
@@ -29,6 +29,7 @@ load(
"TOOLCHAIN_VERSION_FILENAME",
)
load("//build/kernel/kleaf/impl:gki_artifacts.bzl", "gki_artifacts", "gki_artifacts_prebuilts")
+load("//build/kernel/kleaf/impl:kernel_filegroup_declaration.bzl", "kernel_filegroup_declaration")
load(
"//build/kernel/kleaf/impl:kernel_prebuilt_utils.bzl",
"CI_TARGET_MAPPING",
@@ -843,6 +844,18 @@ def _define_common_kernel(
],
)
+ filegroup_extra_deps = [
+ name + "_unstripped_modules_archive",
+ ]
+ kernel_filegroup_declaration(
+ name = name + "_filegroup_declaration",
+ kernel_build = name,
+ extra_deps = filegroup_extra_deps,
+ visibility = ["//visibility:private"],
+ )
+
+ # TODO(b/291918087): Drop after common_kernels no longer use kernel_filegroup.
+ # These files should already be in kernel_filegroup_declaration.
# 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.
@@ -854,6 +867,7 @@ def _define_common_kernel(
visibility = ["//visibility:private"],
)
ddk_artifacts = [
+ name + "_filegroup_declaration",
name + "_modules_prepare",
name + "_modules_staging_archive",
name + "_internal_ddk_artifacts",
diff --git a/kleaf/impl/BUILD.bazel b/kleaf/impl/BUILD.bazel
index 79aa81b..a2845ed 100644
--- a/kleaf/impl/BUILD.bazel
+++ b/kleaf/impl/BUILD.bazel
@@ -81,6 +81,7 @@ bzl_library(
"kernel_dtstree.bzl",
"kernel_env.bzl",
"kernel_filegroup.bzl",
+ "kernel_filegroup_declaration.bzl",
"kernel_headers.bzl",
"kernel_kythe.bzl",
"kernel_module.bzl",
diff --git a/kleaf/impl/common_providers.bzl b/kleaf/impl/common_providers.bzl
index 29605ad..8754d04 100644
--- a/kleaf/impl/common_providers.bzl
+++ b/kleaf/impl/common_providers.bzl
@@ -278,6 +278,37 @@ KernelBuildUnameInfo = provider(
},
)
+KernelBuildFilegroupDeclInfo = provider(
+ doc = """A provider providing information of a `kernel_build` to generate `kernel_filegroup`
+ declaration.""",
+ fields = {
+ "filegroup_srcs": """[depset](https://bazel.build/extending/depsets) of
+ [`File`](https://bazel.build/rules/lib/File)s that the
+ `kernel_filegroup` should return as default outputs.""",
+ # TODO(b/291918087): This may be embedded in the generated BUILD file directly
+ "module_outs_file": """A file containing
+ `[kernel_build.module_outs]`(kernel.md#kernel_build-module_outs) and
+ `[kernel_build.module_implicit_outs]`(kernel.md#kernel_build-module_implicit_outs).""",
+ "modules_staging_archive": "Archive containing staging kernel modules. ",
+ # TODO(b/291918087): This may be embedded in the generated BUILD file directly
+ "toolchain_version_file": "A file containing the toolchain version",
+ "kernel_release": "The file `kernel.release`.",
+ "modules_prepare_archive": """Archive containing the file built by
+ [`modules_prepare`](#modules_prepare)""",
+ "collect_unstripped_modules": "[`kernel_build.collect_unstripped_modules`](#kernel_build-collect_unstripped_modules)",
+ "src_protected_modules_list": """Source file with list of protected modules whose exports
+ are being protected and needs to be updated by `--update_protected_exports`.
+
+ May be `None`.""",
+ "ddk_module_defconfig_fragments": """[depset](https://bazel.build/extending/depsets) of
+ [`File`](https://bazel.build/rules/lib/File)s containing
+ [`kernel_build.ddk_module_defconfig_fragments`](#kernel_build-ddk_module_defconfig_fragments).""",
+ "kernel_uapi_headers": """[depset](https://bazel.build/extending/depsets) of
+ [`File`](https://bazel.build/rules/lib/File)s containing
+ archives of UAPI headers.""",
+ },
+)
+
GcovInfo = provider(
doc = """A provider providing information about --gcov.""",
fields = {
diff --git a/kleaf/impl/constants.bzl b/kleaf/impl/constants.bzl
index 21b618f..7858ec6 100644
--- a/kleaf/impl/constants.bzl
+++ b/kleaf/impl/constants.bzl
@@ -53,3 +53,8 @@ MODULES_STAGING_ARCHIVE = "modules_staging_dir.tar.gz"
MODULE_ENV_ARCHIVE_SUFFIX = "_module_env.tar.gz"
UNSTRIPPED_MODULES_ARCHIVE = "unstripped_modules.tar.gz"
+
+# Archive emitted by kernel_build that contains the kernel_filegroup
+# definition and extra files.
+FILEGROUP_DEF_TEMPLATE_NAME = "filegroup_decl_template.txt"
+FILEGROUP_DEF_ARCHIVE_SUFFIX = "_filegroup_decl.tar.gz"
diff --git a/kleaf/impl/kernel_build.bzl b/kleaf/impl/kernel_build.bzl
index 5bf8278..81a5a79 100644
--- a/kleaf/impl/kernel_build.bzl
+++ b/kleaf/impl/kernel_build.bzl
@@ -34,6 +34,7 @@ load(
"GcovInfo",
"KernelBuildAbiInfo",
"KernelBuildExtModuleInfo",
+ "KernelBuildFilegroupDeclInfo",
"KernelBuildInTreeModulesInfo",
"KernelBuildInfo",
"KernelBuildMixedTreeInfo",
@@ -85,6 +86,8 @@ _kernel_build_internal_outs = [
_KERNEL_BUILD_OUT_ATTRS = ("outs", "module_outs", "implicit_outs", "module_implicit_outs", "internal_outs")
_KERNEL_BUILD_MODULE_OUT_ATTRS = ("module_outs", "module_implicit_outs")
+_MODULES_PREPARE_ARCHIVE = "modules_prepare_outdir.tar.gz"
+
def kernel_build(
name,
build_config,
@@ -583,7 +586,7 @@ def kernel_build(
name = modules_prepare_target_name,
config = config_target_name,
srcs = srcs,
- outdir_tar_gz = modules_prepare_target_name + "/modules_prepare_outdir.tar.gz",
+ outdir_tar_gz = modules_prepare_target_name + "/" + _MODULES_PREPARE_ARCHIVE,
trim_nonlisted_kmi = trim_nonlisted_kmi,
force_generate_headers = modules_prepare_force_generate_headers,
**internal_kwargs
@@ -1871,6 +1874,11 @@ def _create_infos(
]),
)
+ ddk_module_defconfig_fragments = depset(transitive = [
+ target.files
+ for target in ctx.attr.ddk_module_defconfig_fragments
+ ])
+
kernel_build_module_info = KernelBuildExtModuleInfo(
modules_staging_archive = modules_staging_archive,
module_hdrs = module_srcs.module_hdrs,
@@ -1880,18 +1888,16 @@ def _create_infos(
modinst_env = modinst_env,
collect_unstripped_modules = ctx.attr.collect_unstripped_modules,
strip_modules = ctx.attr.strip_modules,
- ddk_module_defconfig_fragments = depset(transitive = [
- target.files
- for target in ctx.attr.ddk_module_defconfig_fragments
- ]),
+ ddk_module_defconfig_fragments = ddk_module_defconfig_fragments,
)
kernel_uapi_depsets = []
if base_kernel:
kernel_uapi_depsets.append(base_kernel[KernelBuildUapiInfo].kernel_uapi_headers)
kernel_uapi_depsets.append(ctx.attr.kernel_uapi_headers.files)
+ kernel_uapi_headers_depset = depset(transitive = kernel_uapi_depsets, order = "postorder")
kernel_build_uapi_info = KernelBuildUapiInfo(
- kernel_uapi_headers = depset(transitive = kernel_uapi_depsets, order = "postorder"),
+ kernel_uapi_headers = kernel_uapi_headers_depset,
)
if ctx.files.combined_abi_symbollist:
@@ -1935,6 +1941,8 @@ def _create_infos(
)
# List of artifacts to be used when creating a kernel_filegroup that mimics this target.
+ # TODO(b/291918087): Drop after common_kernels no longer use kernel_filegroup.
+ # These files should already be in kernel_filegroup_declaration.
internal_ddk_artifacts = [
all_module_names_file,
]
@@ -1955,6 +1963,9 @@ def _create_infos(
output_group_kwargs = {}
for d in all_output_files.values():
output_group_kwargs.update({name: depset([file]) for name, file in d.items()})
+
+ # TODO(b/291918087): Drop after common_kernels no longer use kernel_filegroup.
+ # These files should already be in kernel_filegroup_declaration.
output_group_kwargs["modules_staging_archive"] = depset([modules_staging_archive])
output_group_kwargs[MODULE_OUTS_FILE_OUTPUT_GROUP] = depset([all_module_names_file])
output_group_kwargs[TOOLCHAIN_VERSION_FILENAME] = depset([toolchain_version_out])
@@ -1971,6 +1982,26 @@ def _create_infos(
directories = depset([main_action_ret.cmd_dir]),
)
+ modules_prepare_archive = utils.find_file(
+ _MODULES_PREPARE_ARCHIVE,
+ ctx.files.modules_prepare,
+ what = ctx.label,
+ required = True,
+ )
+
+ filegroup_decl_info = KernelBuildFilegroupDeclInfo(
+ filegroup_srcs = all_output_files["outs"].values() + all_output_files["module_outs"].values(),
+ module_outs_file = all_module_names_file,
+ modules_staging_archive = modules_staging_archive,
+ toolchain_version_file = toolchain_version_out,
+ kernel_release = all_output_files["internal_outs"]["include/config/kernel.release"],
+ modules_prepare_archive = modules_prepare_archive,
+ collect_unstripped_modules = ctx.attr.collect_unstripped_modules,
+ src_protected_modules_list = ctx.file.src_protected_modules_list,
+ ddk_module_defconfig_fragments = ddk_module_defconfig_fragments,
+ kernel_uapi_headers = kernel_uapi_headers_depset,
+ )
+
default_info_files = all_output_files["outs"].values() + all_output_files["module_outs"].values()
if kmi_strict_mode_out:
default_info_files.append(kmi_strict_mode_out)
@@ -1998,6 +2029,7 @@ def _create_infos(
in_tree_modules_info,
images_info,
gcov_info,
+ filegroup_decl_info,
ctx.attr.config[KernelEnvAttrInfo],
ctx.attr.config[KernelToolchainInfo],
output_group_info,
diff --git a/kleaf/impl/kernel_filegroup_declaration.bzl b/kleaf/impl/kernel_filegroup_declaration.bzl
new file mode 100644
index 0000000..fe50191
--- /dev/null
+++ b/kleaf/impl/kernel_filegroup_declaration.bzl
@@ -0,0 +1,148 @@
+# Copyright (C) 2024 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.
+
+"""Given a kernel_build, generates corresponding kernel_filegroup target declaration."""
+
+load(":common_providers.bzl", "KernelBuildFilegroupDeclInfo")
+load(
+ ":constants.bzl",
+ "FILEGROUP_DEF_ARCHIVE_SUFFIX",
+ "FILEGROUP_DEF_TEMPLATE_NAME",
+)
+load(":hermetic_toolchain.bzl", "hermetic_toolchain")
+
+visibility("//build/kernel/kleaf/...")
+
+def _kernel_filegroup_declaration_impl(ctx):
+ hermetic_tools = hermetic_toolchain.get(ctx)
+ info = ctx.attr.kernel_build[KernelBuildFilegroupDeclInfo]
+
+ file_to_label = lambda file: repr("//{}".format(file.basename) if file else None)
+ file_to_pkg_label = lambda file: repr(":{}".format(file.basename) if file else None)
+ files_to_label = lambda lst: repr(["//{}".format(file.basename) for file in lst])
+ files_to_pkg_label = lambda lst: repr([":{}".format(file.basename) for file in lst])
+
+ # ddk_artifacts
+ deps_files = [
+ # _modules_prepare
+ info.modules_prepare_archive,
+ info.modules_staging_archive,
+ info.toolchain_version_file,
+ ]
+
+ deps_repr = repr([":{}".format(file.basename) for file in deps_files] +
+ ["//{}".format(file.basename) for file in ctx.files.extra_deps])
+
+ kernel_uapi_headers_lst = info.kernel_uapi_headers.to_list()
+ if not kernel_uapi_headers_lst:
+ fail("{}: {} does not have kernel_uapi_headers.".format(ctx.label, ctx.attr.kernel_build.label))
+ if len(kernel_uapi_headers_lst) > 1:
+ fail("{}: kernel_filegroup_declaration on kernel_build {} with base_kernel is not supported yet.".format(
+ ctx.label,
+ ctx.attr.kernel_build.label,
+ ))
+ kernel_uapi_headers = kernel_uapi_headers_lst[0]
+
+ fragment = """\
+kernel_filegroup(
+ name = {name_repr},
+ srcs = {srcs_repr},
+ deps = {deps_repr},
+ kernel_uapi_headers = {uapi_headers_repr},
+ collect_unstripped_modules = {collect_unstripped_modules_repr},
+ module_outs_file = {module_outs_repr},
+ kernel_release = {kernel_release_repr},
+ protected_modules_list = {protected_modules_repr},
+ ddk_module_defconfig_fragments = {ddk_module_defconfig_fragments_repr},
+ visibility = ["//visibility:public"],
+)
+""".format(
+ name_repr = repr(ctx.attr.kernel_build.label.name),
+ srcs_repr = files_to_label(info.filegroup_srcs),
+ deps_repr = deps_repr,
+ uapi_headers_target_repr = repr(ctx.attr.kernel_build.label.name + "_uapi_headers"),
+ uapi_headers_repr = file_to_label(kernel_uapi_headers),
+ collect_unstripped_modules_repr = repr(info.collect_unstripped_modules),
+ module_outs_repr = file_to_pkg_label(info.module_outs_file),
+ kernel_release_repr = file_to_pkg_label(info.kernel_release),
+ protected_modules_repr = file_to_pkg_label(info.src_protected_modules_list),
+ ddk_module_defconfig_fragments_repr = files_to_pkg_label(
+ info.ddk_module_defconfig_fragments.to_list(),
+ ),
+ )
+
+ filegroup_decl_file = ctx.actions.declare_file("{}/{}".format(
+ ctx.attr.kernel_build.label.name,
+ FILEGROUP_DEF_TEMPLATE_NAME,
+ ))
+ ctx.actions.write(filegroup_decl_file, fragment)
+
+ filegroup_decl_archive = ctx.actions.declare_file("{name}/{name}{suffix}".format(
+ name = ctx.attr.kernel_build.label.name,
+ suffix = FILEGROUP_DEF_ARCHIVE_SUFFIX,
+ ))
+ direct_inputs = deps_files + [
+ filegroup_decl_file,
+ info.module_outs_file,
+ info.kernel_release,
+ kernel_uapi_headers,
+ ]
+ if info.src_protected_modules_list:
+ direct_inputs.append(info.src_protected_modules_list)
+ transitive_inputs = [info.ddk_module_defconfig_fragments]
+ inputs = depset(
+ direct_inputs,
+ transitive = transitive_inputs,
+ )
+
+ # Flatten the files so :x refers to file x in the same package.
+ command = hermetic_tools.setup + """
+ tar cf {archive} --dereference --transform 's:.*/::g' "$@"
+ """.format(
+ archive = filegroup_decl_archive.path,
+ )
+ args = ctx.actions.args()
+ args.add_all(inputs)
+ ctx.actions.run_shell(
+ inputs = inputs,
+ tools = hermetic_tools.deps,
+ outputs = [filegroup_decl_archive],
+ command = command,
+ arguments = [args],
+ progress_message = "Creating archive of kernel_filegroup declaration {}".format(ctx.label),
+ mnemonic = "KernelfilegroupDeclaration",
+ )
+
+ return DefaultInfo(files = depset([filegroup_decl_archive]))
+
+kernel_filegroup_declaration = rule(
+ implementation = _kernel_filegroup_declaration_impl,
+ doc = "Given a kernel_build, generates corresponding kernel_filegroup target declaration.",
+ attrs = {
+ "kernel_build": attr.label(
+ mandatory = True,
+ providers = [KernelBuildFilegroupDeclInfo],
+ ),
+ "extra_deps": attr.label_list(
+ doc = """Extra files to be placed in the `deps` of the generated `kernel_filegroup`.
+
+ These files are downloaded separately by `kernel_prebuilt_repo`.
+
+ These files are not included in the generated archive.
+ """,
+ allow_files = True,
+ ),
+ },
+ toolchains = [hermetic_toolchain.type],
+)
diff --git a/kleaf/impl/kernel_prebuilt_utils.bzl b/kleaf/impl/kernel_prebuilt_utils.bzl
index 71891dd..4da59e0 100644
--- a/kleaf/impl/kernel_prebuilt_utils.bzl
+++ b/kleaf/impl/kernel_prebuilt_utils.bzl
@@ -91,6 +91,8 @@ GKI_DOWNLOAD_CONFIGS = [
{
"target_suffix": "ddk_artifacts",
"outs": [
+ # TODO(b/291918087): Drop after common_kernels no longer use kernel_filegroup.
+ # These files should already be in kernel_filegroup_declaration.
# _modules_prepare
"modules_prepare_outdir.tar.gz",
# _modules_staging_archive
@@ -118,6 +120,8 @@ CI_TARGET_MAPPING = {
# TODO: Rename this when more architectures are added.
"target": "kernel_aarch64",
"outs": DEFAULT_GKI_OUTS + [
+ # TODO(b/291918087): Drop after common_kernels no longer use kernel_filegroup.
+ # These files should already be in kernel_filegroup_declaration.
"kernel_aarch64" + MODULE_OUTS_FILE_SUFFIX,
],
"protected_modules": "gki_aarch64_protected_modules",