# 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("//third_party/openweave-core/config.gni")

# Builds OpenWeave with the given adaptation-layer sources. OpenWeave splits out
# platform-specific code into //third_party/openweave-core/src/adaptation, which
# may exist outside the tree. This template generates the following targets:
#
# target_name.sources:
#   A source_set of implementation code, packaged with the headers.
# target_name.headers:
#   A source_set of headers only, including openweave-core and adaptation headers.
# target_name.shared:
#   A shared_library of implementation code, packaged with the headers.
#
# By default, depending on this target will return target_name.sources. Targets
# can depend on the shared library explicitly, but must be aware that only headers
# explicitly marked with NL_DLL_EXPORT will be visible.
template("openweave_adaptation_layer") {
  top_builddir = rebase_path("//third_party/openweave-core")
  _library_name = target_name

  # Implementation sources must be defined in order to build.
  assert(defined(invoker.sources), "Sources must be defined.")

  # Create public_configs set for all sub-targets.
  _public_configs = [
    ":${target_name}.openweave_config",
    "//third_party/openweave-core/src/include:public",
  ]
  if (defined(invoker.public_configs)) {
    _public_configs += invoker.public_configs
  }

  # Create configs set for all sub-targets.
  _configs = []
  if (defined(invoker.configs)) {
    _configs += invoker.configs
  }

  # Default target includes sources, components should depend on the sub-targets
  # if only headers or a shared library is required.
  group(target_name) {
    public_deps = [ ":${_library_name}.sources" ]
  }

  target("source_set", "${_library_name}.headers") {
    sources = filter_include(invoker.sources,
                             [
                               "*.h",
                               "*.hpp",
                             ])
    public_deps = [ ":${_library_name}.public_deps" ]
    public_configs = _public_configs
    deps = [ ":${_library_name}.deps" ]
    configs += _configs
  }

  target("source_set", "${_library_name}.sources") {
    sources = [
      "$top_builddir/src/adaptations/device-layer/DeviceControlServer.cpp",
      "$top_builddir/src/adaptations/device-layer/DeviceDescriptionServer.cpp",
      "$top_builddir/src/adaptations/device-layer/DeviceIdentityTraitDataSource.cpp",
      "$top_builddir/src/adaptations/device-layer/DeviceNetworkInfo.cpp",
      "$top_builddir/src/adaptations/device-layer/EchoServer.cpp",
      "$top_builddir/src/adaptations/device-layer/EventLogging.cpp",
      "$top_builddir/src/adaptations/device-layer/FabricProvisioningServer.cpp",
      "$top_builddir/src/adaptations/device-layer/Fuchsia/Logging.cpp",
      "$top_builddir/src/adaptations/device-layer/GeneralUtils.cpp",
      "$top_builddir/src/adaptations/device-layer/Globals.cpp",
      "$top_builddir/src/adaptations/device-layer/LocaleSettingsTraitDataSink.cpp",
      "$top_builddir/src/adaptations/device-layer/NetworkTelemetryManager.cpp",
      "$top_builddir/src/adaptations/device-layer/PersistedStorage.cpp",
      "$top_builddir/src/adaptations/device-layer/ServiceDirectoryManager.cpp",
      "$top_builddir/src/adaptations/device-layer/ServiceProvisioningServer.cpp",
      "$top_builddir/src/adaptations/device-layer/ServiceTunnelAgent.cpp",
      "$top_builddir/src/adaptations/device-layer/SystemEventSupport.cpp",
      "$top_builddir/src/adaptations/device-layer/SystemTimerSupport.cpp",
      "$top_builddir/src/adaptations/device-layer/TimeSyncManager.cpp",
      "$top_builddir/src/adaptations/device-layer/TraitManager.cpp",
      "$top_builddir/src/adaptations/device-layer/trait-support/nest/trait/firmware/SoftwareUpdateTrait.cpp",
      "$top_builddir/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkTrait.cpp",
      "$top_builddir/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWifiTrait.cpp",
      "$top_builddir/src/adaptations/device-layer/trait-support/nest/trait/network/TelemetryNetworkWpanTrait.cpp",
      "$top_builddir/src/adaptations/device-layer/trait-support/weave/common/ProfileSpecificStatusCodeStructSchema.cpp",
      "$top_builddir/src/adaptations/device-layer/trait-support/weave/trait/description/DeviceIdentityTrait.cpp",
      "$top_builddir/src/adaptations/device-layer/trait-support/weave/trait/locale/LocaleSettingsTrait.cpp",
      "$top_builddir/src/adaptations/device-layer/trait-support/weave/trait/telemetry/tunnel/TelemetryTunnelTrait.cpp",
    ]
    sources += filter_include(invoker.sources,
                              [
                                "*.cc",
                                "*.cpp",
                                "*.ipp",
                              ])

    public_deps = [
      ":${_library_name}.headers",
      ":${_library_name}.public_deps",
    ]
    public_configs = _public_configs
    deps = [ ":${_library_name}.deps" ]
    configs += _configs
  }

  target("shared_library", "${_library_name}.shared") {
    public_deps = [
      ":${_library_name}.headers",
      ":${_library_name}.public_deps",
    ]
    public_configs = _public_configs
    deps = [
      ":${_library_name}.deps",
      ":${_library_name}.sources",
    ]
    configs += _configs

    # Explicitly build the library with -fPIC.
    configs += [ ":${_library_name}.linker_config" ]
  }

  group("${_library_name}.public_deps") {
    public_deps = [
      "//third_party/openweave-core/src/include:DeviceLayer_headers",
      "//third_party/openweave-core/src/include:common",
    ]
    if (defined(invoker.public_deps)) {
      public_deps += invoker.public_deps
    }
  }

  group("${_library_name}.deps") {
    deps = []
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }

  config("${_library_name}.openweave_config") {
    include_dirs = [
      "$top_builddir/src/adaptations/device-layer/include",
      "$top_builddir/src/adaptations/device-layer/trait-support",
    ]
    if (defined(invoker.include_dirs)) {
      include_dirs += invoker.include_dirs
    }
  }

  config("${_library_name}.linker_config") {
    cflags = [ "-fPIC" ]
  }
}
