# Copyright 2018 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/cpp/verify_pragma_once.gni")
import("//build/cpp/verify_public_symbols.gni")
import("//build/sdk/sdk_atom.gni")
import("//build/sdk/sdk_atom_alias.gni")
import("//sdk/cts/plasa/config.gni")
import("//sdk/cts/plasa/plasa_artifacts.gni")

# A shared library that can be exported to an SDK in binary form.
#
# Parameters
#
#   category (required)
#     Publication level of the library in SDKs.
#     See //build/sdk/sdk_atom.gni.
#
#   api (optional)
#     Path to the file representing the API of this library.
#     This file is used to ensure modifications to the library's API are
#     explicitly acknowledged. It is mandatory for publication categories of
#     "partner" or "public".
#     Defaults to "<SDK name>.api".
#
#   symbols_api (optional)
#     Path to the ifs file containing the public symbols of this library.
#     This file is used to ensure modifications to the library's ABI are
#     explicitly acknowledged. It is mandatory for publication categories of
#     "partner" or "public".
#
#   no_headers (optional)
#     Whether to include the library's headers in the SDK.
#     Defaults to false.
#
#   libcxx_linkage (optional)
#     Whether or how to link libc++. SDK shared libraries cannot link libc++.so
#     dynamically because libc++.so does not have a stable ABI. Can be either
#     "none" or "static".
#     Defaults to "none".
#
#   sdk_name (optional)
#     Name of the library in the SDK.
#     Defaults to the library's output name.
#
#   include_base (optional)
#     Path to the root directory for includes.
#     Defaults to "include".
#
#   runtime_deps (optional)
#     List of labels representing the library's runtime dependencies. This is
#     only needed for runtime dependencies inherited from private dependencies.
#     Note that these labels should represent SDK targets.
#
#   private_headers (optional)
#     List of header files that are not intended for direct inclusion by users.
#     Used to help generate stub files, which do not know apriori that a header
#     is not to be used.  Define these in addition to deps (i.e. repeat them
#     if they are already mentioned in 'sources').

# The defaults for a sdk_shared_library should match that of a shared_library.
set_defaults("sdk_shared_library") {
  configs = default_shared_library_configs
}

