# 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.

# Declare a driver module target.
#
# This target allows you to create an object file that can be used as a driver
# that is loaded at runtime.
#
# Parameters
#
#   test (optional)
#     [boolean] Whether this driver is a test driver. Defaults to false.
#     Note: this only makes sense for drivers migrated from the Zircon build.
#           Safe to ignore in other cases.
#
# 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("driver_module") {
  loadable_module(target_name) {
    variant_selector_target_type = "driver_module"

    # 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(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)
    _dest_dir = "driver"
    if (defined(invoker.test) && invoker.test) {
      _dest_dir += "/test"
    }

    has_syslog_backend = false

    if (defined(deps)) {
      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"
      }
    }

    # 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 distribution_manifest template.
      distribution_entries = [
        {
          source = _rebased_output_file
          destination = "$_dest_dir/$_output_file_name"
          label = get_label_info(":$_target_name", "label_with_toolchain")
        },
      ]
    }
  }
}

set_defaults("driver_module") {
  # Sets the default configs for driver_module, 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" ]
}

# TODO(64400): Temporary to allow out of tree users to soft migrate.
template("driver_module_new") {
  driver_module(target_name) {
    forward_variables_from(invoker, "*")
  }
}

set_defaults("driver_module_new") {
  configs = default_shared_library_configs
  configs += [ "//build/config/fuchsia:static_cpp_standard_library" ]
}
