blob: fcf639d5ce89fa93dec28c7cd897673264f6b9a3 [file] [log] [blame]
# Copyright 2022 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/bazel/bazel_workspace.gni")
import("//build/images/args.gni")
import("//build/python/python_action.gni")
assert(is_fuchsia,
"Assembly templates can only be used with `$default_toolchain`.")
# Collect a newline-delimited text file of the package manifests for all
# packages in a given package set from the `ffx assembly product` call.
#
# Arguments:
#
# package_set (string, required)
# Which package set to get. Valid values are:
# base
# cache
# on_demand
#
# assembly_label (GN label, required)
# Label for the assembled_system() invocation to use, e.g. //build/images/fuchsia.
#
# is_bazel_assembled (bool, required)
# Whether the assembly label corresponds to a Bazel-assembled or GN-assembled product.
# Typically you'd want this value to be the same as `use_bazel_images_only`.
#
# namespace (string, optional)
# The effective namespace used by the system label.
# Defaults to the 'name' of the label in 'assembly_label'.
# Only applicable for GN/non-Bazel assembly.
#
# outputs (list of paths, required)
# Usual GN meaning, expects a single file to write to.
#
# testonly
# visibility
template("packages_from_product_assembler") {
assert(
defined(invoker.assembly_label),
"must define a `assembly_label` argument which points to an assembled_system() invocation")
assert(defined(invoker.outputs), "must define `outputs`")
assert(defined(invoker.is_bazel_assembled),
"must define `is_bazel_assembled`")
assert(!invoker.is_bazel_assembled || !defined(invoker.namespace),
"`namespace` is not allowed for Bazel-assembled products!")
assert(
defined(invoker.package_set),
"must define a `package_set` argument specifying which package set to list")
valid_package_sets = [
"base",
"cache",
"on_demand",
]
assert(valid_package_sets + [ invoker.package_set ] -
[ invoker.package_set ] != valid_package_sets,
"the `package_set` argument must be one of: ${valid_package_sets}")
_assembly_target_name = get_label_info(invoker.assembly_label, "name")
_assembly_dir = get_label_info(invoker.assembly_label, "dir")
_assembly_namespace = _assembly_target_name
_is_bazel_assembled = invoker.is_bazel_assembled
if (defined(invoker.namespace)) {
_assembly_namespace = invoker.namespace
}
if (_is_bazel_assembled) {
_assembly_gen_dir = get_label_info(invoker.assembly_label, "target_out_dir")
_assembly_manifest = "${_assembly_gen_dir}/${_assembly_target_name}_product_assembly/image_assembly.json"
_assembly_dep = "${_assembly_dir}:${_assembly_namespace}_product_assembly"
} else {
_assembly_out_dir = get_label_info(invoker.assembly_label, "target_out_dir")
_assembly_manifest =
"${_assembly_out_dir}/${_assembly_target_name}/image_assembly.json"
_assembly_dep = "${_assembly_dir}:${_assembly_namespace}.product_assembler"
}
python_action(target_name) {
forward_variables_from(invoker,
[
"outputs",
"testonly",
"visibility",
])
binary_label = "//build/assembly/scripts:packages_from_product_assembler"
args = [
"--assembly-manifest",
rebase_path(_assembly_manifest, root_build_dir),
"--package-set",
invoker.package_set,
"--output",
rebase_path(outputs[0], root_build_dir),
]
if (_is_bazel_assembled) {
args += [
"--rebase",
rebase_path(bazel_execroot, root_build_dir),
]
}
inputs = [ _assembly_manifest ]
deps = [ _assembly_dep ]
}
}