From a1de61b7206580f6ad98baa9d85270bfabb93cf5 Mon Sep 17 00:00:00 2001 From: Yifan Hong Date: Thu, 7 Oct 2021 23:38:27 -0700 Subject: [PATCH] kleaf: no output_list for _kernel_build to support select To support select() properly, the argument "outs" in kernel_build macro cannot be parsed, and it needs to be passed to _kernel_build directly. Hence, outs (and for consistency, module_outs and implicit_outs) of _kernel_build are changed to a string_list. Then inside _kernel_build_impl, declare_file() of the proper output file. Because _kernel_build_impl already explicitly return DefaultInfo(), this is okay. The downside is that the following becomes invalid: kernel_build(name = "kernel", out = ["vmlinux"]) filegroup(name = "foo", srcs = ["kernel/vmlinux"]) This is because `kernel/vmlinux` is no longer in the explicit output list. See discussion thread: https://github.com/bazelbuild/bazel/issues/281 Change-Id: I92d5c7f357d2d69c40039ef35b3e0a25cdb7214f --- kleaf/kernel.bzl | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/kleaf/kernel.bzl b/kleaf/kernel.bzl index 8f7da0fb28..2a99c7d181 100644 --- a/kleaf/kernel.bzl +++ b/kleaf/kernel.bzl @@ -78,7 +78,7 @@ def kernel_build( name, build_config, srcs, - outs, + outs = [], module_outs = [], generate_vmlinux_btf = False, deps = (), @@ -215,9 +215,9 @@ def kernel_build( name = name, config = config_target_name, srcs = [sources_target_name], - outs = [name + "/" + out for out in outs], - module_outs = [name + "/" + module_out for module_out in module_outs], - implicit_outs = [name + "/" + out for out in _kernel_build_implicit_outs], + outs = outs, + module_outs = module_outs, + implicit_outs = _kernel_build_implicit_outs, deps = deps, ) @@ -528,14 +528,15 @@ def _kernel_build_impl(ctx): # kernel_build(name="kenrel", outs=["out"]) # => _kernel_build(name="kernel", outs=["kernel/out"], implicit_outs=["kernel/Module.symvers", ...]) # => all_output_names = ["foo", "Module.symvers", ...] - # all_output_files = [File(...), File(...), ...] - all_output_files = [] + # all_output_files = {"out": [File(...)], "implicit_outs": [File(...)], ...} + all_output_files = {} for attr in ("outs", "module_outs", "implicit_outs"): - all_output_files += getattr(ctx.outputs, attr) + all_output_files[attr] = [ctx.actions.declare_file("{}/{}".format(ctx.label.name, name)) for name in getattr(ctx.attr, attr)] all_output_names = [] - for out in all_output_files: - short_name = out.short_path[len(ruledir.short_path) + 1:] - all_output_names.append(short_name) + for l in all_output_files.values(): + for out in l: + short_name = out.short_path[len(ruledir.short_path) + 1:] + all_output_names.append(short_name) modules_staging_archive = ctx.actions.declare_file( "{name}/modules_staging_dir.tar.gz".format(name = ctx.label.name), @@ -546,11 +547,13 @@ def _kernel_build_impl(ctx): modules_staging_dir = modules_staging_archive.dirname + "/staging" # all outputs that |command| generates - command_outputs = all_output_files + [ + command_outputs = [ ruledir, modules_staging_archive, out_dir_kernel_headers_tar, ] + for l in all_output_files.values(): + command_outputs += l command = ctx.attr.config[_KernelEnvInfo].setup + """ # Actual kernel build @@ -599,8 +602,10 @@ def _kernel_build_impl(ctx): # Only outs and implicit_outs are needed. But for simplicity, copy the full {ruledir} # which includes module_outs too. - env_info_dependencies = ctx.attr.config[_KernelEnvInfo].dependencies + \ - all_output_files + env_info_dependencies = [] + env_info_dependencies += ctx.attr.config[_KernelEnvInfo].dependencies + for l in all_output_files.values(): + env_info_dependencies += l env_info_setup = ctx.attr.config[_KernelEnvInfo].setup + """ # Restore kernel build outputs cp -R {ruledir}/* ${{OUT_DIR}} @@ -625,7 +630,7 @@ def _kernel_build_impl(ctx): modules_staging_archive = modules_staging_archive, module_srcs = module_srcs, out_dir_kernel_headers_tar = out_dir_kernel_headers_tar, - outs = ctx.outputs.outs, + outs = all_output_files["outs"], ), DefaultInfo(files = depset(ctx.outputs.outs + ctx.outputs.module_outs)), ] @@ -640,9 +645,9 @@ _kernel_build = rule( doc = "the kernel_config target", ), "srcs": attr.label_list(mandatory = True, doc = "kernel sources"), - "outs": attr.output_list(), - "module_outs": attr.output_list(doc = "output *.ko files"), - "implicit_outs": attr.output_list(doc = "Like `outs`, but not in dist"), + "outs": attr.string_list(), + "module_outs": attr.string_list(doc = "output *.ko files"), + "implicit_outs": attr.string_list(doc = "Like `outs`, but not in dist"), "_search_and_mv_output": attr.label( allow_single_file = True, default = Label("//build/kleaf:search_and_mv_output.py"),