# 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() {
  # If non-empty, the given script will be invoked to produce a signed ZBI
  # image. The given script must accept -z for the input zbi path, and -o for
  # the output signed zbi path. The path must be in GN-label syntax (i.e.
  # starts with //).
  custom_signing_script = ""
}

# Template for producing signed ZBI images given a custom signing script.
# The signing script is required to accept two parameters:
#  -z  the path to the ZBI image to be signed
#  -o  the path to the image file to be output
#  -B  the path to the zircon build directory
#
# TODO(BLD-323): add flags for producing depfiles
# TODO(raggi): add support for custom flags (e.g. to switch keys)
#
# Paramters
#
#   output_name (optional, default: target_name)
#   output_extension (optional, default: signed)
#       [string] These together determine the name of the output file.
#       If `output_name` is omitted, then the name of the target is
#       used.  If `output_extension` is "" then `output_name` is the
#       file name; otherwise, `${output_name}.${output_extension}`;
#       the output file is always under `root_out_dir`.
#
#   zbi (required)
#       [list-of-strings] path to a ZBI image to be signed. Must only
#       contain a single entry.
#
#   deps (usually required)
#   visibility (optional)
#   metadata (optional)
#   testonly (optional)
#       Same as for any GN `action` target.  `deps` must list labels that
#       produce all the `inputs`, `cmdline_inputs`, and `ramdisk_inputs`
#       that are generated by the build (none are required for inputs that
#       are part of the source tree).
template("custom_signed_zbi") {
  if (defined(invoker.output_name)) {
    output_file = invoker.output_name
  } else {
    output_file = target_name
  }

  if (defined(invoker.output_extension)) {
    if (invoker.output_extension != "") {
      output_file += ".${invoker.output_extension}"
    }
  } else {
    output_file += ".signed"
  }

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "deps",
                             "zbi",
                             "metadata",
                           ])

    assert([ zbi[0] ] == zbi, "zbi parameter must contain a single entry")

    output_file = "$root_out_dir/$output_file"
    script = custom_signing_script

    inputs = zbi
    outputs = [
      output_file,
    ]
    args = [
      "-z",
      rebase_path(inputs[0], root_build_dir),
      "-o",
      rebase_path(outputs[0], root_build_dir),
      "-B",
      rebase_path(zircon_root_build_dir, root_build_dir),
    ]
  }
}
