# 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("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.
#
#   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")

  main_target_name = target_name
  generation_target_name = "${target_name}_molecule"
  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"

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

    category = invoker.category
  }

  sdk_name = target_name
  if (defined(invoker.name)) {
    sdk_name = invoker.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 = [
      "$target_gen_dir/$generation_target_name.sdk",
    ]

    outputs = [
      final_manifest_file,
    ]

    deps = [
      ":$generation_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,
    ]

    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"
    },
  ]
  schema_files = [
    "//build/sdk/meta/cc_prebuilt_library.json",
    "//build/sdk/meta/cc_source_library.json",
    "//build/sdk/meta/common.json",
    "//build/sdk/meta/dart_library.json",
    "//build/sdk/meta/fidl_library.json",
    "//build/sdk/meta/host_tool.json",
    "//build/sdk/meta/image.json",
    "//build/sdk/meta/loadable_module.json",
    "//build/sdk/meta/manifest.json",
    "//build/sdk/meta/sysroot.json",
  ]
  foreach(schema, schema_files) {
    name = get_path_info(schema, "file")
    additional_archive_files += [
      {
        source = schema
        dest = "meta/schemas/$name"
      },
    ]
  }

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