# 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/zircon/zx_library.gni")

# Four copies of libtrace-provider are built:
# (1) trace-provider: Main version that is used by non-drivers.
#     This copy uses libtrace-engine.so.
# (2) trace-provider-so: Same as trace-provider, but exported to SDK
#     as a shared library. This copy uses libtrace-engine.so.
# (3) trace-provider-with-static-engine: For cases where a statically linked
#     trace-engine is needed. This is for very special cases. Please DO NOT
#     use this unless you KNOW you need to. Generally you do not. If in doubt,
#     ask.

template("trace_provider_library") {
  zx_library(target_name) {
    sdk = "source"
    sdk_headers = [
      "lib/trace-provider/fdio_connect.h",
      "lib/trace-provider/handler.h",
      "lib/trace-provider/provider.h",
    ]
    forward_variables_from(invoker, "*")

    if (defined(extra_configs)) {
      configs += extra_configs
    }

    # Not including fdio_connect.h.
    if (!defined(sdk_headers)) {
      sdk_headers = []
    }
    sdk_headers += [
      "lib/trace-provider/handler.h",
      "lib/trace-provider/provider.h",
    ]

    # Header dependencies, not including the trace engine.
    # <trace-provider/handler.h> has #include <trace-engine/handler.h>.
    if (!defined(public_deps)) {
      public_deps = []
    }
    public_deps += [
      # <trace-provider/provider.h> has #include <lib/async/dispatcher.h>.
      "//zircon/system/ulib/async",

      # <trace-provider/provider.h> has #include <lib/zx/channel.h>.
      "//zircon/system/ulib/zx",
    ]

    if (!defined(sources)) {
      sources = []
    }
    sources += [
      "export.h",
      "fnv1hash.h",
      "handler.cc",
      "provider_impl.cc",
      "provider_impl.h",
      "session.cc",
      "session.h",
      "utils.cc",
      "utils.h",
    ]

    # Source dependencies, not including the trace engine.
    if (!defined(deps)) {
      deps = []
    }
    deps += [
      "//sdk/fidl/fuchsia.tracing.provider:fuchsia.tracing.provider_cpp",
      "//sdk/lib/fidl",
      "//sdk/lib/fidl_base",
      "//zircon/system/ulib/async:async-cpp",
      "//zircon/system/ulib/zx",
    ]
  }
}

trace_provider_fdio_connect_sources = [
  "export.h",
  "fdio_connect.cc",
]

trace_provider_fdio_sources = [
  "fdio_connect.cc",
  "provider_with_fdio.cc",
]

trace_provider_fdio_connect_source_deps = [
  "//sdk/lib/fdio",
  "//zircon/system/ulib/zx",
]

trace_provider_fdio_connect_headers = [ "lib/trace-provider/fdio_connect.h" ]

# The default version for the normal case.
trace_provider_library("trace-provider") {
  sdk = "source"
  sdk_headers = trace_provider_fdio_connect_headers
  public_deps = [ "//zircon/system/ulib/trace-engine" ]
  sources = trace_provider_fdio_sources
  sources += [ "start.cc" ]
  deps = trace_provider_fdio_connect_source_deps
  deps += [
    "//zircon/system/ulib/async-loop",
    "//zircon/system/ulib/async-loop:async-loop-cpp",
    "//zircon/system/ulib/async-loop:async-loop-default",
    "//zircon/system/ulib/sync",
    "//zircon/system/ulib/trace",
    "//zircon/system/ulib/trace-engine",
  ]
}

# Shared version for the SDK.
# The issue is that the SDK doesn't (yet) support generating C FIDL bindings at
# build time, which we need if we export as "source", and since we're
# implemented in C++ we can't export as "static".
# TODO(https://fxbug.dev/42097127): The name here is temporary, pending being able to build
# the library as "libtrace-provider.so".
#
# TODO(https://fxbug.dev/42096938): Add start.cc to this library in order to match the
# non-shared version of the library.
trace_provider_library("trace-provider-so") {
  sdk_publishable = "partner"
  sdk = "shared"

  defines = [ "SHARED_LIBRARY" ]
  sdk_headers = trace_provider_fdio_connect_headers
  public_deps = [ "//zircon/system/ulib/trace-engine" ]
  sources = trace_provider_fdio_sources
  deps = trace_provider_fdio_connect_source_deps
  deps += [ "//zircon/system/ulib/trace-engine" ]
  runtime_deps = [ "//sdk/lib/fdio:fdio_sdk" ]
}

# A special version for programs and shared libraries that can't use
# libtrace-engine.so, e.g., because it is unavailable.
# N.B. Please verify that you really need this before using it.
# Generally you DO NOT want to use this.
trace_provider_library("trace-provider-with-static-engine") {
  sdk = "static"
  sdk_headers = trace_provider_fdio_connect_headers
  public_deps = [ "//zircon/system/ulib/trace-engine:trace-engine-static" ]
  sources = []
  deps = []
  deps += [ "//zircon/system/ulib/trace-engine:trace-engine-static" ]

  # This is used by magma client drivers, so it can't depend on fdio (or other shared libraries
  # besides libc).
  assert_no_deps = [
    "//sdk/lib/fdio",
    "//zircon/system/ulib/async-default",
  ]
}

# For apps that use the trace engine, but not via a trace provider.
# These are usually test and benchmarking apps.
# Normal apps are not expected to use this.
zx_library("trace-handler") {
  sdk = "static"
  sdk_headers = [ "lib/trace-provider/handler.h" ]
  public_deps = [
    # It is up to the client to choose which engine (shared, static),
    # just reference the headers here.
    "//zircon/system/ulib/trace-engine:trace-engine-headersonly",
  ]
  sources = [ "handler.cc" ]
}

# A helper library for clients that want to use fdio to connect to
# trace manager, outside of the regular libraries.
# This is for special cases where the client is choosing its engine separately.
zx_library("trace-provider-fdio-connect") {
  sdk = "static"
  sdk_headers = trace_provider_fdio_connect_headers
  sources = trace_provider_fdio_connect_sources
  deps = trace_provider_fdio_connect_source_deps
}

group("tests") {
  testonly = true
  deps = [ "test:tests" ]
}
