# Copyright 2021 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/sdk/sdk_atom.gni")

# Creates an SDK atom so that sources can be exported to the CTS SDK.
# This should not be called directly, but through the other CTS build rules.
#
# Parameters
#   dest (optional)
#     Location to copy this target to in the CTS archive.
#     Dest should only be specified if the target is not in //sdk/cts. If the
#     target is in //sdk/cts, it will be placed in the same path in the CTS
#     archive.
#     Type: string
template("cts_source_library") {
  if (defined(invoker.dest)) {
    file_base = invoker.dest
  } else {
    path = get_label_info(":${target_name}", "dir")

    # No need to specify 'dest' if the sources are in //sdk/cts (CTS at TOT)
    # or a previously released CTS archive (//prebuilt/cts/...)
    if (string_replace(path, "//sdk/cts", "") == path &&
        string_replace(path, "//prebuilt/cts", "") == path) {
      assert(defined(invoker.dest),
             "dest must be defined if the source file is not in //sdk/cts")
    }

    file_base = ""
    if (path != "//sdk/cts") {
      file_base = string_replace(path, "//sdk/cts/", "")
    }
  }

  main_target_name = target_name
  sdk_target_name = target_name + "_sdk"

  sdk_deps = []
  sdk_files = []
  sdk_metadata_headers = []
  sdk_metadata_sources = []
  sdk_metas = []

  all_sources = []
  if (defined(invoker.sources)) {
    all_sources += invoker.sources
  }
  if (defined(invoker.public)) {
    all_sources += invoker.public
  }

  all_deps = []
  if (defined(invoker.deps)) {
    all_deps += invoker.deps
  }
  if (defined(invoker.public_deps)) {
    all_deps += invoker.public_deps
  }

  foreach(dep, all_deps) {
    full_label = get_label_info(dep, "label_no_toolchain")
    sdk_dep = "${full_label}_sdk"
    sdk_deps += [ sdk_dep ]

    gen_dir = get_label_info(sdk_dep, "target_gen_dir")
    name = get_label_info(sdk_dep, "name")
    sdk_metas += [ rebase_path("$gen_dir/$name.meta.json", root_build_dir) ]
  }

  foreach(file, all_sources) {
    extension = get_path_info(file, "extension")
    destination = "${file_base}/${file}"

    if (extension == "h") {
      sdk_metadata_headers += [ destination ]
    } else {
      sdk_metadata_sources += [ destination ]
    }

    sdk_files += [
      {
        source = file
        dest = destination
      },
    ]
  }

  metadata_file = "${target_gen_dir}/${target_name}.sdk_meta.json"
  metadata_target_name = "${target_name}_metadata"
  action(metadata_target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    script = "//sdk/cts/build/scripts/gen_cts_meta_file.py"

    outputs = [ metadata_file ]

    args = [
      "--out",
      rebase_path(metadata_file, root_build_dir),
      "--name",
      target_name,
      "--root",
      file_base,
      "--include-dir",
      "${file_base}/include",
    ]
    args += [ "--deps" ] + sdk_metas
    args += [ "--sources" ] + sdk_metadata_sources
    args += [ "--headers" ] + sdk_metadata_headers

    deps = sdk_deps
  }

  sdk_atom(sdk_target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    category = "cts"
    id = "sdk://tests/${main_target_name}"

    meta = {
      source = metadata_file
      dest = "${file_base}/json/${main_target_name}/meta.json"
      schema = "cts_source_library"
    }

    deps = sdk_deps
    files = sdk_files

    non_sdk_deps = [
      ":${main_target_name}",
      ":${metadata_target_name}",
    ]

    if (defined(invoker.non_cts_deps)) {
      non_sdk_deps += invoker.non_cts_deps
    }
  }
}
