# Copyright 2023 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/compiled_action.gni")
import("//build/python/python_action.gni")

# Generate a final IDK archive, based on an `idk` target.
#
# The generated archive will go into
# $root_build_dir/sdk/archive/{output_name}
#
# Arguments:
#    idk: (required)
#      Label for an `idk` target that will be built and then archived.
#
#    idk_output_name: (optional)
#      `output_name` argument provided to the `idk` target, if any. By default,
#      this will be the name of the `idk` target.
#
#    output_name: (optional)
#      Full name of the archive file, including `.tar.gz`. By default, this will
#      be `idk_output_name` followed by `.tar.gz`
#
#    testonly, visibility
#      Usual GN meaning.
#
template("idk_archive") {
  assert(defined(invoker.idk), "idk must be specified for $target_name")

  _idk_output_name = get_label_info(invoker.idk, "name")
  if (defined(invoker.idk_output_name)) {
    _idk_output_name = invoker.idk_output_name
  }

  _archive_output_name = "${_idk_output_name}.tar.gz"
  if (defined(invoker.output_name)) {
    _archive_output_name = invoker.output_name
  }

  labels = {
    tarmaker_manifest = "${target_name}.tarmaker"
  }

  files = {
    exported_dir = root_build_dir + "/sdk/exported/${_idk_output_name}"
    output_archive = root_build_dir + "/sdk/archive/${_archive_output_name}"

    tarmaker_manifest = "${target_gen_dir}/${target_name}.tarmaker"
  }

  # Walks the exported IDK directory and generates a manifest of its contents.
  python_action(labels.tarmaker_manifest) {
    forward_variables_from(invoker, [ "testonly" ])

    inputs = []  # Directories don't count as inputs.
    outputs = [ files.tarmaker_manifest ]
    deps = [ invoker.idk ]

    binary_label = "//build/sdk:generate_idk_archive_manifest"

    args = [
      "--exported-idk-dir",
      rebase_path(files.exported_dir, root_build_dir),
      "--output",
      rebase_path(files.tarmaker_manifest, root_build_dir),
    ]
  }

  # Generates the final archive.
  compiled_action(target_name) {
    tool = "//build/tools/tarmaker"
    outputs = [ files.output_archive ]
    inputs = [ files.tarmaker_manifest ]

    mnemonic = "IDK_ARCHIVE"
    args = [
      "--manifest",
      rebase_path(inputs[0], root_build_dir),
      "--output",
      rebase_path(outputs[0], root_build_dir),
      "--use-parallel-gzip=false",
    ]
    deps = [
      ":${labels.tarmaker_manifest}",
      invoker.idk,
    ]

    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                           ])

    metadata = {
      sdk_archives = [
        {
          name = _idk_output_name

          # TODO(https://fxbug.dev/42077025): Determine which values are
          # appropriate, since the archive contains binaries for all
          # Fuchsia CPU architectures (but only one, or even two in
          # the case of Linux) host CPU architectures!
          os = current_os
          cpu = current_cpu
          label = get_label_info(":$target_name", "label_with_toolchain")
          path = rebase_path(files.output_archive, root_build_dir)
        },
      ]
    }
  }
}
