# Copyright 2019 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/assembly/compare_image_assembly_configs.gni")
import("//build/assembly/compare_json_list.gni")
import("//build/assembly/generated_image_assembly_config.gni")
import("//build/assembly/generated_images_config.gni")
import("//build/assembly/hermetic_inputs_for_image_assembly.gni")
import("//build/assembly/legacy_assembly_input_bundle.gni")
import("//build/component/component_id_index.gni")
import("//build/config.gni")
import("//build/drivers/driver_manifest.gni")
import("//build/images/fvm.gni")
import("//build/images/shell_commands.gni")
import("//build/info/info.gni")
import("//build/packages/package_metadata.gni")
import("//build/zircon/tools.gni")
import("//src/developer/ffx/build/ffx_action.gni")
import("//src/storage/fshost/generated_fshost_config.gni")

# Assembles a Fuchsia system.
#
# Given base, cache, and universe packages, assembles a Fuchsia system
# containing those packages.
#
# Parameters:
#
#   image_name (optional; default: target_name)
#     [string] A name to use for naming all outputs and generated files, instead
#     of $target_name.
#
#   output_dir (optional; default: target_out_dir)
#     [string] The output directory into which the final system ZBI is written.
#
#   output_name (optional; default: <target_name>.zbi)
#     [string] The name of the final system ZBI file.
#
#   testonly (optional)
#     [bool] Usual GN meanings.
#
# Product parameters:
#
#   product_assembly_config_file (optional)
#     [file] A path to a product assembly config file.  If not specified, a
#     placeholder file will be generated and used.
#
#   product_assembly_config_dep (optional)
#     [label] A label for the above product assembly config, if it's the output
#     of a build action.
#
#   base_packages (required)
#     [list of labels] The packages to include in the base package set.
#
#   base_driver_packages (optional)
#     [list of labels] The driver packages to include in the base package set.
#
#   cache_packages (optional)
#     [list of labels] The packages to cache in the images.
#
#   universe_packages (optional)
#     [list of labels] The packages to build in addition to the base and cache
#     sets. These packages do not contribute to the produced images directly,
#     however they may contribute to the config-data and shell-commands meta
#     packages.
#
#   meta_packages (optional)
#     [list of labels] The packages to build in addition to the base and cache
#     sets, but are base_packages themselves.  These are packages that contain
#     files that are generated based on other packages in the base, cache,
#     and/or universe sets, and therefore cannot be part of those sets directly,
#     or a GN dependency cycle will result.
#
#   bootfs_labels (required)
#     [list of labels] The objects installed on the bootfs partition of the
#     generated ZBI.
#
#   bootfs_package_labels (optional)
#     [list of labels] The packages installed on the bootfs partition of the
#     generated ZBI as meta.fars and content-id'd blobs.
#
#   system_image_deps (optional)
#     [list of labels] The objects installed in the system image.
#
#   devmgr_config (default: [])
#     [list of strings] List of arguments to add to /boot/config/devmgr.
#     These arguments come after synthesized arguments to configure blobfs.
#
#   fshost_config (default: {})
#     [scope] Arguments to add to fshost's configuration. These
#     arguments come before other arguments set by build args.
#
#   cmdline (optional)
#     [list of strings] Kernel command line text.
#
#   cmdline_deps (optional)
#     [list of labels] Dependencies with metadata including additional kernel
#     command arguments to add to the ZBI.
#
#   include_component_id_index (default: false)
#     [bool] Collect and merges a component id index from the base
#     package set.
#
#   include_shell_commands (default: true)
#     [bool] Whether to include shell commands. Should be set to false for
#     build without shell access.
#
#   include_config_data (default: true)
#     [bool] Whether to create a config_data package for the assembly or not.
#
#   base_package_name (optional; default: "system_image")
#     [string] The name to give the base package. For prime builds this
#     should be "system_image_prime", so that the package does not override the
#     non-prime package during publishing.
#
# Board parameters:
#
#   assembly_compress_blobs (default: true)
#     [boolean] Whether the blobs added to the blobfs image should be compressed.
#
#   assembly_blob_layout_format (default: "compact")
#     [string] The format blobfs should store blobs in. The valid values are "deprecated_padded" and
#     "compact". The deprecated padded format is supported only for Astro devices and will be
#     removed in the future (it wastes space).
#
#   check_production_tag (default: false)
#      [bool] Whether to check there is no non_production_tag dependencies.
#
# Board: MinFS parameters:
#
#   minfs_minimum_data_bytes, minfs_maximum_bytes (optional)
#     [int] Size options for minfs to pass to the fvm tool.
#
# Board: BlobFS parameters
#
#   blobfs_minimum_inodes, blobfs_minimum_data_bytes, blobfs_maximum_bytes, blobfs_maximum_contents_size (optional)
#     [int] Size options for blobfs to pass to the fvm tool.
#
# Board: FVM parameters
#
#   generate_fvm (optional; default: true)
#     [bool] Whether to generate a FVM image.
#
#   assembly_include_account_in_fvm (optional; default: false)
#     [bool] Whether to include an account partition in the FVM image.
#
#   ramdisk_fvm_in_zbi (optional)
#     [bool] Whether the FVM should be embedded into the ZBI as a ramdisk.
#
#   assembly_fvm_slice_size (optional; default: 1048576)
#     [int] The slice size of the FVM.
#
#   fvm_truncate_to_length (optional)
#     [int] The precise size to make the (non-sparse) FVM image. See
#     documentation of the `--length` parameter of the `fvm` binary host tool
#     for details.
#
# Board: ZBI arguments
#
#   zbi_name (optional; default: target_name)
#     [string] The name to give the ZBI in the out directory.
#     Typically: fuchsia, recovery, etc.
#
#   zbi_signing_script (optional)
#     [path] Location of script to use to sign the ZBI.
#
#   zbi_signing_args (optional)
#     [list of strings] Arguments to pass to the signing script.
#
#   zbi_signing_script_deps (optional)
#      [list of labels] Dependencies needed by the signing script.
#
template("assembled_system") {
  assert(defined(invoker.base_packages), "Need to define base_packages")
  assert(defined(invoker.bootfs_labels), "Need to define bootfs_labels")

  if (defined(invoker.product_assembly_config_dep)) {
    assert(
        invoker.product_assembly_config_dep != "",
        "'product_assembly_config_dep' cannot be an empty string. Don't provide a value if it is not being used.")
    assert(defined(invoker.product_assembly_config_file),
           "Need to define a 'product_assembly_config_file'.")
  }
  if (defined(invoker.product_assembly_config_file)) {
    assert(
        invoker.product_assembly_config_file != "",
        "'product_assembly_config_file' cannot be an empty string. Don't provide a value if it is not being used.")
  }

  fvm_tool_target = "//src/storage/bin/fvm($host_toolchain)"
  fvm_tool_path = get_label_info(fvm_tool_target, "root_out_dir")
  fvm_tool_path += "/fvm"

  # This should be removed once all clients are no longer supplying board_name.
  not_needed(invoker, [ "board_name" ])

  image_name = target_name
  if (defined(invoker.image_name)) {
    image_name = invoker.image_name
  }

  base_package_name = "system_image"
  if (defined(invoker.base_package_name)) {
    base_package_name = invoker.base_package_name
  }

  # Internal labels used for Image Assembly.
  labels = {
    base_packages_group = "${image_name}.base_packages"
    cache_packages_group = "${image_name}.cache_packages"
    meta_packages_group = "${image_name}.meta_packages"
    all_packages_group = "${image_name}.packages"
    legacy_assembly_input_bundle = "${image_name}.legacy_input_bundle"
    if (defined(invoker.product_assembly_config_dep)) {
      product_assembly_config_deps = [ invoker.product_assembly_config_dep ]
    } else {
      product_assembly_config_deps = []
    }
    image_assembly_config = "${image_name}.image_assembly_config"
    image_assembly_inputs = "${image_name}.image_assembly_inputs"
    compare_image_assembly_configs =
        "${image_name}.compare_image_assembly_configs"
    images_config = "${image_name}.images_config"
    product_assembler = "${image_name}.product_assembler"
    image_assembler = "${image_name}.image_assembler"
    copy_vbmeta = "${image_name}.copy_vbmeta"
    copy_zbi = "${image_name}.copy_zbi"
    copy_zbi_signed = "${image_name}.copy_zbi_signed"
    copy_zbi_manifest = "${image_name}.copy_zbi_manifest"
    copy_images = "${image_name}.copy_images"
    config_data = "${image_name}.config-data"
    shell_commands = "${image_name}.shell_commands"
    fshost_config = "${image_name}.fshost_config"
    compare_command_logs = "${image_name}.compare_command_logs"
    compare_images_manifests = "${image_name}.compare_images_manifests"

    # The names of all of the platform's Assembly Input Bundles
    _platform_aib_names = [
      # "common_base",
      "common_minimal",
      "emulator_support",
    ]

    # Add platform AIBs, by their names:
    platform_common_aibs = []
    foreach(name, _platform_aib_names) {
      platform_common_aibs += [ "//bundles/assembly:${name}" ]
    }
  }

  # Intermediate files produced for Image Assembly.
  files = {
    if (defined(invoker.product_assembly_config_file)) {
      product_assembly_config = invoker.product_assembly_config_file
    } else {
      product_assembly_config = "//build/assembly/empty_product_config.json"
    }
    image_assembly_config =
        "$target_out_dir/${image_name}.image_assembly_config.json"
    image_assembly_inputs =
        "$target_out_dir/${image_name}.image_assembly_inputs"

    images_config = "$target_out_dir/${image_name}.images_config.json"

    outdir = "$target_out_dir/$image_name"
    gendir = "$outdir/gen"

    legacy_assembly_input_bundle_manifest =
        "${outdir}/legacy/assembly_config.json"

    # This file is created implicitly by ffx assembly product, so this is the
    # path that it's expected to be found at, not the path that it's to be
    # written to.
    regenerated_image_assembly_config = "${outdir}/image_assembly.json"
    config_data_manifest = "${outdir}/config_data/package_manifest.json"
    compare_image_assembly_configs =
        "${outdir}/compare_image_assembly_configs.verified"

    bootfs_files = "${gendir}/bootfs_files.list"
    devmgr_config = "${gendir}/devmgr_config.txt"
    zbi = "${outdir}/${image_name}.zbi"
    zbi_signed = "${zbi}.signed"
    vbmeta = "${outdir}/${image_name}.vbmeta"
    minfs = "${outdir}/data.blk"
    blobfs = "${outdir}/blob.blk"
    fvm = "${outdir}/fvm.blk"
    fvm_sparse = "${outdir}/fvm.sparse.blk"
    fvm_blob_sparse = "${outdir}/fvm.blob.sparse.blk"
    fvm_fastboot_tmp = "${outdir}/fvm.fastboot.tmp.blk"
    fvm_fastboot = "${outdir}/fvm.fastboot.blk"

    base_package = "${outdir}/base/meta.far"
    base_package_manifest = "${outdir}/base/package_manifest.json"
    base_package_merkle = "${outdir}/base/base.merkle"

    packages = "${outdir}/packages.json"
    zbi_manifest = "${gendir}/zbi.json"
    blobfs_manifest = "${gendir}/blob.manifest"
    blobs_json = "${gendir}/blobs.json"
    bootfs_packages = "${gendir}/data/bootfs_packages"
    static_packages = "${gendir}/${base_package_name}/data/static_packages"
    cache_packages = "${gendir}/${base_package_name}/data/cache_packages.json"
    base_meta_package = "${gendir}/${base_package_name}/meta/package"
    base_pkg_abi_revision =
        "${gendir}/${base_package_name}/meta/fuchsia.abi/abi-revision"
    images_manifest = "${outdir}/images.json"

    image_command_log = "${gendir}/command_log.json"

    # Determine which ZBI we are shipping.
    zbi_final = zbi
    if (defined(invoker.zbi_signing_script)) {
      zbi_final = zbi_signed
    }

    # The directory in which all the platform AIBs can be found
    platform_common_aibs_dir =
        get_label_info("//bundles/assembly", "target_out_dir")

    # This isn't strictly required, but it allows the AIB input files to be
    # specified in GN.
    platform_common_aibs = []
    foreach(aib, labels.platform_common_aibs) {
      _name = get_label_info(aib, "name")
      _target_out_dir = get_label_info(aib, "target_out_dir")
      platform_common_aibs +=
          [ "${_target_out_dir}/${_name}/assembly_config.json" ]
    }
  }

  _base_packages = invoker.base_packages
  _base_driver_packages = []
  _cache_packages = []
  _universe_packages = []
  _meta_packages = []
  if (defined(invoker.base_driver_packages)) {
    _base_driver_packages = invoker.base_driver_packages
  }
  _base_packages += _base_driver_packages

  if (defined(invoker.cache_packages)) {
    _cache_packages = invoker.cache_packages
  }
  if (defined(invoker.universe_packages)) {
    _universe_packages = invoker.universe_packages
  }
  if (defined(invoker.meta_packages)) {
    _meta_packages = invoker.meta_packages
  }

  generate_fvm = true
  if (defined(invoker.generate_fvm)) {
    generate_fvm = invoker.generate_fvm
  }

  system_image_deps = []
  if (defined(invoker.system_image_deps) && generate_fvm) {
    system_image_deps += invoker.system_image_deps
  } else {
    not_needed(invoker, [ "system_image_deps" ])
  }

  embed_fvm_in_zbi = false
  if (defined(invoker.ramdisk_fvm_in_zbi)) {
    embed_fvm_in_zbi = invoker.ramdisk_fvm_in_zbi && generate_fvm
  }

  devmgr_config = []
  if (defined(invoker.devmgr_config)) {
    devmgr_config = invoker.devmgr_config
  }

  fshost_config = {
  }
  if (defined(invoker.fshost_config)) {
    fshost_config = invoker.fshost_config
  }

  include_shell_commands = true
  if (defined(invoker.include_shell_commands)) {
    include_shell_commands = invoker.include_shell_commands
  }

  # Generate the base driver manifest file that lists all available drivers
  # collected from _base_driver_packages dependency tree. This manifest file
  # will be included in the driver-manager-base-config package.
  base_driver_manifest_label = "${image_name}.base-driver-manifest"
  combined_driver_manifest(base_driver_manifest_label) {
    forward_variables_from(invoker, [ "testonly" ])
    manifest_name = "base-driver-manifest.json"
    deps = _base_driver_packages
  }

  # The driver-manager-base-config package is read by Driver Manager to
  # discover where the base drivers are located.
  driver_manager_base_config_label = "${image_name}.driver-manager-base-config"
  fuchsia_package(driver_manager_base_config_label) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    package_name = "driver-manager-base-config"
    deps = [ ":${base_driver_manifest_label}" ]
  }
  _meta_packages += [ ":${driver_manager_base_config_label}" ]

  # TODO(fxbug.dev/81290): Construct the shell commands package in the Image
  # Assembler.
  if (include_shell_commands) {
    shell_commands(labels.shell_commands) {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])
      package_name = "shell-commands"
      deps = _base_packages + _cache_packages + _universe_packages
    }
    _meta_packages += [ ":${labels.shell_commands}" ]
  } else {
    not_needed([ "_universe_packages" ])
  }

  component_id_index_dep = []
  component_id_index_config_data_dep = []
  include_component_index = defined(invoker.include_component_id_index) &&
                            invoker.include_component_id_index
  if (include_component_index) {
    # For details, see //docs/development/components/component_id_index.md#system-assembly
    component_id_index_config("${image_name}.component_id_index_config") {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])

      # collect and merge component ID indices from the base set.
      deps = _base_packages

      metadata = {
        package_barrier = []
      }
    }

    component_id_index_dep = [ ":${image_name}.component_id_index_config" ]
    component_id_index_config_data_dep =
        [ ":${image_name}.component_id_index_config-config-data" ]
    _meta_packages += component_id_index_dep
  }

  include_config_data = true
  if (defined(invoker.include_config_data)) {
    include_config_data = invoker.include_config_data
  }
  if (include_config_data) {
    config_package(labels.config_data) {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])
      package_name = "config-data"
      deps = _base_packages + _universe_packages + _cache_packages +
             component_id_index_config_data_dep
    }
    _meta_packages += [ ":${labels.config_data}" ]
  }

  generated_fshost_config(labels.fshost_config) {
    options = fshost_config
    if (embed_fvm_in_zbi) {
      fvm_ramdisk = true
    }
  }

  # Create GN groups for each of the package sets.
  group(labels.base_packages_group) {
    forward_variables_from(invoker, [ "testonly" ])
    public_deps = _base_packages
  }

  group(labels.cache_packages_group) {
    forward_variables_from(invoker, [ "testonly" ])
    public_deps = _cache_packages
  }

  # The group of generated packages that contain files that depend on metadata
  # walks of the base/cache/universe package sets and therefore cannot be part
  # of those package sets.
  group(labels.meta_packages_group) {
    forward_variables_from(invoker, [ "testonly" ])
    public_deps = _meta_packages
  }

  #######
  # Build the images using the Image Assembler.
  #

  generated_image_assembly_config(labels.image_assembly_config) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    output_path = files.image_assembly_config
    kernel_image = "//zircon/kernel"

    base_packages = []
    if (generate_fvm) {
      base_packages = _base_packages
      base_packages += _meta_packages
      cache_packages = _cache_packages
    }

    boot_args = devmgr_config

    # Search for BootFS packages in these targets.
    bootfs_package_labels = []
    if (defined(invoker.bootfs_package_labels)) {
      bootfs_package_labels += invoker.bootfs_package_labels
    }

    # Search for BootFS files in these targets.
    bootfs_labels = invoker.bootfs_labels
    bootfs_labels += component_id_index_dep
    bootfs_labels += [ "//zircon/kernel" ]
    bootfs_labels += [ ":${labels.fshost_config}" ]

    # Only builds with an FVM need base-resolver/pkg-cache-resolver.
    if (generate_fvm) {
      bootfs_labels += [ "//src/sys/base-resolver:bootfs" ]
    }

    # If not building an FVM, then put the driver_manager config into bootfs
    if (!generate_fvm) {
      bootfs_labels += [ ":${driver_manager_base_config_label}" ]
    }

    extra_base_deps = system_image_deps

    # Search for the Kernel cmdline in the BootFS dependencies.
    cmdline_deps = invoker.bootfs_labels
    if (defined(invoker.cmdline_deps)) {
      cmdline_deps += invoker.cmdline_deps
    }
    if (defined(invoker.cmdline)) {
      cmdline = invoker.cmdline
    }
  }

  generated_images_config(labels.images_config) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                             "zbi_signing_script",
                             "zbi_signing_args",
                             "minfs_maximum_bytes",
                             "minfs_minimum_data_bytes",
                             "blobfs_maximum_bytes",
                             "blobfs_minimum_data_bytes",
                             "blobfs_maximum_contents_size",
                             "blobfs_minimum_inodes",
                             "fvm_truncate_to_length",
                           ])

    output_path = files.images_config
    zbi_name = "${image_name}"
    fvm_reserved_slices = fvm_reserved_slices
    generate_fvm = generate_fvm

    fvm_slice_size = 1048576
    if (defined(invoker.assembly_fvm_slice_size)) {
      fvm_slice_size = invoker.assembly_fvm_slice_size
    }

    blob_layout_format = "compact"
    if (defined(invoker.assembly_blob_layout_format)) {
      blob_layout_format = invoker.assembly_blob_layout_format
    }

    compress_blobs = true
    if (defined(invoker.assembly_compress_blobs)) {
      compress_blobs = invoker.assembly_compress_blobs
    }

    if (defined(invoker.assembly_include_account_in_fvm)) {
      empty_account_partition = invoker.assembly_include_account_in_fvm
    }
  }

  check_production_tag = false
  if (defined(invoker.check_production_tag)) {
    check_production_tag = invoker.check_production_tag
  }

  # Create the legacy assembly input bundle for the above-generated image
  # assembly configuration.
  legacy_assembly_input_bundle(labels.legacy_assembly_input_bundle) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    image_assembly_label = ":${image_name}"
    bundles_dir = files.outdir
    include_config_data = generate_fvm
    create_package = defined(invoker.create_legacy_aib_package) &&
                     invoker.create_legacy_aib_package
    create_package_archive = defined(invoker.create_legacy_aib_archive) &&
                             invoker.create_legacy_aib_archive
  }

  # Run product assembly.
  ffx_action(labels.product_assembler) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    # TODO(fxbug.dev/77290) - Add depfile support and then remove the following
    hermetic_deps = false

    args = [
      "--config",
      "assembly_enabled=true",
      "assembly",
      "product",
      "--product",
      rebase_path(files.product_assembly_config, root_build_dir),
      "--input-bundles-dir",
      rebase_path(files.platform_common_aibs_dir, root_build_dir),
      "--legacy-bundle-dir",
      rebase_path(files.outdir, root_build_dir),
      "--outdir",
      rebase_path(files.outdir, root_build_dir),
    ]

    deps = [ ":${labels.legacy_assembly_input_bundle}" ] +
           labels.platform_common_aibs + labels.product_assembly_config_deps

    inputs = [
               files.legacy_assembly_input_bundle_manifest,
               files.product_assembly_config,
             ] + files.platform_common_aibs

    outputs = [ files.regenerated_image_assembly_config ]

    # If there isn't an FVM, there won't be a config-data package, and so it
    # won't be created by product assembly (it won't have any config data in
    # the legacy or common configs.)
    if (generate_fvm) {
      outputs += [ files.config_data_manifest ]
    }
  }

  # Validate that the generated image assembly configuration matches the
  # legacy + the product assembly configuration.
  compare_image_assembly_configs(labels.compare_image_assembly_configs) {
    forward_variables_from(invoker, [ "testonly" ])
    deps = [
             ":${labels.image_assembly_config}",
             ":${labels.product_assembler}",
           ] + labels.product_assembly_config_deps
    legacy_image_assembly_config = files.image_assembly_config
    generated_image_assembly_config = files.regenerated_image_assembly_config
    product_assembly_config = files.product_assembly_config
  }

  hermetic_inputs_for_image_assembly(labels.image_assembly_inputs) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    deps = [
      ":${labels.images_config}",
      ":${labels.product_assembler}",
    ]

    image_assembly_config = files.regenerated_image_assembly_config
    images_config = files.images_config
    output = files.image_assembly_inputs
  }

  ffx_action(labels.image_assembler) {
    no_output_dir_leaks = false

    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])
    metadata = {
      # We insert these barriers to prevent the dependencies of these images
      # from leaking into images "higher up" in the dependency chain.
      package_barrier = []
      config_package_barrier = []
      distribution_entries_barrier = []

      if (defined(invoker.metadata)) {
        forward_variables_from(invoker.metadata, "*")
      }

      if (generate_fvm) {
        package_output_manifests = [ files.base_package_manifest ]
      }
    }

    hermetic_inputs_target = ":${labels.image_assembly_inputs}"
    hermetic_inputs_file = files.image_assembly_inputs

    args = [
      "--config",
      "assembly_enabled=true",
      "assembly",
      "create-system",
      "--image-assembly-config",
      rebase_path(files.regenerated_image_assembly_config, root_build_dir),
      "--images",
      rebase_path(files.images_config, root_build_dir),
      "--base-package-name",
      "$base_package_name",
      "--gendir",
      rebase_path(files.gendir, root_build_dir),
      "--outdir",
      rebase_path(files.outdir, root_build_dir),
    ]

    if (embed_fvm_in_zbi) {
      args += [
        "--mode",
        "fvm-in-zbi",
      ]
    } else if (!generate_fvm) {
      args += [
        "--mode",
        "bootfs",
      ]
    }

    deps = []
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
    deps += [
      ":${labels.images_config}",
      ":${labels.product_assembler}",
    ]

    # Set the deps needed in order to run the zbi_signing_script
    if (defined(invoker.zbi_signing_script_deps)) {
      deps += invoker.zbi_signing_script_deps
    }

    inputs = [
      files.images_config,
      files.regenerated_image_assembly_config,
    ]
    if (defined(invoker.inputs)) {
      inputs += invoker.inputs
    }

    outputs = [
      files.bootfs_files,
      files.devmgr_config,
      files.zbi,
      files.zbi_manifest,
      files.packages,
      files.bootfs_packages,
      files.image_command_log,
      files.images_manifest,
    ]

    if (defined(invoker.zbi_signing_script)) {
      outputs += [ files.zbi_signed ]
    }

    if (use_vbmeta) {
      outputs += [ files.vbmeta ]
    }

    # Base package dependencies and outputs, if this configuration uses them.
    if (generate_fvm) {
      deps += [
        blobfs_tool_target,
        fvm_tool_target,
      ]

      inputs += [
        blobfs_tool_path,
        fvm_tool_path,
      ]

      outputs += [
        # In the outdir.
        files.base_package,
        files.base_package_manifest,
        files.base_package_merkle,
        files.minfs,
        files.blobfs,
        files.fvm,
        files.fvm_sparse,
        files.fvm_blob_sparse,

        # In the gendir.
        files.blobfs_manifest,
        files.blobs_json,
        files.static_packages,
        files.cache_packages,
        files.base_meta_package,
        files.base_pkg_abi_revision,
      ]

      if (fvm_emmc_partition_size != false ||
          fvm_ftl_nand_block_count != false) {
        outputs += [ files.fvm_fastboot ]
        if (fvm_ftl_nand_block_count != false) {
          outputs += [ files.fvm_fastboot_tmp ]
        }
      }
    }

    if (check_production_tag) {
      assert_no_deps = [ "//build/validate:non_production_tag" ]
    }
  }

  #######
  # Optionally, copy the resulting ZBI to the specified directory.
  #

  if (defined(invoker.output_dir)) {
    assert(
        invoker.output_dir != target_out_dir,
        "The specified output directory must be different from the default target_out_dir")

    # The output name is the same as the original file by default.
    # Otherwise, it takes the output_name, and strips any extension.
    output_name = "${image_name}"
    if (defined(invoker.output_name)) {
      parts = string_split(invoker.output_name, ".")
      output_name = parts[0]
    }

    copy(labels.copy_zbi) {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])
      sources = [ files.zbi ]
      outputs = [ "${invoker.output_dir}/${output_name}.zbi" ]
      deps = [ ":${labels.image_assembler}" ]
    }

    copy(labels.copy_zbi_manifest) {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])
      sources = [ files.zbi_manifest ]
      outputs = [ "${invoker.output_dir}/${output_name}.zbi.json" ]
      deps = [ ":${labels.image_assembler}" ]
    }

    if (defined(invoker.zbi_signing_script)) {
      copy(labels.copy_zbi_signed) {
        forward_variables_from(invoker,
                               [
                                 "testonly",
                                 "visibility",
                               ])
        sources = [ files.zbi_signed ]
        outputs = [ "${invoker.output_dir}/${output_name}.zbi.signed" ]
        deps = [ ":${labels.image_assembler}" ]
      }
    }

    if (use_vbmeta) {
      copy(labels.copy_vbmeta) {
        forward_variables_from(invoker,
                               [
                                 "testonly",
                                 "visibility",
                               ])
        sources = [ files.vbmeta ]
        outputs = [ "${invoker.output_dir}/${output_name}.vbmeta" ]
        deps = [ ":${labels.image_assembler}" ]
      }
    }

    group(labels.copy_images) {
      forward_variables_from(invoker,
                             [
                               "testonly",
                               "visibility",
                             ])
      public_deps = [
        ":${labels.copy_zbi_manifest}",
        ":${labels.copy_zbi}",
      ]
      if (defined(invoker.zbi_signing_script)) {
        public_deps += [ ":${labels.copy_zbi_signed}" ]
      }
      if (use_vbmeta) {
        public_deps += [ ":${labels.copy_vbmeta}" ]
      }
    }
  }

  #######
  # Check the golden files.
  #
  # TODO(fxbug.dev/101283): These checks are no longer a part of
  # `assembled_system()`. Remove `not_needed(...)` once all build configurations
  # no longer specify scrutiny verifier configuration.

  not_needed(invoker,
             [
               "cmdline_goldens",
               "bootfs_goldens",
               "static_pkgs_goldens",
               "route_sources_config",
             ])

  group(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    # public_deps is used, so that the outputs of these dependencies are
    # available to external targets.
    public_deps = [
      ":${labels.compare_image_assembly_configs}",
      ":${labels.image_assembler}",
      ":${labels.image_assembly_config}",
      ":${labels.images_config}",
    ]
    if (defined(invoker.output_dir)) {
      public_deps += [ ":${labels.copy_images}" ]
    }

    metadata = {
      # Assemblies have some defined packages, such as the base package.
      # This barrier prevents a Assembly#1 from including a depending Assembly#2
      # packages in the package sets (base, cache, system) for Assembly#1.
      assembly_package_barrier = []

      assembly_inputs_barrier = []
    }
  }
}
