# 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/cpp/sdk_source_set.gni")
import("//build/fidl/args.gni")
import("//build/zircon/migrated_targets.gni")

config("fidl-tracing-config") {
  defines = [ "FIDL_TRACE_LEVEL=$fidl_trace_level" ]
}

# Base library used by both Fuchsia and host
#
# "fidl_base" and "fidl" are used in low-level contexts such as early system
# boot, hence cannot depend on the C++ standard library, and must only introduce
# minimal symbols into dependent targets. As such, these libraries need to be
# static libraries rather than source sets, as we need the Unix librarian
# algorithm to apply so that only object files corresponding to the used
# functions will be linked to the final binary.
sdk_source_set("fidl_base") {
  category = "partner"
  api = "//sdk/lib/fidl_base/fidl_base.api"
  sdk_name = "fidl_base"

  # TODO(fxbug.dev/90775): We should represent the library as a
  # `sdk_static_library` when supported.
  build_as_static = true

  public = [
    "include/lib/fidl/coding.h",
    "include/lib/fidl/cpp/transaction_header.h",
    "include/lib/fidl/cpp/wire_format_metadata.h",
    "include/lib/fidl/internal.h",
    "include/lib/fidl/internal_callable_traits.h",
    "include/lib/fidl/trace.h",
    "include/lib/fidl/txn_header.h",
    "include/lib/fidl/visitor.h",
    "include/lib/fidl/walker.h",
  ]

  sources = [
    "decoding_and_validating.cc",
    "encoding.cc",
    "formatting.cc",
    "handle_close_many.cc",
    "internal.c",
    "txn_header.c",
    "validate_string.cc",
    "wire_format_metadata.cc",
  ]

  deps = [
    "//sdk/lib/fit",
    "//sdk/lib/stdcompat",
  ]

  public_deps = [ "//src/zircon/lib/zircon" ]

  # TODO(fxbug.dev/101752): GN check fails without this condition.
  if (zircon_toolchain != false) {
    public_deps += [ "//zircon/system/public" ]
  }

  public_configs = [ ":fidl_base.headers" ]

  all_dependent_configs = [ ":fidl-tracing-config" ]

  if (is_fuchsia) {
    configs += [ "//build/config/fuchsia:no_cpp_standard_library" ]
  }
}

config("fidl_base.headers") {
  include_dirs = [ "include" ]
}

sdk_source_set("fidl") {
  category = "partner"
  api = "//sdk/lib/fidl/fidl.api"
  sdk_name = "fidl"

  # TODO(fxbug.dev/90775): We should represent the library as a
  # `sdk_static_library` when supported.
  build_as_static = true

  public = [ "include/lib/fidl/epitaph.h" ]

  sources = [ "epitaph.c" ]

  deps = [ ":fidl_base" ]

  public_deps = [
    ":fidl_base",
    "//src/zircon/lib/zircon",
  ]

  # TODO(fxbug.dev/101752): GN check fails without this condition.
  if (zircon_toolchain != false) {
    public_deps += [ "//zircon/system/public" ]
  }

  public_configs = [ ":fidl.headers" ]
}

config("fidl.headers") {
  include_dirs = [ "include" ]
}
