# 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")

# 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.
#   libs         - List of precompiled libraries.
template("fuchsia_sdk_pkg") {
  config("${target_name}_config") {
    forward_variables_from(invoker, [ "include_dirs" ])
    visibility = [ ":${invoker.target_name}" ]
  }

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

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

    if (defined(libs)) {
      configs += [ "//third_party/fuchsia-sdk:sdk_lib_dirs_config" ]
    }
  }
}
