blob: 9b05a7be634c874a85d2cc9f78d8a5dba271dba5 [file] [log] [blame]
# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//build/dist/fini_manifest.gni")
# Define inputs to a dependent zbi() target.
#
# The target generates a manifest that collects any manifest_lines from its
# dependencies' metadata, e.g. contributed by resource() targets. It
# contributes metadata that will drive zbi() to use this manifest, as well
# as any non-BOOTFS inputs given via $sources and $args.
#
# resource() targets in the dependencies explicitly contribute to the
# manifest. Many other target types such as executable() and
# shared_library() that have a $install_path parameter (even if defaulted)
# implicitly contribute to the manifest.
#
# It's not necessary to use an explicit zbi_input() target just to collect
# files into the BOOTFS of a zbi(). Use zbi_input() explicitly to get the
# manifest file as an explicit build artifact, to apply a target directory
# prefix to the manfiest file, or to include other types.
#
# Parameters
#
# data_deps, deps
# Optional: Dependencies examined for metadata. Any other zbi_input()
# or zbi() targets in this dependency graph will flow into any zbi()
# target that depends on this one. Any manifest metadata will be collected
# here into a manifest file; see manifest_file().
# Type: list(label)
#
# prefix
# Optional: Directory prefix prepended to the target path in each
# manifest entry. This is normalized when nonempty so it need not end
# with a `/`.
# Type: string
# Default: ""
#
# type
# Optional: The input type for any $sources or $args, as in the
# `--type` switch to the `zbi` tool. See `zbi --help` for the set of
# available types. A value of "" uses `zbi --files`.
# Type: string
# Default: ""
#
# sources
# Optional: Files to put into the ZBI. $type determines what kinds of
# files these can be and how their contents are used. If $type is ""
# (the default), then these can be manifest files or directories.
# Type: list(file)
#
# args
# Optional: Additional arguments to the `zbi` tool. These are switches
# that will precede the $sources on the `zbi` command line, so they
# can include e.g. `--prefix=...` to affect contents of manifest file.
# The most common use is "--entry=..." to provide literal contents right
# in the GN file (e.g. for `type = "cmdline"`).
#
# See manifest_file() for additional parameters. The manifest file
# produced from those parameters contributes to the BOOTFS (as modified
# by $prefix).
#
template("zbi_input") {
manifest_file = "$target_gen_dir/$target_name.fini"
fini_manifest(target_name) {
prefix = ""
forward_variables_from(invoker,
"*",
[
"args",
"metadata",
"type",
"sources",
])
metadata = {
zbi_input_barrier = []
zbi_input_args = []
if (defined(invoker.metadata)) {
forward_variables_from(invoker.metadata, "*")
}
# When a zbi() target depends on this zbi_input() target, it includes
# other zbi_input() targets in this target's deps, but not data_deps.
if (defined(invoker.deps)) {
zbi_input_barrier += invoker.deps
}
# An explicit type applies only to $sources and $args.
if (defined(invoker.type) && invoker.type != "") {
zbi_input_args += [ "--type=${invoker.type}" ]
} else if (defined(invoker.args) || defined(invoker.sources)) {
zbi_input_args += [
# The implicit type is always --files, and needs to be reset in
# case the previous `zbi_input_args` list collected left a
# different `--type=...` as the last state.
"--files",
# Following $args and $sources entries shouldn't get a
# previously-set prefix.
"--prefix=",
]
}
# Explicit $args come first, for e.g. "-u" or "-g" to affect inputs.
# $args may also contain "--entry=..." payloads directly.
if (defined(invoker.args)) {
zbi_input_args += invoker.args
}
if (defined(invoker.sources)) {
zbi_input_args += rebase_path(invoker.sources, root_build_dir)
}
if (defined(invoker.args)) {
# Explicit $args might have set the compression state for its $sources
# so be sure to reset to default state.
zbi_input_args += [ "--compressed" ]
}
# Always include the manifest generated from the deps here. The
# presence of the fini_manifest() target will prevent zbi()
# from collecting entries that are redundant with this manifest.
zbi_input_args += [
"--prefix=$prefix",
"--files",
rebase_path(manifest_file, root_build_dir),
]
}
}
}