# 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/banjo/toolchain.gni")
import("//build/compiled_action.gni")
import("//build/sdk/sdk_atom.gni")

# Private template to generate an SDK Atom for banjo_library and
# banjo_dummy_library targets.
#

template("_banjo_library_sdk") {
  library_name = target_name
  if (defined(invoker.name)) {
    library_name = invoker.name
  }

  # Process sources.
  file_base = "banjo/$library_name"
  all_files = []
  sdk_sources = []
  foreach(source, invoker.sources) {
    relative_source = rebase_path(source, ".")
    if (string_replace(relative_source, "..", "bogus") != relative_source) {
      # If the source file is not within the same directory, just use the file
      # name.
      relative_source = get_path_info(source, "file")
    }
    destination = "$file_base/$relative_source"
    sdk_sources += [ destination ]
    all_files += [
      {
        source = rebase_path(source)
        dest = destination
      },
    ]
  }

  # Identify metadata for dependencies.
  sdk_metas = []
  sdk_deps = []
  all_deps = []
  if (defined(invoker.deps)) {
    all_deps = invoker.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") ]
  }

  # Generate the library metadata.
  meta_file = "$target_gen_dir/${target_name}.sdk_meta.json"
  meta_target_name = "${target_name}_meta"

  action(meta_target_name) {
    script = "//build/banjo/gen_sdk_meta.py"

    inputs = sdk_metas

    outputs = [
      meta_file,
    ]

    args = [
             "--out",
             rebase_path(meta_file),
             "--name",
             library_name,
             "--root",
             file_base,
             "--specs",
           ] + sdk_metas + [ "--sources" ] + sdk_sources

    deps = sdk_deps
  }

  sdk_atom("${target_name}_sdk") {
    id = "sdk://banjo/$library_name"

    category = invoker.sdk_category

    meta = {
      source = meta_file
      dest = "$file_base/meta.json"
      schema = "banjo_library"
    }

    files = all_files

    non_sdk_deps = [ ":$meta_target_name" ]

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

# Generates some representation of a Banjo library that's consumable by Language
# bindings generators.
#
# The parameters for this template are defined in //build/banjo/banjo.gni. The
# relevant parameters in this template are:
#   - name;
#   - sources;
#   - sdk_category.

template("banjo_library") {
  assert(
      current_toolchain == banjo_toolchain,
      "This template can only be used in the Banjo toolchain $banjo_toolchain.")

  assert(defined(invoker.sources), "A Banjo library requires some sources.")

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

  c_response_file = "$target_gen_dir/c/$target_name.args"
  cpp_response_file = "$target_gen_dir/cpp/$target_name.args"
  cpp_i_response_file = "$target_gen_dir/cpp_i/$target_name.args"
  rust_response_file = "$target_gen_dir/rust/$target_name.args"
  ddk_root = string_replace(string_replace(library_name, ".", "/"), "_", "-")
  ddktl_root = string_replace(ddk_root, "ddk", "ddktl")
  ddk_header = "$root_gen_dir/$ddk_root.h"
  ddktl_header = "$root_gen_dir/$ddktl_root.h"
  ddktl_internal_header = "$root_gen_dir/$ddktl_root-internal.h"
  rust_file = "banjo_" + string_replace(library_name, ".", "_") + ".rs"
  rust_internal_header = "$target_gen_dir/$rust_file"

  main_target_name = target_name
  c_response_file_target_name = "${target_name}_c_response_file"
  cpp_response_file_target_name = "${target_name}_cpp_response_file"
  cpp_i_response_file_target_name = "${target_name}_cpp_i_response_file"
  rust_response_file_target_name = "${target_name}_rust_response_file"
  c_compile_target_name = "${target_name}_c_compile"
  cpp_compile_target_name = "${target_name}_cpp_compile"
  cpp_i_compile_target_name = "${target_name}_cpp_i_compile"
  rust_compile_target_name = "${target_name}_rust_compile"

  targets = [
    [
      c_response_file_target_name,
      c_compile_target_name,
      c_response_file,
      "c",
      ddk_header,
    ],
    [
      cpp_response_file_target_name,
      cpp_compile_target_name,
      cpp_response_file,
      "cpp",
      ddktl_header,
    ],
    [
      cpp_i_response_file_target_name,
      cpp_i_compile_target_name,
      cpp_i_response_file,
      "cpp_i",
      ddktl_internal_header,
    ],
    [
      rust_response_file_target_name,
      rust_compile_target_name,
      rust_response_file,
      "rust",
      rust_internal_header,
    ],
  ]

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

  foreach(target, targets) {
    target_name = target[0]
    response_file = target[2]
    backend = target[3]
    output = target[4]

    action(target_name) {
      visibility = [ ":*" ]

      script = "//build/banjo/gen_response_file.py"

      forward_variables_from(invoker,
                             [
                               "deps",
                               "public_deps",
                               "sources",
                               "testonly",
                             ])

      libraries = "$target_gen_dir/$backend/$main_target_name.libraries"

      outputs = [
        response_file,
        libraries,
      ]

      args = [
               "--out-response-file",
               rebase_path(response_file, root_build_dir),
               "--out-libraries",
               rebase_path(libraries, root_build_dir),
               "--backend",
               backend,
               "--output",
               rebase_path(output, root_build_dir),
               "--name",
               library_name,
               "--sources",
             ] + rebase_path(sources, root_build_dir)

      if (all_deps != []) {
        dep_libraries = []

        foreach(dep, all_deps) {
          gen_dir = get_label_info(dep, "target_gen_dir")
          name = get_label_info(dep, "name")
          dep_libraries += [ "$gen_dir/c/$name.libraries" ]
        }

        inputs = dep_libraries

        args +=
            [ "--dep-libraries" ] + rebase_path(dep_libraries, root_build_dir)
      }
    }
  }

  foreach(target, targets) {
    target_name = target[1]
    response_target_name = target[0]
    response_file = target[2]
    backend = target[3]
    output = target[4]

    if (backend != "rust") {
      action(target_name) {
        forward_variables_from(invoker, [ "testonly" ])

        visibility = [ ":*" ]

        script = "//zircon/prebuilt/downloads/banjo/banjo_bin"

        inputs = [
          response_file,
        ]

        outputs = [
          output,
        ]

        rebased_response_file = rebase_path(response_file, root_build_dir)

        args = [ "@$rebased_response_file" ]

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

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

    public_deps = [
      ":$c_compile_target_name",
      ":$c_response_file_target_name",
      ":$cpp_compile_target_name",
      ":$cpp_i_compile_target_name",
      ":$cpp_i_response_file_target_name",
      ":$cpp_response_file_target_name",
      ":$rust_response_file_target_name",
    ]
  }

  if (defined(invoker.sdk_category) && invoker.sdk_category != "excluded") {
    _banjo_library_sdk("$main_target_name") {
      forward_variables_from(invoker, "*")
    }
  }
}

template("banjo_dummy_library") {
  assert(
      current_toolchain == banjo_toolchain,
      "This template can only be used in the Banjo toolchain $banjo_toolchain.")

  assert(defined(invoker.sources),
         "A Banjo dummy library requires some sources.")

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

  main_target_name = target_name
  c_response_file_target_name = "${target_name}_rust_response_file"
  rust_response_file_target_name = "${target_name}_c_response_file"
  ddk_root = string_replace(string_replace(library_name, ".", "/"), "_", "-")
  rust_file = "banjo_" + string_replace(library_name, ".", "_") + ".rs"
  ddk_header = "$target_gen_dir/$ddk_root.h"
  rust_internal_header = "$target_gen_dir/$rust_file"

  targets = [
    [
      c_response_file_target_name,
      "c",
      ddk_header,
    ],
    [
      rust_response_file_target_name,
      "rust",
      rust_internal_header,
    ],
  ]

  foreach(target, targets) {
    response_target_name = target[0]
    backend = target[1]
    output = target[2]

    action(response_target_name) {
      visibility = [ ":*" ]

      script = "//build/banjo/gen_response_file.py"

      forward_variables_from(invoker,
                             [
                               "deps",
                               "public_deps",
                               "sources",
                               "testonly",
                             ])

      response_file = "$target_gen_dir/$backend/$main_target_name.args"
      libraries = "$target_gen_dir/$backend/$main_target_name.libraries"

      outputs = [
        response_file,
        libraries,
      ]

      args = [
               "--output",
               rebase_path(output, root_build_dir),
               "--backend",
               backend,
               "--out-response-file",
               rebase_path(response_file, root_build_dir),
               "--out-libraries",
               rebase_path(libraries, root_build_dir),
               "--name",
               library_name,
               "--sources",
             ] + rebase_path(sources, root_build_dir)
    }
  }

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

    public_deps = [
      ":$c_response_file_target_name",
      ":$rust_response_file_target_name",
    ]
  }

  if (defined(invoker.sdk_category) && invoker.sdk_category != "excluded") {
    _banjo_library_sdk("$target_name") {
      forward_variables_from(invoker, "*")
    }
  }
}
