# 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/compiled_action.gni")
import("//build/json/validate_json.gni")
import("config.gni")
import("meta/version.gni")
import("sdk_molecule.gni")

declare_args() {
  # Whether to build SDK tarballs.
  build_sdk_archives = false
}

# A collection of elements to be published in an SDK.
#
# Parameters
#
#   name (optional)
#     Name of the SDK.
#     Defaults to the target's name.
#
#   id (optional)
#     An opaque identifier for the SDK.
#     Defaults to "notavalidid".
#
#   api (required)
#     Path to the file representing the canonical contents of this SDK.
#     This file is used to ensure modifications to the SDK contents are
#     explicitly acknowledged.
#
#   category (required)
#     Describes the minimum category that atoms in this SDK must have.
#     See //build/sdk/sdk_atom.gni for possible values.
#
#   export (optional)
#     Whether to export the contents of this SDK to the output directory.
#     This is useful when an SDK-like file structure is needed as part of the
#     build, for example to port a language runtime which would otherwise rely
#     on an official SDK.
#     Defaults to false.

template("sdk") {
  assert(defined(invoker.category), "Must define an SDK category")

  # TODO(DX-685): enforce that the "api" attribute is set.

  main_target_name = target_name
  generation_target_name = "${target_name}_molecule"
  verify_api_target_name = "${target_name}_verify_api"
  copy_target_name = "${target_name}_copy"
  verification_target_name = "${target_name}_manifest_verify"
  meta_target_name = "${target_name}_meta"
  verify_meta_target_name = "${target_name}_meta_verify"
  archive_manifest_target_name = "${target_name}_archive_manifest"
  archive_target_name = "${target_name}_archive"

  if (!is_fuchsia) {
    assert(false, "SDKs can only target Fuchsia")
  }
  target_triple = target_cpu
  if (host_cpu == "x64") {
    host_triple_cpu = "x86_64"
  } else if (host_cpu == "arm64") {
    host_triple_cpu = "aarch64"
  } else {
    assert(false, "Unrecognized host CPU: $host_cpu")
  }
  if (host_os == "linux") {
    host_triple_os = "linux-gnu"
  } else if (host_os == "mac") {
    host_triple_os = "apple-darwin"
  } else if (host_os == "fuchsia") {
    host_triple_os = "fuchsia"
  } else {
    assert(false, "Unrecognized host OS: $host_os")
  }
  host_triple = "$host_triple_cpu-$host_triple_os"

  sdk_name = target_name
  if (defined(invoker.name)) {
    sdk_name = invoker.name
  }

  sdk_id = "notavalidid"
  if (defined(invoker.id) && invoker.id != "") {
    sdk_id = invoker.id
  }

  # Generates the manifest.
  sdk_molecule(generation_target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "api",
                             "export",
                           ])

    if (!defined(deps)) {
      deps = []
    }
    deps += [ "//build/sdk:schemas" ]

    category = invoker.category
  }

  intermediate_manifest_file = "$target_gen_dir/$generation_target_name.sdk"

  computed_api_file = "$root_out_dir/sdk/api/$sdk_name"

  # Verify that the contents of the SDK have not changed.
  action(verify_api_target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    script = "//build/sdk/verify_sdk_api.py"

    inputs = [
      intermediate_manifest_file,
    ]

    outputs = [
      computed_api_file,
    ]

    args = [
      "--manifest",
      rebase_path(intermediate_manifest_file),
      "--updated",
      rebase_path(computed_api_file),
    ]

    # TODO(DX-685): always set this argument.
    if (defined(invoker.api)) {
      inputs += [ invoker.api ]
      args += [
        "--reference",
        rebase_path(invoker.api),
      ]
    }

    if (warn_on_sdk_changes) {
      args += [ "--warn" ]
    }

    public_deps = [
      ":$generation_target_name",
    ]
  }

  final_manifest_file = "$root_out_dir/sdk/manifest/$sdk_name"

  # Copies the manifest to a central location.
  copy(copy_target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    sources = [
      intermediate_manifest_file,
    ]

    outputs = [
      final_manifest_file,
    ]

    deps = [
      ":$verify_api_target_name",
    ]
  }

  # Verifies that the manifest is valid.
  validate_json(verification_target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    data = final_manifest_file

    schema = "//build/sdk/manifest_schema.json"

    deps = [
      ":$copy_target_name",
    ]
  }

  sdk_meta_file = "$target_gen_dir/$sdk_name.sdk_meta.json"

  # Generates a metadata file describing the various parts of the SDK.
  action(meta_target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    script = "//build/sdk/generate_meta.py"

    inputs = [
      final_manifest_file,
    ]

    outputs = [
      sdk_meta_file,
    ]

    args = [
      "--manifest",
      rebase_path(final_manifest_file),
      "--meta",
      rebase_path(sdk_meta_file),
      "--target-arch",
      target_triple,
      "--host-arch",
      host_triple,
      "--id",
      sdk_id,
      "--schema-version",
      sdk_metadata_schema_version,
    ]

    public_deps = [
      ":$copy_target_name",
      ":$verification_target_name",
    ]
  }

  # Verifies that the manifest metadata is valid.
  validate_json(verify_meta_target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    data = sdk_meta_file

    schema = "//build/sdk/meta/manifest.json"

    public_deps = [
      ":$meta_target_name",
    ]
  }

  archive_manifest_file = "$target_gen_dir/$sdk_name.archive_manifest"

  additional_archive_files = [
    {
      source = sdk_meta_file
      dest = "meta/manifest.json"
    },
  ]

  # From the manifest file representing the SDK, generates a list of the files
  # going into the final archive.
  action(archive_manifest_target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    script = "//build/sdk/generate_archive_manifest.py"

    sources = [
      "//build/sdk/sdk_common.py",
    ]

    inputs = [
      final_manifest_file,
    ]

    outputs = [
      archive_manifest_file,
    ]

    args = [
      "--manifest",
      rebase_path(final_manifest_file),
      "--output",
      rebase_path(archive_manifest_file),
    ]

    foreach(file, additional_archive_files) {
      inputs += [ file.source ]
      args += [
        "--mapping",
        file.dest,
        rebase_path(file.source),
      ]
    }

    public_deps = [
      ":$verify_meta_target_name",
    ]
  }

  if (build_sdk_archives) {
    # Generates the final archive.
    final_archive = "$root_out_dir/sdk/archive/$sdk_name.tar.gz"

    compiled_action(archive_target_name) {
      forward_variables_from(invoker, [ "testonly" ])

      tool = "//build/tools/tar_maker"

      inputs = [
        archive_manifest_file,
      ]

      outputs = [
        final_archive,
      ]

      args = [
        "-manifest",
        rebase_path(archive_manifest_file),
        "-output",
        rebase_path(final_archive),
      ]

      deps = [
        ":$archive_manifest_target_name",
      ]
    }
  } else {
    group(archive_target_name) {
      forward_variables_from(invoker, [ "testonly" ])

      deps = [
        ":$archive_manifest_target_name",
      ]
    }
  }

  group(main_target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    deps = [
      ":$archive_target_name",
    ]
  }

  if (defined(invoker.export) && invoker.export) {
    stamp_file = "$target_gen_dir/$target_name.exported"

    action("${target_name}_export") {
      script = "//build/sdk/export_sdk.py"

      inputs = [
        archive_manifest_file,
      ]

      outputs = [
        stamp_file,
      ]

      args = [
        "--out-dir",
        rebase_path("$root_out_dir/sdk/exported/$sdk_name"),
        "--stamp-file",
        rebase_path(stamp_file),
        "--manifest",
        rebase_path(archive_manifest_file),
      ]

      deps = [
        ":$archive_manifest_target_name",
      ]
    }
  }
}
