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

  # If `custom_signing_script` is not empty, a list of dependencies for the script.
  custom_signing_script_deps = []

  # If `custom signing script` is not empty, a list of host tool labels, without
  # a toolchain, that the script depends on. The reason why these are not in
  # `custom_signing_script_deps` is because these definitions are typically in
  # board-specific .gni files where `host_os` or `host_toolchain` are not
  # defined yet. Because these are imported from `args.gn` before `BUILDCONFIG.gn`
  # is actually parsed.
  custom_signing_script_tools = []
}

# 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(fxbug.dev/3128): 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

    if (!defined(deps)) {
      deps = []
    }

    if (defined(custom_signing_script_deps)) {
      deps += custom_signing_script_deps
      foreach(tool, custom_signing_script_tools) {
        deps += [ "$tool($host_toolchain)" ]
      }
    }

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