summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYifan Hong <elsk@google.com>2023-09-25 15:45:38 -0700
committerYifan Hong <elsk@google.com>2024-03-20 12:06:49 -0700
commit6f63d38b742fefd16a3389f3e64ca2d00c0f5437 (patch)
tree1af402c953e5744cdaa86e7317e30fcc91f90ede
parentccfb5394430125d80c3cb66d4fe1fe4c0037a41f (diff)
downloadbuild-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.md8
-rw-r--r--kleaf/impl/common_providers.bzl3
-rw-r--r--kleaf/impl/kernel_build.bzl60
-rw-r--r--kleaf/impl/kernel_filegroup.bzl66
-rw-r--r--kleaf/impl/kernel_filegroup_declaration.bzl28
-rw-r--r--kleaf/impl/modules_prepare.bzl26
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(&#10; name = "kernel_aarch64_prebuilts",&#10; srcs = [&#10; "vmlinux",&#10; # ...&#10; ],&#10; kernel_uapi_headers = "kernel-uapi-headers.tar.gz",&#10;)&#10;&#10;kernel_build(&#10; name = "tuna",&#10; base_kernel = ":kernel_aarch64_prebuilts",&#10; # ...&#10;)&#10;&#10;merged_kernel_uapi_headers(&#10; name = "tuna_merged_kernel_uapi_headers",&#10; kernel_build = "tuna",&#10; # ...&#10;)</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(),