# 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("//build/config/fuchsia/zircon.gni")
import("//build/cpp/extract_public_symbols.gni")
import("//build/cpp/verify_pragma_once.gni")
import("//build/cpp/verify_public_symbols.gni")
import("//build/sdk/sdk_atom.gni")

declare_args() {
  # Whether to set up //zircon/public/lib/* libraries as simple aliases to their
  # counterparts under //zircon/system/ulib.
  # This is disabled by default as non-source libraries under that configuration
  # are getting compiled with GN build settings instead of ZN build settings,
  # which could introduce subtle issues.
  # TODO(3203): make aliasing the default behavior.
  zircon_public_lib_aliases = false
}

# Define a library in //zircon/public/lib/$target_name/BUILD.gn.
#
# zircon_library() is invoked by files copied from template.gn based on
# "$zircon_root_build_dir/legacy-$target_cpu.json" entries generated by
# Zircon library() targets with $sdk set.  They provide the deps API for
# Fuchsia targets to depend on Zircon libraries, which are either used as
# binaries previously built by Zircon, or built in Fuchsia from source.
#
# Parameters
#
#   deps, public_deps
#     Optional: Dependencies for the target.  $deps is only relevant for
#     source libraries.  $public_deps reflects header dependencies.
#     Type: list(label matching "//zircon/public/lib/*")
#
#   dir
#     Required: Source-absolute path to library's source directory in //zircon.
#     Type: dir
#
#   sources
#     Optional: If present, publish library as source with these files.
#     Type: list(file)
#
#   libs
#     Optional: If present, publish library as prebuilt with these files.
#     Type: list(path relative to $zircon_root_build_dir)
#
#   include_dirs
#     Required: The directory prefix where $headers are found.
#     Type: singleton list(path relative to $zircon_root_build_dir)
#
#   headers
#     Required: List of header files to copy into the SDK.
#     Type: list(path relative to ${include_dirs[0]})
#
#   publishable
#     Optional: Whether the library is eligible for addition to SDKs.
#     Type: bool
#     Default: false
#
# Either $sources or $libs must be present.
#
template("zircon_library") {
  library = target_name

  include = rebase_path(invoker.include_dirs, ".", zircon_root_build_dir)
  assert(include == [ include[0] ])
  library_headers = rebase_path(invoker.headers, ".", include[0])

  # Zircon targets depend explicitly on $zx/system/ulib/zircon, but in
  # legacy Fuchsia GN there is no //zircon/public/lib/zircon and instead
  # it's available implicitly in the sysroot via `libs = [ "zircon" ]`.
  library_deps = []
  library_public_deps = []
  library_libs = []
  if (defined(invoker.deps)) {
    library_deps = invoker.deps
  }
  if (defined(invoker.public_deps)) {
    library_public_deps = invoker.public_deps
  }
  if (library_deps + [ "//zircon/public/lib/zircon" ] -
      [ "//zircon/public/lib/zircon" ] != library_deps) {
    library_deps -= [ "//zircon/public/lib/zircon" ]
    library_libs += [ "zircon" ]
  }
  if (library_public_deps + [ "//zircon/public/lib/zircon" ] -
      [ "//zircon/public/lib/zircon" ] != library_public_deps) {
    library_public_deps -= [ "//zircon/public/lib/zircon" ]
    library_libs += [ "zircon" ]
  }

  is_prebuilt = defined(invoker.libs)

  zx_lib_dirs = []
  zx_libs = []
  if (is_prebuilt) {
    # A prebuilt binary (either static .a or shared .so, doesn't matter)
    # has nothing to do but bring in the config() for its `libs`.
    type = "group"

    # Rust targets use -L... -lfoo instead of explicit files.  So they
    # need to collect the -L list via metadata, and directories on that
    # list needs to hold exact names libfoo.so or libfoo.a for -lfoo.
    foreach(file, invoker.libs) {
      if (get_path_info(file, "extension") == "so" ||
          get_path_info(file, "extension") == "a") {
        zx_lib_dirs += [ rebase_path(get_path_info(file, "dir"),
                                     "",
                                     zircon_root_build_dir) ]
        zx_libs += [ get_path_info(file, "name") ]
      } else {
        file = rebase_path(file, "", zircon_root_build_dir)
        write_file("$target_gen_dir/lib$library.so", [ "INPUT($file)" ])
        zx_lib_dirs += [ rebase_path(target_gen_dir) ]
        zx_libs += [ library ]
      }
    }
    if (defined(invoker.lib_dirs)) {
      zx_lib_dirs += rebase_path(invoker.lib_dirs, "", zircon_root_build_dir)
    }
  } else {
    if (zircon_public_lib_aliases) {
      # Forward to the version of the library under //zircon/system/ulib.
      # Furthermore, use the static library version of the library to allow
      # proper compilation of Rust binaries.
      type = "group"
      library_deps = []
      library_public_deps = []
      if (library == "async-cpp" || library == "async-default") {
        library_public_deps += [ "//zircon/system/ulib/async:$library.static" ]
      } else if (library == "async-loop-cpp" ||
                 library == "async-loop-default") {
        library_public_deps +=
            [ "//zircon/system/ulib/async-loop:$library.static" ]
      } else if (library == "trace-provider-with-fdio") {
        library_public_deps +=
            [ "//zircon/system/ulib/trace-provider:$library.static" ]
      } else if (library == "fidl_base" || library == "fidl-llcpp") {
        library_public_deps +=
             [ "//zircon/system/ulib/fidl:$library.static" ]
      } else {
        library_public_deps += [ "${invoker.dir}:$library.static" ]
      }
      not_needed(invoker, [ "sources" ])
    } else {
      # A source library is always built for static linking only.
      # The invoker (i.e. the JSON) specifies `sources`.
      type = "static_library"
    }
  }

  # A library() always an include/ directory dependents must use.
  # A prebuilt library() (`sdk != "source"`) has a library they must link in.
  config("$library.config") {
    include_dirs = include
    if (is_fuchsia) {
      libs = library_libs

      # Rust targets ignore lib_dirs and libs and can't handle explicit
      # files as link inputs.  Instead they require -Lnative=... and -l...
      # switches as the only way to find non-Rust link inputs.
      rustflags = []
      foreach(dir, zx_lib_dirs) {
        rustflags += [ "-Lnative=$dir" ]
      }
      foreach(lib, zx_libs) {
        rustflags += [ "-l$lib" ]
      }
    } else {
      not_needed([
                   "library_libs",
                   "zx_lib_dirs",
                   "zx_libs",
                 ])
    }
    if (defined(invoker.libs) && invoker.libs != []) {
      assert(is_fuchsia, "Prebuilt $library used for host")
      libs += rebase_path(invoker.libs, ".", zircon_root_build_dir)
    }
  }

  target(type, library) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "debug",
                             "deps",
                             "dir",
                             "headers",
                             "include_dirs",
                             "install",
                             "lib_dirs",
                             "dist_dir",
                             "libs",
                             "public_deps",
                             "publishable",
                             "source_dir",
                           ])
    if (!zircon_public_lib_aliases || is_prebuilt) {
      # This config is not necessary for aliases to source libraries.
      public_configs = [ ":$library.config" ]
    }
    deps = library_deps
    public_deps = library_public_deps
    if (!is_fuchsia) {
      public_deps += [ "//zircon/system/public" ]
    }
    if (zx_lib_dirs != []) {
      metadata = {
        zircon_lib_dirs = zx_lib_dirs
      }
    }
  }

  if (defined(invoker.publishable) && invoker.publishable) {
    verify_pragma_once("$library-cpp_pragma") {
      headers = library_headers
    }

    lib_to_extract_symbols = ""
    foreach(file, invoker.install) {
      if (get_path_info(file.dest, "dir") == "lib") {
        # TODO(DX-688): formulate a policy around and handle static archives
        if (get_path_info(file.dest, "extension") != "a") {
          assert(lib_to_extract_symbols == "",
                 "There should be only one entry under lib")
          lib_to_extract_symbols = file.source
        }
      }
    }
    if (lib_to_extract_symbols != "") {
      lib_name = library
      generated_symbols_file = "$target_gen_dir/$lib_name.symbols.api"
      reference_symbols_file = "//sdk/lib/$lib_name/$lib_name.symbols.api"
      extract_public_symbols("$library-extract_public_symbols") {
        library = rebase_path(lib_to_extract_symbols, "", zircon_root_build_dir)

        # No dependencies, since all of Zircon has been built
        symbols = generated_symbols_file
      }
      verify_public_symbols("$library-verify_public_symbols") {
        current = generated_symbols_file
        reference = reference_symbols_file
        library_name = "(zircon) ${lib_name}"
        deps = [
          ":$library-extract_public_symbols",
        ]
      }
    }

    is_shared = false
    if (invoker.install != []) {
      _debug = invoker.debug
      installed_binaries = {
        if (_debug != []) {
          assert(_debug == [ _debug[0] ])
          debug = rebase_path(_debug[0], "", zircon_root_build_dir)
        }
      }
      foreach(file, invoker.install) {
        if (get_path_info(file.dest, "dir") == "dist") {
          installed_binaries.dist = "arch/$target_cpu/${file.dest}"
          file_name = get_path_info(file.dest, "file")
          installed_binaries.dist_path = "lib/$file_name"
        } else if (get_path_info(file.dest, "dir") == "lib") {
          installed_binaries.link = "arch/$target_cpu/${file.dest}"
        }
      }
      is_shared = get_path_info(installed_binaries.link, "extension") == "so"
    }

    _sdk_deps = []
    if (!is_shared && defined(invoker.deps)) {
      _sdk_deps += invoker.deps
    }
    if (defined(invoker.public_deps)) {
      _sdk_deps += invoker.public_deps
    }

    # De-duplicate.
    sdk_deps = []
    foreach(label, _sdk_deps) {
      sdk_deps += [ label ]
      sdk_deps -= [ label ]
      sdk_deps += [ label ]
    }

    _lib_deps = []
    _fidl_deps = []
    _banjo_deps = []
    foreach(label, sdk_deps) {
      if (get_path_info(get_path_info(label, "dir"), "name") == "fidl") {
        _fidl_deps += [ get_path_info(get_label_info(label, "dir"), "name") ]
      } else if (get_path_info(get_path_info(label, "dir"), "name") ==
                 "banjo") {
        _banjo_deps += [ get_path_info(get_label_info(label, "dir"), "name") ]
      } else {
        _lib_deps += [ get_path_info(get_label_info(label, "dir"), "name") ]
      }
    }

    # Zircon targets depend explicitly on $zx/system/ulib/zircon, but in
    # legacy Fuchsia GN there is no //zircon/public/lib/zircon and instead
    # it's available implicitly in the sysroot via `libs = [ "zircon" ]`.
    # zircon-internal is a header-only library used by some static libraries.
    _lib_deps += [
      "zircon",
      "zircon-internal",
    ]
    _lib_deps -= [
      "zircon",
      "zircon-internal",
    ]

    pkg = "pkg/$library"
    sdk_metadata = {
      name = library
      root = pkg
      if (defined(invoker.sources)) {
        type = "cc_source_library"
      } else {
        type = "cc_prebuilt_library"
      }

      include_dir = "$pkg/include"
      headers = rebase_path(invoker.headers, "//", "//$pkg/include")
      if (defined(invoker.sources)) {
        sources = rebase_path(rebase_path(invoker.sources, invoker.source_dir),
                              "//",
                              "//$pkg")
      }

      deps = _lib_deps
      if (invoker.install == []) {
        banjo_deps = _banjo_deps
        fidl_deps = _fidl_deps
      } else {
        not_needed([
                     "_banjo_deps",
                     "_fidl_deps",
                   ])
        if (is_shared) {
          format = "shared"
        } else if (get_path_info(installed_binaries.link, "extension") == "a") {
          format = "static"
        }
        binaries = {
          if (target_cpu == "arm64") {
            arm64 = installed_binaries
          } else if (target_cpu == "x64") {
            x64 = installed_binaries
          }
        }
      }
    }

    sdk_atom("${library}_sdk") {
      id = "sdk://pkg/$library"
      category = "partner"

      meta = {
        dest = "$pkg/meta.json"
        schema = sdk_metadata.type
        if (invoker.debug == []) {
          value = sdk_metadata
        } else {
          source = "$target_out_dir/$library.meta.out.json"
        }
      }

      non_sdk_deps = [ ":$library-cpp_pragma" ]
      if (lib_to_extract_symbols != "") {
        non_sdk_deps += [ ":$library-verify_public_symbols" ]
      }
      if (invoker.debug != []) {
        non_sdk_deps += [ ":$library-meta" ]
        file_list = "$target_out_dir/$library.debug.manifest"
      }

      files = []

      api_contents = []
      foreach(file, library_headers) {
        api_contents += [
          {
            source = file
            dest = "$pkg/include/" + rebase_path(file, include[0])
          },
        ]
      }
      files += api_contents

      if (api_contents != []) {
        api = "//sdk/lib/$library/$library.api"
      }

      if (defined(invoker.sources)) {
        foreach(file, invoker.sources) {
          files += [
            {
              source = file
              dest = "$pkg/" + rebase_path(file, invoker.source_dir)
            },
          ]
        }
      }

      foreach(file, invoker.install) {
        files += [
          {
            source = rebase_path(file.source, "", zircon_root_build_dir)
            dest = "arch/$target_cpu/${file.dest}"
          },
        ]
      }
    }

    if (invoker.debug != []) {
      write_file("$target_gen_dir/$library.meta.in.json", sdk_metadata, "json")
      action("$library-meta") {
        visibility = [ ":*" ]
        script = "//build/zircon/sdk_build_id.py"
        sources = [
          "$target_gen_dir/$library.meta.in.json",
        ]
        outputs = [
          "$target_out_dir/$library.meta.out.json",
          "$target_out_dir/$library.debug.manifest",
        ]
        args = [
          "--input=" + rebase_path(sources[0], root_build_dir),
          "--output=" + rebase_path(outputs[0], root_build_dir),
          "--manifest=" + rebase_path(outputs[1], root_build_dir),
          "--location=/binaries/$target_cpu/debug",
        ]
      }
    }
  } else {
    not_needed([ "library_headers" ])
  }  # defined(invoker.publishable) && invoker.publishable
}
