# Copyright 2018 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

assert(is_fuchsia)

import("//build/config/fuchsia/fidl_library.gni")
import("//build/toolchain/toolchain.gni")

# Templates for Fuchsia SDK packages.

# Declares a package specifying FIDL files and its dependencies.
#
# Parameters:
#   package_name - Name of the library. target_name is used if name
#                  is not specified explicitly.
#   namespace    - FIDL namespace.
#   sources      - List of sources relative to sdk/fidl/${name}.
#   deps         - List of dependencies.
template("fuchsia_sdk_fidl_pkg") {
  _package_name = target_name
  if (defined(invoker.package_name)) {
    _package_name = invoker.package_name
  }

  fidl_library(target_name) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "public_deps",
                             "testonly",
                             "visibility",
                           ])

    library_name = _package_name

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

    sources = invoker.sources
  }
}

# Declares a package containing uncompiled code and/or precompiled libraries.
#
# Parameters:
#   package_name - Name of the library. target_name is used if name
#                  is not specified explicitly.
#   sources      - List of sources relative to sdk/pkg/${name}.
#   deps         - List of dependencies.
#   shared_libs  - List of precompiled shared libraries.
#   static_libs  - List of precompiled static libraries.
template("fuchsia_sdk_pkg") {
  config("${target_name}_config") {
    forward_variables_from(invoker, [ "include_dirs" ])
    visibility = [ ":${invoker.target_name}" ]
  }

  if (defined(invoker.shared_libs)) {
    if (defined(invoker.sdk_dist_dir)) {
      sdk_dist_dir = invoker.sdk_dist_dir
    } else {
      sdk_dist_dir = "arch/${target_cpu}/dist"
    }

    copy("${target_name}_dist_libs") {
      sources = []
      foreach(lib, invoker.shared_libs) {
        sources += [ "${sdk_dist_dir}/lib${lib}.so" ]
      }

      outputs = [
        "${root_out_dir}${shlib_subdir}/{{source_file_part}}",
      ]
    }
  }

  static_library(target_name) {
    forward_variables_from(invoker,
                           [
                             "data",
                             "deps",
                             "public_deps",
                             "sources",
                             "testonly",
                             "visibility",
                           ])

    public_configs = [ ":${invoker.target_name}_config" ]

    if (defined(invoker.shared_libs)) {
      configs += [ "//third_party/fuchsia-sdk:sdk_lib_dirs_config" ]
      libs = invoker.shared_libs
      data_deps = [
        ":${target_name}_dist_libs",
      ]
    } else if (defined(invoker.static_libs)) {
      libs = invoker.static_libs
    }
  }
}
