# Copyright 2019 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("config/config.gni")

# Defines a Fuchsia SDK library target from source or prebuilt.
#
# If this target has header files, they are exposed via a config
# object specifying the include_dirs.
#
# Shared libraries are copied to ${root_out_dir/lib} for packaging.
#
#
# Parameters
#
#   package_name
#     Optional: Name of the library. Default is target_name.
#   sources
#     Required: List of source files.
#
#   include_dirs
#     Optional: include_dirs to add to the configuration for the
#               target.
#   library_name
#     Optional: Name of the library. target_name is used if name
#               is not specified explicitly.
#
#   shared_libs
#     Optional: List of shared libraries for this target.
#
#   static_libs
#     Optional: List of static libraries for this target.
#
#   sdk_dist_dir
#     Optional: Directory of libraries to distribute in the
#               target. Defaults to ${fuchsia_sdk}/arch/${target_cpu}/dist.
#   deps
#     Optional: List of other targets that this library depends on.
#
# Declares a package containing uncompiled code and/or precompiled 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 = "${fuchsia_sdk}/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}/lib/{{source_file_part}}" ]
      visibility = [ ":${target_name}" ]
    }
  }

  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 += [ "${fuchsia_sdk}/build/config:sdk_lib_dirs_config" ]
      libs = invoker.shared_libs
      data_deps = [ ":${target_name}_dist_libs" ]
    } else if (defined(invoker.static_libs)) {
      libs = invoker.static_libs
    }
  }
}
