# 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 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"
}

# 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)
#     Same as for any GN `action()` target.
template("generate_fvm") {
  zircon_tool_action(target_name) {
    forward_variables_from(invoker, [ "testonly", "deps", "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)
    }
  }
}

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

fvm_create_args = [ "create" ] + fvm_slice_args

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