diff options
author | Yifan Hong <elsk@google.com> | 2024-03-11 19:08:36 -0700 |
---|---|---|
committer | Yifan Hong <elsk@google.com> | 2024-03-15 20:45:21 +0000 |
commit | d4d063963778f294f747f778cf75692aeacf9106 (patch) | |
tree | c552f65cc582ed9bcfde27fde0188c7432216d55 | |
parent | 13efb6e4f49d407ee06f44c28b5ebce1afda8aea (diff) | |
download | build-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.bzl | 14 | ||||
-rw-r--r-- | kleaf/impl/BUILD.bazel | 1 | ||||
-rw-r--r-- | kleaf/impl/common_providers.bzl | 31 | ||||
-rw-r--r-- | kleaf/impl/constants.bzl | 5 | ||||
-rw-r--r-- | kleaf/impl/kernel_build.bzl | 44 | ||||
-rw-r--r-- | kleaf/impl/kernel_filegroup_declaration.bzl | 148 | ||||
-rw-r--r-- | kleaf/impl/kernel_prebuilt_utils.bzl | 4 |
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", |