# 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/config/sanitizers/sanitizers.gni")
import("//build_overrides/build.gni")

# Usage of Abseil in Chromium is guarded by an explicit opt-in list, before
# adding projects to this list please reach out to cxx@chromium.org and CC:
# - https://cs.chromium.org/chromium/src/third_party/abseil-cpp/OWNERS
#
# More information can be found at:
# https://docs.google.com/document/d/1DgS1-A3rzboTLjpf4m1sqkJgWjnY_Ru2dokk1X1vBDU
if (build_with_chromium) {
  visibility = [
    "//libassistant/*",
    "//third_party/webrtc/*",
    "//third_party/abseil-cpp/*",
    "//third_party/googletest:gtest",
  ]
} else {
  visibility = [ "*" ]
}

source_set("stacktrace") {
  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 = [
    "stacktrace.cc",
  ]
  public = [
    "stacktrace.h",
  ]
  deps = [
    ":debugging_internal",
    "../base",
    "../base:core_headers",
  ]
}

source_set("symbolize") {
  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 = [
    "symbolize.cc",
    "symbolize_elf.inc",
    "symbolize_unimplemented.inc",
    "symbolize_win32.inc",
  ]
  public = [
    "internal/symbolize.h",
    "symbolize.h",
  ]
  deps = [
    ":debugging_internal",
    ":demangle_internal",
    "../base",
    "../base:core_headers",
    "../base:malloc_internal",
  ]
}

source_set("examine_stack") {
  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/examine_stack.cc",
  ]
  public = [
    "internal/examine_stack.h",
  ]
  visibility = []
  visibility += [ ":*" ]
  deps = [
    ":stacktrace",
    ":symbolize",
    "../base",
    "../base:core_headers",
  ]
}

source_set("failure_signal_handler") {
  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 = [
    "failure_signal_handler.cc",
  ]
  public = [
    "failure_signal_handler.h",
  ]
  deps = [
    ":examine_stack",
    ":stacktrace",
    "../base",
    "../base:config",
    "../base:core_headers",
  ]
}

source_set("debugging_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/address_is_readable.cc",
    "internal/elf_mem_image.cc",
    "internal/vdso_support.cc",
  ]
  public = [
    "internal/address_is_readable.h",
    "internal/elf_mem_image.h",
    "internal/stacktrace_config.h",
    "internal/vdso_support.h",
  ]
  deps = [
    "../base",
    "../base:core_headers",
    "../base:dynamic_annotations",
  ]
}

source_set("demangle_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/demangle.cc",
  ]
  public = [
    "internal/demangle.h",
  ]
  deps = [
    "../base",
    "../base:core_headers",
  ]
}

source_set("leak_check") {
  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" ]
  if (is_ios || is_win) {
    sources = []
    public = []
  } else {
    sources = [
      "leak_check.cc",
    ]
    public = [
      "leak_check.h",
    ]
  }
  deps = [
    "../base:core_headers",
  ]
}

source_set("leak_check_disable") {
  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 = [
    "leak_check_disable.cc",
  ]
}

if (is_lsan) {
  source_set("leak_check_api_enabled_for_testing") {
    testonly = true
    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 = [
      "leak_check.cc",
    ]
    public = [
      "leak_check.h",
    ]
    visibility = []
    visibility += [ ":*" ]
  }
} else {
  source_set("leak_check_api_disabled_for_testing") {
    testonly = true
    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 = [
      "leak_check.cc",
    ]
    public = [
      "leak_check.h",
    ]
    visibility = []
    visibility += [ ":*" ]
  }
}

source_set("stack_consumption") {
  testonly = true
  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/stack_consumption.cc",
  ]
  public = [
    "internal/stack_consumption.h",
  ]
  deps = [
    "../base",
    "../base:core_headers",
  ]
  visibility = []
  visibility += [ ":*" ]
}