template("sdk_shared_library") {
  assert(defined(invoker.category), "Must define an SDK category")

  # Not all code paths use this option.
  not_needed(invoker, [ "private_headers" ])

  output_name = target_name
  if (defined(invoker.output_name)) {
    output_name = invoker.output_name
  }

  if (defined(invoker.sdk_name)) {
    atom_name = invoker.sdk_name
  } else {
    atom_name = output_name
  }

  no_headers = defined(invoker.no_headers) && invoker.no_headers

  # TODO(fxbug.dev/97934): Remove after Vulkan-Loader has been transitioned to
  # using ifs abi checking.
  do_abi_check = true
  if (defined(invoker.do_abi_check)) {
    do_abi_check = invoker.do_abi_check
  }
  not_needed([ "do_abi_check" ])

  if ((invoker.category == "partner" || invoker.category == "public") &&
      !no_headers) {
    api_reference = "${atom_name}.api"
    if (defined(invoker.api)) {
      api_reference = invoker.api
    }
  }

  main_target_name = target_name
  metadata_target_name = "${target_name}_sdk_metadata"
  manifest_target_name = "${target_name}_sdk_manifest"
  verify_pragma_target_name = "${target_name}_sdk_pragma"
  sdk_target_name = "${target_name}_sdk"

  shared_library(main_target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "api",
                             "category",
                             "include_base",
                             "no_headers",
                             "runtime_deps",
                             "sdk_name",
                             "symbols_api",
                           ])

    if (defined(visibility)) {
      visibility += [ ":$manifest_target_name" ]
    }

    if (!defined(libcxx_linkage)) {
      libcxx_linkage = "none"
    }
    assert(libcxx_linkage == "none" || libcxx_linkage == "static")

    # Prebuilt shared libraries are eligible for inclusion in the SDK. We do not
    # want to dynamically link against libc++.so because we let clients bring
    # their own toolchain, which might have a different C++ Standard Library or
    # a different C++ ABI entirely.
    if (!defined(configs)) {
      configs = []
    }
    if (libcxx_linkage == "static") {
      configs += [ "//build/config/fuchsia:static_cpp_standard_library" ]
    } else {
      # Adding this linker flag keeps us honest about not commiting to a
      # specific C++ ABI. If this flag is causing your library to not
      # compile, consider whether your library really ought to be in the SDK.
      # If so, consider including your library in the SDK as source rather than
      # precompiled. If you do require precompilation, you probably need to
      # find a way not to depend on dynamically linking C++ symbols because C++
      # does not have a sufficiently stable ABI for the purposes of our SDK.
      configs += [ "//build/config/fuchsia:no_cpp_standard_library" ]
    }

    # Request that the runtime deps be written out to a file. This file will be
    # used later to verify that all runtime deps are available in the SDK.
    write_runtime_deps = "$target_out_dir/$target_name.runtime_deps"
  }

  # Base path for source files of this library in SDKs.
  file_base = "pkg/$atom_name"

  # Base path for binaries of this library in SDKs.
  prebuilt_base = "arch/$target_cpu"

  # Identify dependencies and their metadata files.
  sdk_deps = []
  sdk_metas = []
  all_deps = []
  if (defined(invoker.deps)) {
    all_deps += invoker.deps
  }
  if (defined(invoker.public_deps)) {
    all_deps += invoker.public_deps
  }

  # If a prebuilt library is only provided for packaging purposes (by not
  # exposing headers) then its dependencies need not be included in an SDK.
  if (defined(invoker.public_deps) && !no_headers) {
    foreach(dep, invoker.public_deps) {
      full_label = get_label_info(dep, "label_no_toolchain")
      sdk_dep = "${full_label}_sdk"
      sdk_deps += [ sdk_dep ]
      all_deps += [ sdk_dep ]
    }
  }

  # Runtime deps are already SDK targets.
  if (defined(invoker.runtime_deps)) {
    sdk_deps += invoker.runtime_deps
  }
  foreach(sdk_dep, sdk_deps) {
    gen_dir = get_label_info(sdk_dep, "target_gen_dir")
    name = get_label_info(sdk_dep, "name")
    sdk_metas += [ "$gen_dir/$name.meta.json" ]
  }

  # Process headers.
  all_headers = []
  if ((defined(invoker.public) || defined(invoker.sources)) && !no_headers) {
    if (defined(invoker.public)) {
      all_headers += invoker.public
    } else {
      foreach(source_file, invoker.sources) {
        extension = get_path_info(source_file, "extension")
        if (extension == "h") {
          all_headers += [ source_file ]
        }
      }
    }
  }
  sdk_metadata_headers = []
  sdk_header_files = []
  foreach(header, all_headers) {
    include_base = "include"
    if (defined(invoker.include_base)) {
      include_base = invoker.include_base
    }
    destination = rebase_path(header, include_base)
    header_dest = "$file_base/include/$destination"
    sdk_metadata_headers += [ header_dest ]
    sdk_header_files += [
      {
        source = header
        dest = header_dest
      },
    ]
  }

  # Add binaries.
  #
  # Select shared library binary from the proper toolchain.
  # See shlib_toolchain_no_default_variant_redirect documentation comment
  # in //build/config/BUILDCONFIG.gn to understand why this is needed.
  shared_lib_target =
      ":$main_target_name($shlib_toolchain_no_default_variant_redirect)"
  shared_out_dir = get_label_info(shared_lib_target, "root_out_dir")
  lib_name = "lib$output_name.so"
  link_lib = "$prebuilt_base/lib/$lib_name"
  dist_lib = "$prebuilt_base/dist/$lib_name"
  sdk_files =
      sdk_header_files + [
        {
          # TODO(fxbug.dev/2875): put ABI stubs under lib/, not the full thing.
          source = "$shared_out_dir/$lib_name"
          dest = link_lib
        },
        {
          source = "$shared_out_dir/$lib_name"
          dest = dist_lib
        },
      ]

  if (generate_plasa_artifacts) {
    _plasa_artifacts_target_name = "${main_target_name}_plasa"
    plasa_artifacts(_plasa_artifacts_target_name) {
      forward_variables_from(invoker,
                             [
                               "source_dir",
                               "testonly",
                               "all_headers",
                               "all_deps",
                               "private_headers",
                             ])
      file_base = file_base
    }
  } else {
    not_needed([ "all_deps" ])
  }

  metadata_file = "$target_gen_dir/$metadata_target_name.sdk_meta.json"
  debug_mapping_file = "$target_gen_dir/$metadata_target_name.mappings.txt"
  debug_lib_file = "$shared_out_dir/lib.unstripped/$lib_name"

  action(metadata_target_name) {
    forward_variables_from(invoker, [ "testonly" ])
    script = "//build/cpp/gen_sdk_prebuilt_meta_file.py"

    inputs = sdk_metas + [
               debug_lib_file,
               "//build/cpp/binaries.py",
               "//build/images/elfinfo.py",
             ]

    outputs = [
      debug_mapping_file,
      metadata_file,
    ]

    args = [
      "--out",
      rebase_path(metadata_file, root_build_dir),
      "--name",
      atom_name,
      "--format",
      "shared",
      "--root",
      file_base,
      "--include-dir",
      "$file_base/include",
      "--dist-path",
      "lib/$lib_name",
      "--arch",
      target_cpu,
      "--lib-link",
      link_lib,
      "--lib-dist",
      dist_lib,
      "--lib-debug-file",
      rebase_path(debug_lib_file, root_build_dir),
      "--debug-mapping",
      rebase_path(debug_mapping_file, root_build_dir),
    ]
    args += [ "--deps" ] + rebase_path(sdk_metas, root_build_dir)
    args += [ "--headers" ] + sdk_metadata_headers

    deps = sdk_deps + [ shared_lib_target ]
  }

  verify_pragma_once(verify_pragma_target_name) {
    headers = all_headers
  }

  # Don't verify the public symbols for non-publicized APIs.
  # TODO(abrachet): Make this required for all libraries.
  if (invoker.category == "partner" || invoker.category == "public") {
    assert(
        defined(invoker.symbols_api),
        "Must define path to an ifs file. See comment in //build/cpp/verify_public_symbols.gni")
    main_target_dir = get_label_info(":$main_target_name", "dir")

    verify_public_symbols_target_name =
        "${target_name}_sdk_verify_public_symbols"
    verify_public_symbols(verify_public_symbols_target_name) {
      current = "$shared_out_dir/lib$output_name.ifs"
      reference = invoker.symbols_api
      library_name = main_target_dir

      deps = [ shared_lib_target ]
    }
  }

  sdk_atom(manifest_target_name) {
    forward_variables_from(invoker, [ "testonly" ])

    id = "sdk://pkg/$atom_name"

    category = invoker.category

    if (defined(api_reference) && !no_headers) {
      api = api_reference

      api_contents = sdk_header_files
    }

    meta = {
      source = metadata_file
      dest = "$file_base/meta.json"
      schema = "cc_prebuilt_library"
    }

    files = sdk_files

    file_list = debug_mapping_file

    deps = sdk_deps

    non_sdk_deps = [
      ":$metadata_target_name",
      ":$verify_pragma_target_name",
      shared_lib_target,
    ]
    if (generate_plasa_artifacts) {
      non_sdk_deps += [ ":$_plasa_artifacts_target_name" ]
    }
    if (category == "partner" || category == "public") {
      non_sdk_deps += [ ":$verify_public_symbols_target_name" ]
    }

    # Explicitly add non-public dependencies, in case some of the source files
    # are generated.
    if (defined(invoker.deps)) {
      non_sdk_deps += invoker.deps
    }
  }

  shared_gen_dir = get_label_info(shared_lib_target, "target_out_dir")
  runtime_deps_file = "$shared_gen_dir/$target_name.runtime_deps"
  sdk_manifest_file = "$target_gen_dir/$manifest_target_name.sdk"
  verify_target_name = "${target_name}_verify"

  # Verify that the SDK manifest for this target includes all of the expected
  # runtime dependencies.
  # TODO(fxbug.dev/5365): also check that everything in there is either prebuilt or
  # headers only.
  action(verify_target_name) {
    script = "//build/cpp/verify_runtime_deps.py"

    inputs = [
      sdk_manifest_file,
      runtime_deps_file,
    ]

    stamp_file = "$target_gen_dir/$target_name.gn_stamp"

    outputs = [ stamp_file ]

    args = [
      "--stamp",
      rebase_path(stamp_file, root_build_dir),
      "--manifest",
      rebase_path(sdk_manifest_file, root_build_dir),
      "--runtime-deps-file",
      rebase_path(runtime_deps_file, root_build_dir),
    ]

    deps = [
      ":$manifest_target_name",
      shared_lib_target,
    ]
  }

  sdk_atom_alias(sdk_target_name) {
    atom = ":$manifest_target_name"

    non_sdk_deps = [ ":$verify_target_name" ]

    if (generate_plasa_artifacts) {
      non_sdk_deps += [ ":$_plasa_artifacts_target_name" ]
    }
  }
}
