# Copyright 2018 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/assembled_system.gni")
import("//build/assembly/legacy_image_metadata_overrides.gni")
import("//build/assembly/product_assembly_configuration.gni")
import("//build/board.gni")
import("//build/images/args.gni")
import("//build/images/custom_signing.gni")
import("//build/images/vbmeta.gni")
import("//build/images/vboot/vboot.gni")
import("//build/images/zedboot/zedboot_args.gni")
import("//build/product.gni")

assert(current_toolchain == default_toolchain,
       "//build/images/* are only valid in the Fuchsia toolchain")

_product_config = "//products/zedboot"
if (zedboot_product_assembly_config_label != false) {
  _product_config = zedboot_product_assembly_config_label
}

# Note: This ZBI output is also used by a script in //scripts/verify_cmdline_params.
assembled_system("zedboot_assembly") {
  testonly = true
  output_dir = root_build_dir
  image_name = "zedboot"
  include_shell_commands = false
  generate_vbmeta = use_vbmeta
  use_bringup_platform_bundles_only = true
  product_assembly_config_label = _product_config
  board_config_label = board_configuration_label

  # Bazel assembly should not depend on any targets from GN assembly other
  # than the legacy AIB.
  legacy_bundle_only = use_bazel_images_only

  base_packages = []

  additional_boot_args = [
                           "netsvc.all-features=true",
                           "netsvc.netboot=true",
                         ] + zedboot_additional_boot_args

  cmdline = [
    "virtcon.colorscheme=special",
    "virtcon.dpi=160,240,360,480",
  ]

  bootfs_labels = [ "//build/input:zedboot_bootfs" ]

  # Needed for installer runs.
  bootfs_labels += [
    "//src/storage/bin/disk-pave:install-disk-image",
    "//src/storage/bin/mount",
  ]

  # For debugging.
  bootfs_labels += [
    "//src/devices/nand/drivers/broker:nand-broker",
    "//src/storage/bin/umount",
    "//src/storage/tools/logs/run-with-logs",
  ]

  # zbi arguments
  if (custom_signing_script != "") {
    inputs = custom_signing_script_inputs
    generate_signed_zbi = true
  } else if (use_vboot) {
    inputs = vboot_action.inputs
    generate_signed_zbi = true
  }

  image_metadata_overrides = legacy_zedboot_image_metadata_overrides

  metadata = {
    update_target = []
    if (!sign_zbi) {
      update_target += [ "zedboot=zedboot.zbi" ]
    }

    # Optionally include the signed images.
    if (sign_zbi) {
      update_target += [ "zedboot.signed=zedboot.zbi.signed" ]
      if (recovery_is_zedboot) {
        mkzedboot_mode = [ "vboot" ]
      }
    }

    # Optionally include the vbmeta.
    if (use_vbmeta) {
      if (recovery_is_zedboot) {
        # Only include zedboot as recovery.vbmeta if zedboot is used as recovery
        update_target += [ "recovery.vbmeta=zedboot.vbmeta" ]
      }
    }
  }
}

if (target_cpu != "arm64" && !use_vboot && !use_bazel_images_only) {
  esp("esp") {
    output_name = "zedboot"
    cmdline = "efi_cmdline.txt"
    deps = [ ":zedboot_assembly" ]
    zedboot = "$root_build_dir/zedboot.zbi"
    testonly = true

    metadata = {
      images = [
        {
          label = get_label_info(":$target_name", "label_with_toolchain")
          mkzedboot_mode = [ "efi" ]
          name = "zedboot-efi"
          path = "zedboot.esp.blk"
          type = "blk"
        },
      ]
    }
  }
}

group("zedboot") {
  if (!use_bazel_images_only) {
    public_deps = [ ":zedboot_assembly" ]
    if (target_cpu != "arm64" && !use_vboot) {
      public_deps += [ ":esp" ]
    }
  }
  testonly = true
}
