diff options
author | Yifan Hong <elsk@google.com> | 2023-09-25 15:45:38 -0700 |
---|---|---|
committer | Yifan Hong <elsk@google.com> | 2024-03-20 12:06:49 -0700 |
commit | 6f63d38b742fefd16a3389f3e64ca2d00c0f5437 (patch) | |
tree | 1af402c953e5744cdaa86e7317e30fcc91f90ede | |
parent | ccfb5394430125d80c3cb66d4fe1fe4c0037a41f (diff) | |
download | build-6f63d38b742fefd16a3389f3e64ca2d00c0f5437.tar.gz |
kleaf: kernel_filegroup impl mod_min_env
This resolves the following error:
Traceback (most recent call last):
File "<...>/build/kernel/kleaf/impl/ddk/ddk_config.bzl", line 39, column 54, in _ddk_config_impl
serialized_env_info = _create_serialized_env_info(
File "<...>/build/kernel/kleaf/impl/ddk/ddk_config.bzl", line 218, column 67, in _create_serialized_env_info
pre_info = ctx.attr.kernel_build[KernelBuildExtModuleInfo].mod_min_env
Error: 'KernelBuildExtModuleInfo' value has no field or method 'mod_min_env'
Bug: 291918087
Change-Id: Ie165e16be8fd9fbe93d8e8cd79eaf0af53fc1dfc
-rw-r--r-- | kleaf/docs/api_reference/kernel.md | 8 | ||||
-rw-r--r-- | kleaf/impl/common_providers.bzl | 3 | ||||
-rw-r--r-- | kleaf/impl/kernel_build.bzl | 60 | ||||
-rw-r--r-- | kleaf/impl/kernel_filegroup.bzl | 66 | ||||
-rw-r--r-- | kleaf/impl/kernel_filegroup_declaration.bzl | 28 | ||||
-rw-r--r-- | kleaf/impl/modules_prepare.bzl | 26 |
6 files changed, 159 insertions, 32 deletions
diff --git a/kleaf/docs/api_reference/kernel.md b/kleaf/docs/api_reference/kernel.md index 141751a..d2a9640 100644 --- a/kleaf/docs/api_reference/kernel.md +++ b/kleaf/docs/api_reference/kernel.md @@ -260,9 +260,9 @@ Define an executable that creates `compile_commands.json` from a `kernel_build`. <pre> kernel_filegroup(<a href="#kernel_filegroup-name">name</a>, <a href="#kernel_filegroup-deps">deps</a>, <a href="#kernel_filegroup-srcs">srcs</a>, <a href="#kernel_filegroup-collect_unstripped_modules">collect_unstripped_modules</a>, <a href="#kernel_filegroup-config_out_dir">config_out_dir</a>, <a href="#kernel_filegroup-config_out_dir_files">config_out_dir_files</a>, <a href="#kernel_filegroup-ddk_module_defconfig_fragments">ddk_module_defconfig_fragments</a>, <a href="#kernel_filegroup-debug">debug</a>, <a href="#kernel_filegroup-env_setup_script">env_setup_script</a>, <a href="#kernel_filegroup-exec_platform">exec_platform</a>, - <a href="#kernel_filegroup-gki_artifacts">gki_artifacts</a>, <a href="#kernel_filegroup-images">images</a>, <a href="#kernel_filegroup-kasan">kasan</a>, <a href="#kernel_filegroup-kasan_generic">kasan_generic</a>, <a href="#kernel_filegroup-kasan_sw_tags">kasan_sw_tags</a>, <a href="#kernel_filegroup-kcsan">kcsan</a>, <a href="#kernel_filegroup-kernel_release">kernel_release</a>, - <a href="#kernel_filegroup-kernel_uapi_headers">kernel_uapi_headers</a>, <a href="#kernel_filegroup-lto">lto</a>, <a href="#kernel_filegroup-module_outs_file">module_outs_file</a>, <a href="#kernel_filegroup-protected_modules_list">protected_modules_list</a>, <a href="#kernel_filegroup-target_platform">target_platform</a>, - <a href="#kernel_filegroup-trim_nonlisted_kmi">trim_nonlisted_kmi</a>) + <a href="#kernel_filegroup-gki_artifacts">gki_artifacts</a>, <a href="#kernel_filegroup-images">images</a>, <a href="#kernel_filegroup-internal_outs">internal_outs</a>, <a href="#kernel_filegroup-kasan">kasan</a>, <a href="#kernel_filegroup-kasan_generic">kasan_generic</a>, <a href="#kernel_filegroup-kasan_sw_tags">kasan_sw_tags</a>, <a href="#kernel_filegroup-kcsan">kcsan</a>, + <a href="#kernel_filegroup-kernel_release">kernel_release</a>, <a href="#kernel_filegroup-kernel_uapi_headers">kernel_uapi_headers</a>, <a href="#kernel_filegroup-lto">lto</a>, <a href="#kernel_filegroup-module_outs_file">module_outs_file</a>, <a href="#kernel_filegroup-modules_prepare_archive">modules_prepare_archive</a>, + <a href="#kernel_filegroup-protected_modules_list">protected_modules_list</a>, <a href="#kernel_filegroup-target_platform">target_platform</a>, <a href="#kernel_filegroup-trim_nonlisted_kmi">trim_nonlisted_kmi</a>) </pre> **EXPERIMENTAL.** The API of `kernel_filegroup` rapidly changes and @@ -295,6 +295,7 @@ It can be used in the `base_kernel` attribute of a [`kernel_build`](#kernel_buil | <a id="kernel_filegroup-exec_platform"></a>exec_platform | Execution platform, where the build is executed.<br><br>See https://bazel.build/extending/platforms. | <a href="https://bazel.build/concepts/labels">Label</a> | required | | | <a id="kernel_filegroup-gki_artifacts"></a>gki_artifacts | A list of files that were built from the [`gki_artifacts`](#gki_artifacts) target. The `gki-info.txt` file should be part of that list.<br><br>If `kernel_release` is set, this attribute has no effect. | <a href="https://bazel.build/concepts/labels">Label</a> | optional | `None` | | <a id="kernel_filegroup-images"></a>images | A label providing files similar to a [`kernel_images`](#kernel_images) target. | <a href="https://bazel.build/concepts/labels">Label</a> | optional | `None` | +| <a id="kernel_filegroup-internal_outs"></a>internal_outs | Keys: from `_kernel_build.internal_outs`. Values: path under `$OUT_DIR`. | <a href="https://bazel.build/rules/lib/dict">Dictionary: Label -> String</a> | optional | `{}` | | <a id="kernel_filegroup-kasan"></a>kasan | - | <a href="https://bazel.build/concepts/labels">Label</a> | optional | `"@kleaf//build/kernel/kleaf:kasan"` | | <a id="kernel_filegroup-kasan_generic"></a>kasan_generic | - | <a href="https://bazel.build/concepts/labels">Label</a> | optional | `"@kleaf//build/kernel/kleaf:kasan_generic"` | | <a id="kernel_filegroup-kasan_sw_tags"></a>kasan_sw_tags | - | <a href="https://bazel.build/concepts/labels">Label</a> | optional | `"@kleaf//build/kernel/kleaf:kasan_sw_tags"` | @@ -303,6 +304,7 @@ It can be used in the `base_kernel` attribute of a [`kernel_build`](#kernel_buil | <a id="kernel_filegroup-kernel_uapi_headers"></a>kernel_uapi_headers | The label pointing to `kernel-uapi-headers.tar.gz`.<br><br>This attribute should be set to the `kernel-uapi-headers.tar.gz` artifact built by the [`kernel_build`](#kernel_build) macro if the `kernel_filegroup` rule were a `kernel_build`.<br><br>Setting this attribute allows [`merged_kernel_uapi_headers`](#merged_kernel_uapi_headers) to work properly when this `kernel_filegroup` is set to the `base_kernel`.<br><br>For example: <pre><code>kernel_filegroup( name = "kernel_aarch64_prebuilts", srcs = [ "vmlinux", # ... ], kernel_uapi_headers = "kernel-uapi-headers.tar.gz", ) kernel_build( name = "tuna", base_kernel = ":kernel_aarch64_prebuilts", # ... ) merged_kernel_uapi_headers( name = "tuna_merged_kernel_uapi_headers", kernel_build = "tuna", # ... )</code></pre> | <a href="https://bazel.build/concepts/labels">Label</a> | optional | `None` | | <a id="kernel_filegroup-lto"></a>lto | - | String | optional | `"default"` | | <a id="kernel_filegroup-module_outs_file"></a>module_outs_file | A file containing `module_outs` of the original [`kernel_build`](#kernel_build) target. | <a href="https://bazel.build/concepts/labels">Label</a> | required | | +| <a id="kernel_filegroup-modules_prepare_archive"></a>modules_prepare_archive | Archive from `modules_prepare` | <a href="https://bazel.build/concepts/labels">Label</a> | optional | `None` | | <a id="kernel_filegroup-protected_modules_list"></a>protected_modules_list | - | <a href="https://bazel.build/concepts/labels">Label</a> | optional | `None` | | <a id="kernel_filegroup-target_platform"></a>target_platform | Target platform that describes characteristics of the target device.<br><br>See https://bazel.build/extending/platforms. | <a href="https://bazel.build/concepts/labels">Label</a> | required | | | <a id="kernel_filegroup-trim_nonlisted_kmi"></a>trim_nonlisted_kmi | - | Boolean | optional | `False` | diff --git a/kleaf/impl/common_providers.bzl b/kleaf/impl/common_providers.bzl index 22694b2..917ef4a 100644 --- a/kleaf/impl/common_providers.bzl +++ b/kleaf/impl/common_providers.bzl @@ -312,6 +312,9 @@ KernelBuildFilegroupDeclInfo = provider( See [`KernelConfigInfo`](#KernelConfigInfo).""", "config_out_dir": """The output directory of `kernel_config`.""", + "internal_outs": """[depset](https://bazel.build/extending/depsets) of `kernel_build`'s + `internal_outs`. May be `None`.""", + "ruledir": "`ruledir` from `kernel_build` that signifies the root for `internal_outs`.", }, ) diff --git a/kleaf/impl/kernel_build.bzl b/kleaf/impl/kernel_build.bzl index 013cbd5..1bf3a5e 100644 --- a/kleaf/impl/kernel_build.bzl +++ b/kleaf/impl/kernel_build.bzl @@ -1738,6 +1738,38 @@ def _create_serialized_env_info( tools = pre_info.tools, ) +def get_ext_mod_env_and_outputs_info_setup_restore_outputs_command(outputs): + """Returns the `restore_outputs` command for the environment to build kernel_module. + + Args: + outputs: dictionary where + keys are `File`, and values are the relative paths under $OUT_DIR as the + destinastion + Returns: + the `restore_outputs` command for the environment to build kernel_module. + """ + + # Create a fake System.map because `make modules` does not need it. For kernel_module(), + # make modules_install needs it, but we aren't running depmod in kernel_module, so a fake one + # is good enough. + ext_mod_env_and_outputs_info_setup_restore_outputs = """ + # Fake System.map for kernel_module + touch ${OUT_DIR}/System.map + """ + ext_mod_env_and_outputs_info_setup_restore_outputs += """ + # Restore kernel build outputs necessary for building external modules + """ + for dep, relpath in outputs.items(): + ext_mod_env_and_outputs_info_setup_restore_outputs += """ + mkdir -p $(dirname ${{OUT_DIR}}/{relpath}) + rsync -aL {dep} ${{OUT_DIR}}/{relpath} + """.format( + dep = dep.path, + relpath = relpath, + ) + + return ext_mod_env_and_outputs_info_setup_restore_outputs + def _create_infos( ctx, kbuild_mixed_tree_ret, @@ -1807,24 +1839,12 @@ def _create_infos( ext_mod_env_and_outputs_info_deps = all_output_files["internal_outs"].values() - # Create a fake System.map because `make modules` does not need it. For kernel_module(), - # make modules_install needs it, but we aren't running depmod in kernel_module, so a fake one - # is good enough. - ext_mod_env_and_outputs_info_setup_restore_outputs = """ - # Fake System.map for kernel_module - touch ${OUT_DIR}/System.map - """ - ext_mod_env_and_outputs_info_setup_restore_outputs += """ - # Restore kernel build outputs necessary for building external modules - """ - for dep in ext_mod_env_and_outputs_info_deps: - relpath = paths.relativize(dep.path, main_action_ret.ruledir) - ext_mod_env_and_outputs_info_setup_restore_outputs += """ - mkdir -p $(dirname ${{OUT_DIR}}/{relpath}) - rsync -aL {dep} ${{OUT_DIR}}/{relpath} - """.format( - dep = dep.path, - relpath = relpath, + ext_mod_env_and_outputs_info_setup_restore_outputs = \ + get_ext_mod_env_and_outputs_info_setup_restore_outputs_command( + outputs = { + dep: paths.relativize(dep.path, main_action_ret.ruledir) + for dep in ext_mod_env_and_outputs_info_deps + }, ) # For kernel_module() @@ -1996,6 +2016,8 @@ def _create_infos( arch = ctx.attr.arch, env_setup_script = ctx.attr.config[KernelConfigInfo].env_setup_script, config_out_dir = ctx.file.config, + internal_outs = depset(all_output_files["internal_outs"].values()), + ruledir = main_action_ret.ruledir, ) default_info_files = all_output_files["outs"].values() + all_output_files["module_outs"].values() @@ -2083,6 +2105,8 @@ def _kernel_build_impl(ctx): ctx = ctx, module_srcs = module_srcs, ) + + # TODO(b/291918087): Delete internal_outs_archive; it is no longer used anywhere. internal_outs_archive = _create_internal_outs_archive( ctx = ctx, main_action_ret = main_action_ret, diff --git a/kleaf/impl/kernel_filegroup.bzl b/kleaf/impl/kernel_filegroup.bzl index 7ceb899..51d8626 100644 --- a/kleaf/impl/kernel_filegroup.bzl +++ b/kleaf/impl/kernel_filegroup.bzl @@ -38,10 +38,12 @@ load( ) load(":debug.bzl", "debug") load(":hermetic_toolchain.bzl", "hermetic_toolchain") +load(":kernel_build.bzl", "get_ext_mod_env_and_outputs_info_setup_restore_outputs_command") load(":kernel_config.bzl", "get_config_setup_command") load(":kernel_config_settings.bzl", "kernel_config_settings") load(":kernel_env.bzl", "get_env_info_setup_command") load(":kernel_toolchains_utils.bzl", "kernel_toolchains_utils") +load(":modules_prepare.bzl", "modules_prepare_setup_command") load( ":utils.bzl", "utils", @@ -145,25 +147,79 @@ def _get_ddk_config_env(ctx): ) return ddk_config_env +def _expect_single_file(target, what): + """Returns a single file from the given Target.""" + list_of_files = target.files.to_list() + if len(list_of_files) != 1: + fail("{} expects exactly one file, but got {}".format(what, list_of_files)) + return list_of_files[0] + +def _get_mod_min_env(ctx, ddk_config_env): + """Returns `KernelBuildExtModuleInfo.mod_min_env`.""" + if ddk_config_env == None: + return None + if not ctx.file.modules_prepare_archive: + return None + + modules_prepare_setup = modules_prepare_setup_command( + config_setup_script = ddk_config_env.setup_script, + modules_prepare_outdir_tar_gz = ctx.file.modules_prepare_archive, + ) + + ext_mod_env_and_outputs_info_setup_restore_outputs = \ + get_ext_mod_env_and_outputs_info_setup_restore_outputs_command( + outputs = { + _expect_single_file(target, what = "{}: internal_outs".format(ctx.label)): relpath + for target, relpath in ctx.attr.internal_outs.items() + }, + ) + + ddk_mod_min_env_setup_script = ctx.actions.declare_file( + "{name}/{name}_mod_min_setup.sh".format(name = ctx.attr.name), + ) + ctx.actions.write( + output = ddk_mod_min_env_setup_script, + content = """ + {modules_prepare_setup} + {ext_mod_env_and_outputs_info_setup_restore_outputs} + """.format( + modules_prepare_setup = modules_prepare_setup, + ext_mod_env_and_outputs_info_setup_restore_outputs = ext_mod_env_and_outputs_info_setup_restore_outputs, + ), + ) + return KernelSerializedEnvInfo( + setup_script = ddk_mod_min_env_setup_script, + inputs = depset([ + ddk_mod_min_env_setup_script, + ctx.file.modules_prepare_archive, + ddk_config_env.setup_script, + ], transitive = [ + ddk_config_env.inputs, + ] + [target.files for target in ctx.attr.internal_outs]), + tools = ddk_config_env.tools, + ) + def _kernel_filegroup_impl(ctx): hermetic_tools = hermetic_toolchain.get(ctx) all_deps = ctx.files.srcs + ctx.files.deps ddk_config_env = _get_ddk_config_env(ctx) + mod_min_env = _get_mod_min_env(ctx, ddk_config_env) - # TODO(b/219112010): Implement KernelSerializedEnvInfo properly kernel_module_dev_info = KernelBuildExtModuleInfo( modules_staging_archive = utils.find_file(MODULES_STAGING_ARCHIVE, all_deps, what = ctx.label), # TODO(b/211515836): module_scripts might also be downloaded # Building kernel_module (excluding ddk_module) on top of kernel_filegroup is unsupported. # module_hdrs = None, ddk_config_env = ddk_config_env, + mod_min_env = mod_min_env, collect_unstripped_modules = ctx.attr.collect_unstripped_modules, ddk_module_defconfig_fragments = depset(transitive = [ target.files for target in ctx.attr.ddk_module_defconfig_fragments ]), + strip_modules = True, # FIXME ) kernel_uapi_depsets = [] @@ -375,6 +431,14 @@ default, which in turn sets `collect_unstripped_modules` to `True` by default. allow_single_file = True, doc = "Setup script from `kernel_env`", ), + "modules_prepare_archive": attr.label( + allow_single_file = True, + doc = "Archive from `modules_prepare`", + ), + "internal_outs": attr.label_keyed_string_dict( + allow_files = True, + doc = "Keys: from `_kernel_build.internal_outs`. Values: path under `$OUT_DIR`.", + ), "_debug_print_scripts": attr.label(default = "//build/kernel/kleaf:debug_print_scripts"), "_cache_dir_config_tags": attr.label( default = "//build/kernel/kleaf/impl:cache_dir_config_tags", diff --git a/kleaf/impl/kernel_filegroup_declaration.bzl b/kleaf/impl/kernel_filegroup_declaration.bzl index e29c4aa..d6f5580 100644 --- a/kleaf/impl/kernel_filegroup_declaration.bzl +++ b/kleaf/impl/kernel_filegroup_declaration.bzl @@ -14,6 +14,7 @@ """Given a kernel_build, generates corresponding kernel_filegroup target declaration.""" +load("@bazel_skylib//lib:paths.bzl", "paths") load(":common_providers.bzl", "KernelBuildFilegroupDeclInfo") load( ":constants.bzl", @@ -98,6 +99,8 @@ kernel_filegroup( config_out_dir_files = glob([{config_out_dir_repr} + "/**"]), config_out_dir = {config_out_dir_repr}, env_setup_script = {env_setup_script_repr}, + modules_prepare_archive = {modules_prepare_archive_repr}, + internal_outs = {internal_outs_repr}, target_platform = {target_platform_repr}, exec_platform = {exec_platform_repr}, visibility = ["//visibility:public"], @@ -155,6 +158,25 @@ def _write_filegroup_decl_file(ctx, info, deps_files, kernel_uapi_headers, templ ) sub.add_joined("{config_out_dir_repr}", depset([info.config_out_dir]), **(one | pkg)) sub.add_joined("{env_setup_script_repr}", depset([info.env_setup_script]), **(one | pkg)) + sub.add_joined( + "{modules_prepare_archive_repr}", + depset([info.modules_prepare_archive]), + **(one | pkg) + ) + + # {":bazel-out/k8-fastbuild/bin/common/kernel_aarch64/Module.symvers": "Module.symvers", ...} + sub.add_joined( + "{internal_outs_repr}", + info.internal_outs, + allow_closure = True, + map_each = lambda file: "{key}: {value}".format( + key = repr(":{}".format(file.path) if file else None), + value = repr(paths.relativize(file.path, info.ruledir)), + ), + join_with = ",\n ", + format_joined = "{\n %s\n }", + ) + sub.add("{target_platform_repr}", repr(ctx.attr.kernel_build.label.name + "_platform_target")) sub.add("{exec_platform_repr}", repr(ctx.attr.kernel_build.label.name + "_platform_exec")) sub.add("{arch}", info.arch) @@ -184,10 +206,14 @@ def _create_archive(ctx, info, deps_files, kernel_uapi_headers, filegroup_decl_f kernel_uapi_headers, info.config_out_dir, info.env_setup_script, + info.modules_prepare_archive, ] if info.src_protected_modules_list: direct_inputs.append(info.src_protected_modules_list) - transitive_inputs = [info.ddk_module_defconfig_fragments] + transitive_inputs = [ + info.ddk_module_defconfig_fragments, + info.internal_outs, + ] inputs = depset( direct_inputs, transitive = transitive_inputs, diff --git a/kleaf/impl/modules_prepare.bzl b/kleaf/impl/modules_prepare.bzl index ac66cfa..86ce703 100644 --- a/kleaf/impl/modules_prepare.bzl +++ b/kleaf/impl/modules_prepare.bzl @@ -93,15 +93,9 @@ def _modules_prepare_impl(ctx): execution_requirements = kernel_utils.local_exec_requirements(ctx), ) - setup_script_cmd = """ - . {config_setup_script} - # Restore modules_prepare outputs. Assumes env setup. - [ -z ${{OUT_DIR}} ] && echo "ERROR: modules_prepare setup run without OUT_DIR set!" >&2 && exit 1 - mkdir -p ${{OUT_DIR}} - tar xf {outdir_tar_gz} -C ${{OUT_DIR}} - """.format( - config_setup_script = ctx.attr.config[KernelSerializedEnvInfo].setup_script.path, - outdir_tar_gz = ctx.outputs.outdir_tar_gz.path, + setup_script_cmd = modules_prepare_setup_command( + config_setup_script = ctx.attr.config[KernelSerializedEnvInfo].setup_script, + modules_prepare_outdir_tar_gz = ctx.outputs.outdir_tar_gz, ) # <kernel_build>_modules_prepare_setup.sh @@ -123,6 +117,20 @@ def _modules_prepare_impl(ctx): DefaultInfo(files = depset([ctx.outputs.outdir_tar_gz, setup_script])), ] +def modules_prepare_setup_command( + config_setup_script, + modules_prepare_outdir_tar_gz): + return """ + source {config_setup_script} + # Restore modules_prepare outputs. Assumes env setup. + [ -z ${{OUT_DIR}} ] && echo "ERROR: modules_prepare setup run without OUT_DIR set!" >&2 && exit 1 + mkdir -p ${{OUT_DIR}} + tar xf {modules_prepare_outdir_tar_gz} -C ${{OUT_DIR}} + """.format( + config_setup_script = config_setup_script.path, + modules_prepare_outdir_tar_gz = modules_prepare_outdir_tar_gz.path, + ) + def _modules_prepare_additional_attrs(): return dicts.add( kernel_config_settings.of_modules_prepare(), |