# 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/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",
  ]

  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
}
