# Copyright 2018 The Chromium 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_overrides/build.gni")

if (build_with_chromium) {
  visibility = [
    "//libassistant/*",
    "//third_party/webrtc/*",
    "//third_party/abseil-cpp/*",
    "//third_party/googletest:gtest",
  ]
} else {
  visibility = [ "*" ]
}

source_set("spinlock_wait") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "internal/spinlock_akaros.inc",
    "internal/spinlock_linux.inc",
    "internal/spinlock_posix.inc",
    "internal/spinlock_wait.cc",
    "internal/spinlock_win32.inc",
  ]
  public = [
    "internal/scheduling_mode.h",
    "internal/spinlock_wait.h",
  ]
  deps = [
    ":core_headers",
  ]
  visibility = []
  visibility += [ "../base:*" ]
}

source_set("config") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  public = [
    "config.h",
    "policy_checks.h",
  ]
}

config("clang_support_dynamic_annotations") {
  cflags_cc = [ "-D__CLANG_SUPPORT_DYN_ANNOTATION__" ]
}

source_set("dynamic_annotations") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [
    ":clang_support_dynamic_annotations",
    "//third_party/abseil-cpp:absl_include_config",
  ]
  sources = [
    "dynamic_annotations.cc",
  ]
  public = [
    "dynamic_annotations.h",
  ]

  # Abseil's dynamic annotations are only visible inside Abseil because
  # their usage is deprecated in Chromium (see README.chromium for more info).
  visibility = []
  visibility = [ "../*" ]
}

source_set("core_headers") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  public = [
    "attributes.h",
    "const_init.h",
    "macros.h",
    "optimization.h",
    "port.h",
    "thread_annotations.h",
  ]
  deps = [
    ":config",
  ]
}

source_set("malloc_internal") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "internal/low_level_alloc.cc",
  ]
  public = [
    "internal/direct_mmap.h",
    "internal/low_level_alloc.h",
  ]
  deps = [
    ":base",
    ":config",
    ":core_headers",
    ":dynamic_annotations",
    ":spinlock_wait",
  ]
  visibility = []
  visibility += [ "../*" ]
}

source_set("base_internal") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  public = [
    "internal/hide_ptr.h",
    "internal/identity.h",
    "internal/inline_variable.h",
    "internal/invoke.h",
    "internal/scheduling_mode.h",
  ]
  visibility = []
  visibility += [ "../*" ]
}

source_set("base") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "internal/cycleclock.cc",
    "internal/raw_logging.cc",
    "internal/spinlock.cc",
    "internal/sysinfo.cc",
    "internal/thread_identity.cc",
    "internal/unscaledcycleclock.cc",
    "log_severity.cc",
  ]
  public = [
    "call_once.h",
    "casts.h",
    "internal/atomic_hook.h",
    "internal/cycleclock.h",
    "internal/low_level_scheduling.h",
    "internal/per_thread_tls.h",
    "internal/raw_logging.h",
    "internal/spinlock.h",
    "internal/sysinfo.h",
    "internal/thread_identity.h",
    "internal/tsan_mutex_interface.h",
    "internal/unscaledcycleclock.h",
    "log_severity.h",
  ]
  deps = [
    ":base_internal",
    ":config",
    ":core_headers",
    ":dynamic_annotations",
    ":spinlock_wait",
    "../meta:type_traits",
  ]
}

source_set("throw_delegate") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "internal/throw_delegate.cc",
  ]
  public = [
    "internal/throw_delegate.h",
  ]
  deps = [
    ":base",
    ":config",
  ]
  visibility = []
  visibility += [ "../*" ]
}

source_set("exception_testing") {
  testonly = true
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_test_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  public = [
    "internal/exception_testing.h",
  ]
  deps = [
    ":config",
  ]
  visibility = []
  visibility += [ "../*" ]
}

source_set("pretty_function") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  public = [
    "internal/pretty_function.h",
  ]
  visibility = []
  visibility += [ "../*" ]
}

# TODO(mbonadei): This target throws by design. We should probably
# just remove it.
# source_set("exception_safety_testing") {
#   testonly = true
#   configs -= [ "//build/config/compiler:chromium_code" ]
#   configs += [
#     "//build/config/compiler:no_chromium_code",
#     "//third_party/abseil-cpp:absl_test_cflags_cc",
#   ]
#   public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
#   sources = [
#     "internal/exception_safety_testing.cc",
#   ]
#   public = [
#     "internal/exception_safety_testing.h",
#   ]
#   deps = [
#     ":config",
#     ":pretty_function",
#     "../memory",
#     "../meta:type_traits",
#     "../strings",
#     "../utility",
#     "//testing/gtest",
#   ]
# }

source_set("spinlock_test_common") {
  testonly = true
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_test_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  sources = [
    "spinlock_test_common.cc",
  ]
  deps = [
    ":base",
    ":core_headers",
    ":spinlock_wait",
    "../synchronization",
    "//testing/gtest",
  ]
}

source_set("endian") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public_configs = [ "//third_party/abseil-cpp:absl_include_config" ]
  public = [
    "internal/endian.h",
    "internal/unaligned_access.h",
  ]
  deps = [
    ":config",
    ":core_headers",
  ]
}

source_set("bits") {
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public = [
    "internal/bits.h",
  ]
  deps = [
    ":core_headers",
  ]
  visibility = []
  visibility += [ "../*" ]
}

source_set("scoped_set_env") {
  testonly = true
  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",
    "//third_party/abseil-cpp:absl_default_cflags_cc",
  ]
  public = [
    "internal/scoped_set_env.h",
  ]
  sources = [
    "internal/scoped_set_env.cc",
  ]
  deps = [
    ":base",
  ]
  visibility = []
  visibility += [ "../*" ]
}
