# Copyright 2017 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/drivers/verify_shared_libraries.gni")
import("//build/zircon/c_utils.gni")

# Declare a fuchsia driver target.
#
# This target allows you to create an object file that can be used as a driver
# that is loaded at runtime.
#
# Parameters
#
# Flags: cflags, cflags_c, cflags_cc,  asmflags, defines, include_dirs,
#        ldflags, lib_dirs, libs,
# Deps: data_deps, deps, public_deps
# Dependent configs: all_dependent_configs, public_configs
# General: check_includes, configs, data, inputs, output_name,
#          output_extension, public, sources, testonly, visibility
template("fuchsia_driver") {
  check_target = "_driver.shlib-allowlist-check.$target_name"
  shared_libraries_used_target = "_driver.shlib-used.$target_name"

  driver_label = get_label_info(":$target_name", "label_with_toolchain")
  shared_libraries_used_file =
      "${target_gen_dir}/${target_name}.driver-shlib-used"

  # Generates a list of all of the things our driver links against.
  link_output_rspfile(shared_libraries_used_target) {
    forward_variables_from(invoker,
                           [
                             "deps",
                             "testonly",
                           ])
    outputs = [ shared_libraries_used_file ]
  }

  # Checks the driver's shared libraries against an allowlist.
  verify_shared_libraries(check_target) {
    forward_variables_from(invoker, [ "testonly" ])
    target_label = driver_label
    libraries_used_file = shared_libraries_used_file
    libraries_allowlist_file = "//build/drivers/driver_shared_library_allowlist"
    output_file = "$target_gen_dir/${check_target}.dynamic_libs"

    deps = [ ":$shared_libraries_used_target" ]
  }

  # This is the actual driver module.
  loadable_module(target_name) {
    variant_selector_target_type = "fuchsia_driver"

    # Save the target name as forward_variables_from below might override it.
    _target_name = target_name

    assert_no_deps = []

    # Explicitly forward visibility, implicitly forward everything else.
    # See comment in //build/config/BUILDCONFIG.gn for details on this pattern.
    forward_variables_from(invoker, [ "visibility" ])
    forward_variables_from(invoker,
                           "*",
                           [
                             "test",
                             "visibility",
                           ])

    # Restore the target name.
    target_name = _target_name

    if (!defined(deps)) {
      deps = []
    }

    if (!defined(output_dir)) {
      output_dir = root_out_dir
    }
    if (!defined(output_name)) {
      output_name = target_name
    }
    if (!defined(output_extension)) {
      output_extension = "so"
    }

    _output_file_name = output_name
    if (output_extension != "") {
      _output_file_name += ".$output_extension"
    }
    _output_file = "$output_dir/$_output_file_name"
    _rebased_output_file = rebase_path(_output_file, root_build_dir)

    has_syslog_backend = false

    foreach(dep, deps) {
      dep = get_label_info(dep, "label_no_toolchain")
      has_syslog_backend =
          has_syslog_backend || dep == "//sdk/lib/syslog/cpp:backend" ||
          dep == "//sdk/lib/syslog/cpp:backend_legacy" ||
          dep == "//sdk/lib/syslog/cpp:backend_fuchsia_compat"
    }

    deps += [ ":$check_target" ]

    # If no syslog backend is found, ensure we have not included the syslog frontend.
    if (!has_syslog_backend) {
      assert_no_deps += [ "//sdk/lib/syslog/cpp" ]
    }

    metadata = {
      # Used by the check_included_drivers template.
      fuchsia_driver_labels =
          [ get_label_info(":$_target_name", "label_no_toolchain") ]

      # Used by the distribution_manifest template.
      distribution_entries = [
        {
          source = _rebased_output_file
          destination = "driver/$_output_file_name"
          label = get_label_info(":$_target_name", "label_with_toolchain")
          elf_runtime_dir = "lib/${toolchain_variant.libprefix}"
        },
      ]
    }
  }
}

set_defaults("fuchsia_driver") {
  # Sets the default configs for fuchsia_driver, which can be modified later
  # by the invoker. This overrides the loadable_module default.
  configs = default_shared_library_configs

  # Drivers cannot dynamically link against the C++ standard library. This config
  # tells the linker to link against it statically. This is safe for drivers which
  # don't depend on the standard library as well as the linker will not have any
  # symbols to resolve.
  configs += [ "//build/config/fuchsia:static_cpp_standard_library" ]
}
