# Copyright 2020 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")
import("//build/sdk/sdk_atom_alias.gni")

# Defines a host tool in the SDK.
#
# Parameters
#   category (required)
#     Publication level of the executable in SDKs.
#     See //build/sdk/sdk_atom.gni.
#
#   sdk_name (optional)
#     Name of the library in the SDK.
#
#   binary (optional)
#     Path to the tool binary. Defaults to "$root_out_dir/$output_name".
#
#   output_name (optional)
#     The tool's name. Inferred from target_name by default.
#
#   sdk_deps (optional)
#     List of labels representing elements that should be added to SDKs
#     alongside the present binary.
#     Labels in the list must represent SDK-ready targets.
#
#   deps, etc.
#     Usual GN meaning.
template("sdk_host_tool") {
  assert(defined(invoker.category), "Must define an SDK category")

  output_name = target_name
  if (defined(invoker.output_name)) {
    output_name = invoker.output_name
  }

  sdk_name = output_name
  if (defined(invoker.sdk_name)) {
    sdk_name = invoker.sdk_name
  }

  binary = "$root_out_dir/$output_name"
  if (defined(invoker.binary)) {
    binary = invoker.binary
  }

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

  file_base = "tools/$output_name"

  _legacy_tool_diff = sdk_legacy_tool_allowlist
  _legacy_tool_diff += [ output_name ]
  _legacy_tool_diff -= [ output_name ]
  is_legacy_tool = _legacy_tool_diff != sdk_legacy_tool_allowlist

  # TODO(fxbug.dev/42999): remove extra atom
  if (is_legacy_tool && current_cpu == host_cpu) {
    sdk_atom("${target_name}_legacy") {
      id = "sdk://$file_base"

      category = invoker.category

      meta = {
        dest = "$file_base-meta.json"
        schema = "host_tool"
        value = {
          type = "host_tool"
          name = output_name
          root = "tools"
          files = [ file_base ]
        }
      }

      files = [
        {
          source = binary
          dest = file_base
        },
      ]

      if (defined(invoker.sdk_deps)) {
        deps = invoker.sdk_deps
      }

      non_sdk_deps = gn_deps
    }
  } else {
    # TODO(fxbug.dev/42999): dummy target to soften transition.
    # Remove once all petal dependents are removed.
    _non_legacy_name = ":" + target_name
    sdk_atom_alias("${target_name}_legacy") {
      atom = _non_legacy_name
    }
  }

  if (host_os == "linux" || host_os == "mac") {
    file_base = "tools/$current_cpu/$sdk_name"
  }

  sdk_atom(target_name) {
    id = "sdk://$file_base"

    category = invoker.category

    meta = {
      dest = "$file_base-meta.json"
      schema = "host_tool"
      value = {
        type = "host_tool"
        name = output_name
        root = "tools"
        files = [ file_base ]
      }
    }

    files = [
      {
        source = binary
        dest = file_base
      },
    ]

    if (defined(invoker.sdk_deps)) {
      deps = invoker.sdk_deps
    }

    non_sdk_deps = invoker.deps
  }
}
