# 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 = [
    "//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_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",
    "macros.h",
    "optimization.h",
    "port.h",
    "thread_annotations.h",
  ]
  deps = [
    ":config",
    ":dynamic_annotations",
  ]
}

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",
  ]
  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",
  ]
  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",
  ]
}

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",
    ":core_headers",
  ]
  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 = [
#     ":base",
#     ":config",
#     ":pretty_function",
#     "../memory",
#     "../meta:type_traits",
#     "../strings",
#     "../types:optional",
#     "//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",
  ]
}
