# 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/images/custom_signing.gni")
import("//build/images/vbmeta.gni")

declare_args() {
  # Use vboot images
  use_vboot = false

  # Put the "system image" package in the BOOTFS.  Hence what would
  # otherwise be /system/... at runtime is /boot/... instead.
  bootfs_only = false

  # This is really a build for a recovery image, and so the fuchsia image that
  # is being built isn't properly configured, and so just disable the new image
  # assembly work until that's been addressed.
  recovery_only = false

  # List of arguments to add to /boot/config/devmgr.
  # These come after synthesized arguments to configure blobfs and pkgfs.
  devmgr_config = []

  # Build the gigaboot bootloader.
  use_gigaboot = false

  # Generate a UEFI disk image
  build_uefi_disk = false

  # Generate installer disk image (ISO) to be flashed to a USB drive.
  # Will be located at obj/build/installer_images/ relative to the build directory.
  # See https://fuchsia.dev/fuchsia-src/development/hardware/installer
  build_usb_installer = false

  # (deprecated) List of kernel images to include in the update (OTA) package.
  # If no list is provided, all built kernels are included. The names in the
  # list are strings that must match the filename to be included in the update
  # package.
  update_kernels = []

  # List of prebuilt firmware blobs to include in update packages.
  #
  # Each entry in the list is a scope containing:
  #  * `path`: path to the image (see also `firmware_prebuilts_path_suffix`)
  #  * `type`: firmware type, a device-specific unique identifier
  #  * `partition` (optional): if specified, the `fastboot flash` partition
  firmware_prebuilts = []

  # Suffix to append to all `firmware_prebuilts` `path` variables.
  #
  # Typically this indicates the hardware revision, and is made available so
  # that users can easily switch revisions using a single arg.
  firmware_prebuilts_path_suffix = ""

  # List of files needed to bootstrap the device.
  #
  # Flashing a device assumes a certain state; bootstrapping instead allows
  # initially provisioning a device from unknown state, so may require
  # additional resources that would not be included in an OTA.
  #
  # Each entry in the list is a scope containing:
  #  * `path`: path to file.
  #  * `partition` (optional): `fastboot flash` partition.
  #  * `condition` (optional): a scope with `variable` and `value` keys; file is
  #    only flashed if `fastboot getvar <variable>` == <value>.
  bootstrap_files = []

  # GUID Partition Table (GPT) image.
  #
  # Typically useful for initially flashing a device from zero-state.
  gpt_image = ""

  # Whether to build the netboot zbi by default.
  #
  # You can still build //build/images:netboot explicitly even if enable_netboot is false.
  enable_netboot = false

  # Check that all vtables in fuchsia binaries listed in binaries.json are in
  # readonly data sections. This check will be run at the end of a full build.
  #
  # This is primarily meant to be used by the clang canary builders.
  check_vtables_in_rodata = false

  # A list of labels for packages that are appended to the set of base packages,
  # but depend on all the other base, cache, and universe packages, therefore
  # they must be separated into their own list.
  meta_package_labels = []

  # Arguments to `fx flash` script (along with any `firmware_prebuilts` which
  # specify a partition).
  #
  # If `fvm_partition` is provided, the flash script will flash the full OS,
  # recovery + Zircon + FVM + SSH keys. In this case, the bootloader must also
  # support `fastboot oem add-staged-bootloader-file ssh.authorized_keys`.
  #
  # Otherwise, the script will flash the recovery image to all slots, which
  # doesn't require the FVM or SSH keys.
  zircon_a_partition = ""
  zircon_b_partition = ""
  zircon_r_partition = ""
  vbmeta_a_partition = ""
  vbmeta_b_partition = ""
  vbmeta_r_partition = ""
  fvm_partition = ""
  active_partition = ""
  fastboot_product = ""
  pre_erase_flash = false

  # Whether to include images necessary to run Fuchsia in QEMU in build
  # archives.
  add_qemu_to_build_archives = false

  # Additional bootserver args to add to pave.sh. New uses of this should be
  # added with caution, and ideally discussion. The present use case is to
  # enable throttling of netboot when specific network adapters are combined
  # with specific boards, due to driver and hardware challenges.
  additional_bootserver_arguments = ""

  # Whether to perform check on the build's eligibility for production.
  # If true, base_packages and cache_packages are checked against dependencies
  # on //build/validate:non_production_tag, which is used to tag any
  # non-production GN labels. Build will fail if such dependency is found.
  check_production_eligibility = false

  # Whether to compress the blobfs image.
  compress_blobs = true

  # The format blobfs should store blobs in.
  blob_layout_format = "compact"

  # Build boot images that prefer Zedboot over local boot (only for EFI).
  always_zedboot = false

  # Include fvm.blob.sparse.blk image into the build if set to true
  include_fvm_blob_sparse = false

  # Include an account partition in the FVM image if set to true.
  include_account_in_fvm = false

  # Allows a product to specify the recovery image used in the zirconr slot.
  # Default recovery image is zedboot. Overriding this value will keep zedboot
  # in the build but will not include it as the default zirconr image.
  # Recovery images can provide an update target by specifying the metadata item
  # "update_target" in the format <target>=<path>. (Such as `update_target =
  # [ "recovery=" + rebase_path(recovery_path, root_build_dir) ]`)
  # Example value: "//build/images/recovery"
  recovery_label = "//build/images/zedboot"

  # Enable verbose output from `ffx assembly image`, this creates non-silent
  # build output and therefore should never be 'true' in checked-in configs, and
  # is meant solely for developer debugging.
  verbose_image_assembly = false

  # Include the shell commands package.  Used as a parameter to
  # assembled_system().  See documentation there.
  include_shell_commands_package = false
}

assert(custom_signing_script == "" || !use_vboot,
       "custom_signing_script and use_vboot cannot be used together!")
