Skip to content

Commit

Permalink
kleaf: no output_list for _kernel_build to support select
Browse files Browse the repository at this point in the history
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:

  bazelbuild/bazel#281

Bug: 202075567
Bug: 202075499
Test: builds

Change-Id: I92d5c7f357d2d69c40039ef35b3e0a25cdb7214f
  • Loading branch information
Yifan Hong committed Oct 8, 2021
1 parent 435a260 commit 92588c6
Showing 1 changed file with 23 additions and 18 deletions.
41 changes: 23 additions & 18 deletions kleaf/kernel.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ def kernel_build(
name,
build_config,
srcs,
outs,
outs = [],
module_outs = [],
generate_vmlinux_btf = False,
deps = (),
Expand Down Expand Up @@ -220,9 +220,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,
archive_out_dir = archive_out_dir,
)
Expand Down Expand Up @@ -534,14 +534,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),
Expand All @@ -552,14 +553,16 @@ 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

# default outputs of this rule, aka output files that are emitted to DIST_DIR
default_outputs = ctx.outputs.outs + ctx.outputs.module_outs
default_outputs = all_output_files["outs"] + all_output_files["module_outs"]

out_dir_tar_command = ""
if ctx.attr.archive_out_dir:
Expand Down Expand Up @@ -622,8 +625,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}}
Expand All @@ -648,7 +653,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(default_outputs)),
]
Expand All @@ -663,9 +668,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"),
Expand Down

0 comments on commit 92588c6

Please sign in to comment.