# Copyright 2024 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_molecule.gni")

# Defines a devicetree visitor target.
#
# Parameters
#
#   * sources
#     - Required: Device tree visitor source files (.cc and .h) that will be
#       used to parse the devicetree related to the schema.
#       TODO(https://fxbug.dev/42083285) Generate the visitor from schema file.
#     - Type: List(path).
#
#   * deps
#     - Optional: Usual GN meaning.
#
template("devicetree_visitor") {
  if (!defined(output_dir)) {
    output_dir = root_out_dir
  }
  if (!defined(output_name)) {
    output_name = target_name
  }
  if (!defined(output_extension)) {
    output_extension = "so"
  }

  _output_file_name = output_name
  if (output_extension != "") {
    _output_file_name += ".$output_extension"
  }
  _output_file = "$output_dir/$_output_file_name"
  _rebased_output_file = rebase_path(_output_file, root_build_dir)

  _loadable_module_target_name = target_name
  _sdk_target_name = "${target_name}_sdk"
  _sdk_pkg_name = "devicetree-${target_name}"

  # Define the loadable_module target, this target
  # will later be used to define the sdk_atom target
  loadable_module(_loadable_module_target_name) {
    forward_variables_from(invoker, "*")
    if (!defined(ldflags)) {
      ldflags = []
    }

    _version_script =
        "//build/bazel_sdk/bazel_rules_fuchsia/fuchsia/private/visitor.ld"
    ldflags += [ "-Wl,--version-script=" +
                 rebase_path(_version_script, root_build_dir) ]
    metadata = {
      devicetree_barrier = []

      # Used by the distribution_manifest template.
      distribution_entries = [
        {
          source = _rebased_output_file
          destination = "lib/visitors/${_output_file_name}"
          label = get_label_info(":$_loadable_module_target_name",
                                 "label_with_toolchain")
          elf_runtime_dir = "lib/${toolchain_variant.libprefix}"
        },
      ]
    }
  }

  sdk_atom(_sdk_target_name) {
    id = "sdk://pkg/${_sdk_pkg_name}"
    category = "internal"

    files = [
      {
        source = _output_file
        dest =
            "arch/${target_cpu}/dist/devicetree-visitors-${_output_file_name}"
      },
    ]

    non_sdk_deps = [ ":${_loadable_module_target_name}" ]
    if (defined(invoker.deps)) {
      non_sdk_deps += invoker.deps
    }
    if (defined(invoker.public_deps)) {
      non_sdk_deps += invoker.public_deps
    }

    _sdk_binaries =
        [ "arch/${target_cpu}/dist/devicetree-visitors-${_output_file_name}" ]

    meta = {
      dest = "pkg/${_sdk_pkg_name}/meta.json"
      schema = "loadable_module"
      value = {
        type = "loadable_module"
        name = "${_sdk_pkg_name}"
        root = "pkg/${_sdk_pkg_name}"
        binaries = {
        }
        resources = []
        if (target_cpu == "arm64") {
          binaries.arm64 = _sdk_binaries
        } else if (target_cpu == "x64") {
          binaries.x64 = _sdk_binaries
        } else if (target_cpu == "riscv64") {
          binaries.riscv64 = _sdk_binaries
        } else {
          assert(false, "Unknown CPU type: %target_cpu")
        }
      }
    }
  }
}

# Defines a collection of devicetree visitors.
#
# Creates a GN group target for use in GN builds as well as a sdk molecule `${target_name}_sdk` that
# can be used to export the visitors to the SDK.
#
# Parameters
#
#   * deps
#     - Required: List of device tree visitor targets that will be part of this collection.
#     - Type: List(label). Must point to devicetree_visitor() or a devicetree_visitor_collection().
#
template("devicetree_visitor_collection") {
  _sdk_target_name = "${target_name}_sdk"
  group(target_name) {
    deps = invoker.deps
  }

  sdk_molecule(_sdk_target_name) {
    visibility = [
      ":*",
      "//sdk:*",
    ]
    category = "internal"  # For the "internal IDK" used for Bazel rules.

    deps = []
    foreach(dep, invoker.deps) {
      label = get_label_info(dep, "label_no_toolchain")
      deps += [ "${label}_sdk" ]
    }
  }
}
