# Copyright 2019 Google LLC. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# import("//gn/skia.gni")

declare_args() {
  using_fuchsia_sdk = true

  # Fuchsia SDK install dir.
  fuchsia_sdk_path = "//fuchsia/sdk/$host_os"

  # Clang install dir.
  fuchsia_toolchain_path = "//fuchsia/toolchain/$host_os"

  # Path to GN-generated GN targets derived from parsing json file at
  # |fuchsia_sdk_manifest_path|.  The parsing logic can be found in sdk.gni.
  fuchsia_sdk_root = "//build/fuchsia"
}

declare_args() {
  fuchsia_sdk_manifest_path = "${fuchsia_sdk_path}/meta/manifest.json"
}

template("_fuchsia_sysroot") {
  assert(defined(invoker.meta), "The meta.json file path must be specified.")
  assert(target_cpu == "x64" || target_cpu == "arm64",
         "We currently only support 'x64' and 'arm64' targets for fuchsia.")

  meta_json = read_file(invoker.meta, "json")

  assert(meta_json.type == "sysroot")

  meta_json_versions = meta_json.versions
  if (target_cpu == "x64") {
    defs = meta_json_versions.x64
  } else {
    defs = meta_json_versions.arm64
  }

  _libs = []
  _lib_dirs = []
  _include_dirs = []

  foreach(link_lib, defs.link_libs) {
    if (link_lib != "arch/${target_cpu}/sysroot/lib/Scrt1.o") {
      _libs += [ rebase_path("$fuchsia_sdk_path/$link_lib") ]
    }
  }

  defs_include_dir = defs.include_dir
  _include_dirs += [ rebase_path("$fuchsia_sdk_path/$defs_include_dir") ]

  config_name = "config_$target_name"
  config(config_name) {
    lib_dirs = _lib_dirs
    libs = _libs
    include_dirs = _include_dirs
  }

  group(target_name) {
    public_configs = [ ":$config_name" ]
  }
}

template("_fuchsia_fidl_library") {
  assert(defined(invoker.meta), "The meta.json file path must be specified.")
  assert(target_cpu == "x64" || target_cpu == "arm64",
         "We currently only support 'x64' and 'arm64' targets for fuchsia.")

  meta_json = read_file(invoker.meta, "json")

  assert(meta_json.type == "fidl_library")

  _deps = [ "../pkg:fidl_cpp" ]

  library_name = string_replace(meta_json.name, "fuchsia.", "")
  library_name_json = "$library_name.json"

  foreach(dep, meta_json.deps) {
    _deps += [ ":$dep" ]
  }

  config_name = "config_$target_name"
  config(config_name) {
    include_dirs = [ target_gen_dir ]
  }

  fidl_gen_target_name = "fidlgen_$target_name"
  action(fidl_gen_target_name) {
    script = "//build/fuchsia/fidl_gen_cpp"

    library_name_slashes = string_replace(library_name, ".", "/")

    inputs = [
      invoker.meta,
    ]

    outputs = [
      "$target_gen_dir/fuchsia/$library_name_slashes/c/fidl.h",
      "$target_gen_dir/fuchsia/$library_name_slashes/cpp/fidl.h",
      "$target_gen_dir/fuchsia/$library_name_slashes/cpp/fidl.cc",
      "$target_gen_dir/fuchsia/$library_name_slashes/cpp/tables.cc",
    ]

    args = [
      "--fidlc-bin",
        rebase_path("$fuchsia_sdk_path/tools/fidlc"),
      "--fidlgen-bin",
        rebase_path("$fuchsia_sdk_path/tools/fidlgen"),
      "--sdk-base",
        rebase_path("$fuchsia_sdk_path"),
      "--root",
      rebase_path(invoker.meta),
      "--json",
      rebase_path("$target_gen_dir/$library_name_json"),
      "--include-base",
      rebase_path("$target_gen_dir"),
      "--output-base-cc",
      rebase_path("$target_gen_dir/fuchsia/$library_name_slashes/cpp/fidl"),
      "--output-c-header",
      rebase_path("$target_gen_dir/fuchsia/$library_name_slashes/c/fidl.h"),
      "--output-c-tables",
      rebase_path(
          "$target_gen_dir/fuchsia/$library_name_slashes/cpp/tables.cc"),
    ]
  }

  source_set(target_name) {
    public_configs = [ ":$config_name" ]

    sources = get_target_outputs(":$fidl_gen_target_name")

    deps = [
      ":$fidl_gen_target_name",
    ]

    public_deps = _deps
  }
}

#
# Produce a cc source library from invoker's json file.
# Primary output is the source_set.
#
template("_fuchsia_cc_source_library") {
  assert(defined(invoker.meta), "The meta.json file path must be specified.")

  meta_json = read_file(invoker.meta, "json")

  assert(meta_json.type == "cc_source_library")

  _output_name = meta_json.name
  _include_dirs = []
  _public_headers = []
  _sources = []
  _deps = []

  meta_json_include_dir = meta_json.include_dir
  _include_dirs += [ rebase_path("$fuchsia_sdk_path/$meta_json_include_dir") ]

  foreach(header, meta_json.headers) {
    rebased_header = []
    rebased_header = [ rebase_path("$fuchsia_sdk_path/$header") ]
    _public_headers += rebased_header
    _sources += rebased_header
  }

  foreach(source, meta_json.sources) {
    _sources += [ "$fuchsia_sdk_path/$source" ]
  }

  config_name = "config_$target_name"
  config(config_name) {
    include_dirs = _include_dirs
  }

  foreach(dep, meta_json.deps) {
    _deps += [ "../pkg:$dep" ]
  }

  foreach(dep, meta_json.fidl_deps) {
    _deps += [ "../fidl:$dep" ]
  }

  source_set(target_name) {
    output_name = _output_name
    public = _public_headers
    sources = _sources
    public_configs = [ ":$config_name" ]
    public_deps = _deps
  }
}

