# 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/config/fuchsia/zircon.gni")

declare_args() {
  # The size in bytes of the FVM partition image to create. Normally this is
  # computed to be just large enough to fit the blob and data images. The
  # default value is "", which means to size based on inputs. Specifying a size
  # that is too small will result in build failure.
  fvm_image_size = ""

  # The max size of the disk where the FVM is written. This is used for
  # preallocating metadata to determine how much the FVM can expand on disk.
  # Only applies to sparse FVM images. At sparse image construction time, the
  # build fails if the inputs are larger than `fvm_max_disk_size`. At paving
  # time, the FVM will be sized to the target's disk size up to
  # `fvm_max_disk_size`. If the size of the disk increases after initial paving,
  # the FVM will resize up to `fvm_max_disk_size`. During paving, if the target
  # FVM has declared a smaller size than `fvm_max_disk_size`, the FVM is
  # reinitialized to the larger size.
  # The default value is "" which sets the max disk size to the size of the disk
  # at pave/format time.
  fvm_max_disk_size = ""

  # The size of the FVM partition images "slice size". The FVM slice size is a
  # minimum size of a particular chunk of a partition that is stored within
  # FVM. A very small slice size may lead to decreased throughput. A very large
  # slice size may lead to wasted space. The selected default size of 8mb is
  # selected for conservation of space, rather than performance.
  fvm_slice_size = "8388608"

  # Users of the filesystem may know required minimum load (total number of
  # data bytes and total number of files) on the fs. Following parameters
  # help to reserve the space needed for the load.

  # minimum_inodes is the number of inodes to reserve for the fs
  # An empty string does not reserve any additional space than minimum
  # required for the filesystem.
  blobfs_minimum_inodes = ""
  minfs_minimum_inodes = ""

  # For build/images:fvm.blob.sparse.blk, use this argument.
  blob_blobfs_minimum_inodes = ""

  # Number of bytes to reserve for data in the fs. This is in addition
  # to what is reserved, if any, for the inodes. Data bytes constitutes
  # "usable" space of the fs.
  # An empty string does not reserve any additional space than minimum
  # required for the filesystem.
  blobfs_minimum_data_bytes = ""
  minfs_minimum_data_bytes = ""

  # For build/images:fvm.blob.sparse.blk, use this argument.
  blob_blobfs_minimum_data_bytes = ""

  # In addition to reserving space for inodes and data, fs needs additional
  # space for maintaining some internal data structures. So the
  # space required to reserve inodes and data may exceed sum of the space
  # needed for inodes and data.
  # maximum_bytes puts an upper bound on the total bytes reserved for inodes,
  # data bytes and reservation for all other internal fs metadata.
  # An empty string does not put any upper bound. A filesystem may
  # reserve few blocks required for its operations.
  blobfs_maximum_bytes = ""
  minfs_maximum_bytes = ""

  # For build/images:fvm.blob.sparse.blk, use this argument.
  blob_blobfs_maximum_bytes = ""
}

# Build an FVM partition
#
# Parameters
#
#   args (optional)
#     [list of strings] Additional arguments to pass to the FVM tool.
#
#   output_name (required)
#     [string] The filename to produce.
#
#   partitions (required)
#     [list of scopes] a list of partitions to be included
#       dep (required)
#         [label] The label must be defined earlier in the same file.
#       type (required)
#         [string] A partition type accepted by fvm (e.g. blob, data, data-unsafe)
#
#   deps (optional)
#   testonly (optional)
#   visibility (optional)
#   metadata (optional)
#     Same as for any GN `action()` target.
template("generate_fvm") {
  zircon_tool_action(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "metadata",
                             "testonly",
                             "visibility",
                           ])
    tool = "fvm"
    outputs = [
      invoker.output_name,
    ]
    args = rebase_path(outputs, root_build_dir)
    if (defined(invoker.args)) {
      args += invoker.args
    }
    sources = []
    if (!defined(deps)) {
      deps = []
    }
    foreach(part, invoker.partitions) {
      args += [ "--${part.type}" ]
      deps += [ part.dep ]
      sources += get_target_outputs(part.dep)
      args += rebase_path(get_target_outputs(part.dep), root_build_dir)
      if (defined(part.minimum_inodes) && "${part.minimum_inodes}" != "") {
        args += [
          "--minimum-inodes",
          "${part.minimum_inodes}",
        ]
      }
      if (defined(part.minimum_data_bytes) &&
          "${part.minimum_data_bytes}" != "") {
        args += [
          "--minimum-data-bytes",
          "${part.minimum_data_bytes}",
        ]
      }
      if (defined(part.maximum_bytes) && "${part.maximum_bytes}" != "") {
        args += [
          "--maximum-bytes",
          "${part.maximum_bytes}",
        ]
      }
    }
  }
}

fvm_slice_args = [
  "--slice",
  fvm_slice_size,
]

fvm_create_args = [ "create" ] + fvm_slice_args

fvm_sparse_args = [
                    "sparse",
                    "--compress",
                    "lz4",
                  ] + fvm_slice_args

if (fvm_max_disk_size != "") {
  fvm_sparse_args += [
    "--max-disk-size",
    fvm_max_disk_size,
  ]
}
