blob: cf8e7325b572297e64494ea4f34b479c13ca1658 [file]
# Copyright 2026 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT
# Define an action() target to embed images with a linuxboot phys_executable().
#
# This combines a phys_executable() using linuxboot (arm64 or riscv64)
#
# Parameters
#
# * shim_binary
# - Required: The raw Linux-compatible binary image, as produced by the
# image_binary() target inside phys_executable().
# Actually mutually exclusive with $shim_label; exactly one is required.
# - Type: path
#
# * shim_label
# - Optional: phys_executable() defined in earlier in the same file;
# just uses get_target_outputs(shim_label) to set $shim_binary.
# - Type: label
#
# * inputs
# - Required: Files to be concatenated as data for the shim to see.
# - Type: list(path)
#
# * output_dir
# - Optional: Directory where the image will be written.
# - Type: path
# - Default: $target_out_dir
#
# * output_extension
# - Optional: Extension to append to $output_name (after a dot unless "").
# - Type: string
# - Default: "bin"
#
# * output_name
# - Optional: File name within $output_dir where the image will be written.
# - Type: path
# - Default: $target_name
#
# * deps
# - Optional: Anything necessary to use $shim_binary and $inputs as inputs.
#
# * images_metadata, release_output, emulator_support_aib
# - Optional: As for phys_executable().
# - Type: list(scope)
#
# * data_deps, metadata, public_deps, visibility, testonly, validations
# - Optional: Usual GN meanings.
#
template("linuxboot_embed") {
if (defined(invoker.shim_binary)) {
shim_binary = invoker.shim_binary
} else {
shim_outputs = get_target_outputs(invoker.shim_label)
shim_binary = shim_outputs[0]
}
if (defined(invoker.output_dir)) {
output_dir = invoker.output_dir
} else {
output_dir = target_out_dir
}
if (defined(invoker.output_extension)) {
output_extension = invoker.output_extension
} else {
output_extension = "bin"
}
if (defined(invoker.output_name)) {
output_name = invoker.output_name
} else {
output_name = target_name
}
output_file = "$output_dir/$output_name"
if (output_extension != "") {
output_file += ".$output_extension"
}
action(target_name) {
forward_variables_from(invoker,
[
"data_deps",
"deps",
"public_deps",
"testonly",
"validations",
"visibility",
])
if (!defined(deps)) {
deps = []
}
if (defined(invoker.shim_label)) {
deps += [ invoker.shim_label ]
}
script = "//zircon/kernel/phys/linuxboot-embed.py"
outputs = [ output_file ]
sources = [ shim_binary ] + invoker.inputs
args = [
"--output=" + rebase_path(output_file, root_build_dir),
"--shim=" + rebase_path(shim_binary, root_build_dir),
] + rebase_path(invoker.inputs, root_build_dir)
metadata = {
images = []
if (defined(invoker.metadata)) {
forward_variables_from(invoker.metadata, "*")
}
# For the //:images build_api_module(), as in phys_executable().
images += [
{
name = target_name
label = get_label_info(":$target_name", "label_with_toolchain")
cpu = current_cpu
# Botanist needs this exact value for images used as QEMU kernels.
type = "kernel"
# The caller can override those values and/or add others.
if (defined(invoker.images_metadata)) {
forward_variables_from(invoker.images_metadata, "*")
}
# The caller can't override `path` since that would
# not refer to this target's output any more.
path = rebase_path(output_file, root_build_dir)
},
]
if (defined(invoker.release_output) && invoker.release_output) {
exported_files = [
{
name = target_name
path = rebase_path(output_file, root_build_dir)
},
]
}
if (defined(invoker.emulator_support_aib) &&
invoker.emulator_support_aib) {
emulator_support_aib_input_barrier = []
emulator_support_aib_input = [
{
label = get_label_info(":$target_name", "label_with_toolchain")
path = rebase_path(output_file, root_build_dir)
},
]
}
}
}
}