template("_fuchsia_cc_prebuilt_library") {
  assert(defined(invoker.meta), "The meta.json file path must be specified.")
  meta_json = read_file(invoker.meta, "json")

  _include_dirs = []
  _deps = []
  _libs = []

  meta_json_include_dir = meta_json.include_dir
  _include_dirs += [ "$fuchsia_sdk_path/$meta_json_include_dir" ]

  foreach(dep, meta_json.deps) {
    _deps += [ ":$dep" ]
  }

  meta_json_binaries = meta_json.binaries
  if (target_cpu == "x64") {
    meta_json_binaries_arch = meta_json_binaries.x64
  } else {
    meta_json_binaries_arch = meta_json_binaries.arm64
  }
  prebuilt_lib = meta_json_binaries_arch.link
  _libs = [ "$fuchsia_sdk_path/$prebuilt_lib" ]

  config_name = "config_$target_name"
  config(config_name) {
    include_dirs = _include_dirs
    libs = _libs
  }

  group(target_name) {
    public_configs = [ ":$config_name" ]
    public_deps = _deps
  }
}

#
# Read SDK manifest json file and produce gn build targets for all
# "enabled_parts" as specified by the template invoker.
#
# Fuchsia SDK manifest is primarily a "parts" array.
#
template("fuchsia_sdk") {
  assert(defined(invoker.meta), "The meta.json file path must be specified.")
  assert(defined(invoker.enabled_parts),
         "A list containing the parts of the SDK to generate targets for.")

  meta_json = read_file(invoker.meta, "json")

  foreach(part, meta_json.parts) {
    part_meta_json = {
    }

    part_meta = part.meta
    part_meta_rebased = "$fuchsia_sdk_path/$part_meta"

    part_meta_json = read_file(part_meta_rebased, "json")
    subtarget_name = part_meta_json.name

    foreach(enabled_part, invoker.enabled_parts) {
      if (part.type == "cc_source_library") {
        if (part.type == enabled_part) {
          _fuchsia_cc_source_library(subtarget_name) {
            meta = part_meta_rebased
          }
        }
      } else if (part.type == "sysroot") {
        if (part.type == enabled_part) {
          _fuchsia_sysroot(subtarget_name) {
            meta = part_meta_rebased
          }
        }
      } else if (part.type == "fidl_library") {
        if (part.type == enabled_part) {
          _fuchsia_fidl_library(subtarget_name) {
            meta = part_meta_rebased
          }
        }
      } else if (part.type == "cc_prebuilt_library") {
        if (part.type == enabled_part) {
          _fuchsia_cc_prebuilt_library(subtarget_name) {
            meta = part_meta_rebased
          }
        }
      }
    }
  }

  group(target_name) {
  }
}

#
# Create package in 'gen' directory.
#
template("fuchsia_package") {
  assert(defined(invoker.name), "The name of the package must be specified.")
  assert(defined(invoker.version), "The package version must be specified.")

  pkg_dir = target_gen_dir
  pkg_name = invoker.name
  pkg_version = invoker.version
  pkg_manifest = invoker.pkg_manifest

  pkg_id_path = "${pkg_dir}/meta/package"
  gen_far_target_name = "gen_far_${target_name}"
  pkg_archive = "${pkg_dir}/${pkg_name}-${pkg_version}.far"

  action(gen_far_target_name) {
    script = "//build/fuchsia/gen_package"

    pm_binary = rebase_path("$fuchsia_sdk_path/tools/pm")

    inputs = [
      pm_binary,
    ]

    outputs = [
      pkg_id_path,
      pkg_archive,
    ]

    args = [
      "--pm-bin",
      pm_binary,
      "--pkg-dir",
      rebase_path(pkg_dir),
      "--pkg-name",
      pkg_name,
      "--pkg-version",
      "$pkg_version",
      "--pkg-manifest",
      rebase_path(pkg_manifest),
    ]

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

  copy(target_name) {
    if (defined(invoker.testonly)) {
      testonly = invoker.testonly
    }

    sources = [
      pkg_archive,
    ]

    output_name = "${root_out_dir}/far/${pkg_name}.far"
    outputs = [
      output_name,
    ]

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

#
# Places repo in output ('obj') directory.
#
template("fuchsia_repo") {
  assert(defined(invoker.archives),
         "The list of archives to publish must be specified.")
  assert(defined(invoker.repo), "The location of the repo should be specified.")

  action(target_name) {
    if (defined(invoker.testonly)) {
      testonly = invoker.testonly
    }
    script = "//build/fuchsia/gen_repo"

    pm_binary = rebase_path("$fuchsia_sdk_path/tools/pm")
    repo_directory = invoker.repo

    inputs = [
      pm_binary,
    ]

    archive_flags = []

    foreach(archive, invoker.archives) {
      assert(get_path_info(archive, "extension") == "far",
             "Archive '$archive' does not have the .far extension.")
      inputs += [ archive ]
      archive_flags += [
        "--archive",
        rebase_path(archive),
      ]
    }

    outputs = [
      repo_directory,
    ]

    args = [
             "--pm-bin",
             pm_binary,
             "--repo-dir",
             rebase_path(repo_directory),
           ] + archive_flags

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