# Copyright (c) 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.

# Flags specified here must not impact ABI. Code compiled with and without these
# opts will be linked together, and in some cases headers compiled with and
# without these options will be part of the same program.

import("//build/config/c++/c++.gni")
import("//build/config/nacl/config.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/toolchain/toolchain.gni")
import("//build_overrides/build.gni")
import("//third_party/abseil-cpp/absl.gni")

config("absl_component_build") {
  defines = [ "ABSL_CONSUME_DLL" ]
}

assert(!is_nacl || is_nacl_saigo,
       "base must not be built in most nacl toolchains")

component("absl") {
  public_deps = [ ":absl_component_deps" ]
  if (is_component_build) {
    public_configs = [ ":absl_component_build" ]

    if (is_win && is_clang) {
      if (current_cpu == "x64") {
        if (is_debug) {
          sources = [ "symbols_x64_dbg.def" ]
        } else {
          if (is_asan) {
            sources = [ "symbols_x64_rel_asan.def" ]
          } else {
            sources = [ "symbols_x64_rel.def" ]
          }
        }
      }
      if (current_cpu == "x86") {
        if (is_debug) {
          sources = [ "symbols_x86_dbg.def" ]
        } else {
          sources = [ "symbols_x86_rel.def" ]
        }
      }
      if (current_cpu == "arm64") {
        if (is_debug) {
          sources = [ "symbols_arm64_dbg.def" ]
        } else {
          sources = [ "symbols_arm64_rel.def" ]
        }
      }
    }
  }
}

group("absl_component_deps") {
  public_deps = [
    "//third_party/abseil-cpp/absl/algorithm:container",
    "//third_party/abseil-cpp/absl/base",
    "//third_party/abseil-cpp/absl/base:config",
    "//third_party/abseil-cpp/absl/base:core_headers",
    "//third_party/abseil-cpp/absl/container:btree",
    "//third_party/abseil-cpp/absl/container:fixed_array",
    "//third_party/abseil-cpp/absl/container:flat_hash_map",
    "//third_party/abseil-cpp/absl/container:flat_hash_set",
    "//third_party/abseil-cpp/absl/container:inlined_vector",
    "//third_party/abseil-cpp/absl/container:node_hash_map",
    "//third_party/abseil-cpp/absl/container:node_hash_set",
    "//third_party/abseil-cpp/absl/debugging:failure_signal_handler",
    "//third_party/abseil-cpp/absl/debugging:stacktrace",
    "//third_party/abseil-cpp/absl/debugging:symbolize",
    "//third_party/abseil-cpp/absl/functional:bind_front",
    "//third_party/abseil-cpp/absl/hash",
    "//third_party/abseil-cpp/absl/memory",
    "//third_party/abseil-cpp/absl/meta:type_traits",
    "//third_party/abseil-cpp/absl/numeric:bits",
    "//third_party/abseil-cpp/absl/numeric:int128",
    "//third_party/abseil-cpp/absl/random",
    "//third_party/abseil-cpp/absl/status",
    "//third_party/abseil-cpp/absl/status:statusor",
    "//third_party/abseil-cpp/absl/strings",
    "//third_party/abseil-cpp/absl/strings:cord",
    "//third_party/abseil-cpp/absl/strings:str_format",
    "//third_party/abseil-cpp/absl/synchronization",
    "//third_party/abseil-cpp/absl/time",
    "//third_party/abseil-cpp/absl/types:optional",
    "//third_party/abseil-cpp/absl/types:span",
    "//third_party/abseil-cpp/absl/types:variant",
  ]

  # The following dependencies currently don't build with NaCl.
  # TODO(https://crbug.com/1114625): Fix build errors and remove this section.
  if (is_nacl) {
    public_deps -= [
      "//third_party/abseil-cpp/absl/container:flat_hash_map",
      "//third_party/abseil-cpp/absl/container:flat_hash_set",
      "//third_party/abseil-cpp/absl/container:node_hash_map",
      "//third_party/abseil-cpp/absl/container:node_hash_set",
      "//third_party/abseil-cpp/absl/debugging:failure_signal_handler",
    ]
  }

  visibility = [ ":absl" ]
}

group("default") {
  deps = [
    "absl/types:any",
    "absl/types:bad_any_cast",
    "absl/types:bad_optional_access",
    "absl/types:optional",
    "absl/types:span",
  ]
}

config("absl_include_config") {
  include_dirs = [ "." ]
}

config("absl_define_config") {
  defines = [ "ABSL_ALLOCATOR_NOTHROW=1" ]

  if (is_win && !use_custom_libcxx) {
    defines += [
      # See crbug.com/1101367: Acknowledge extended alignment when using
      # MSVC's standard library.
      "_ENABLE_EXTENDED_ALIGNED_STORAGE",
    ]
  }
}

config("absl_default_cflags_cc") {
  cflags_cc = []
  if (is_clang) {
    cflags_cc += [
      # TODO(crbug.com/588506): Explicitly enable conversion warnings.
      "-Wbool-conversion",
      "-Wconstant-conversion",
      "-Wenum-conversion",
      "-Wint-conversion",
      "-Wliteral-conversion",
      "-Wnon-literal-null-conversion",
      "-Wnull-conversion",
      "-Wobjc-literal-conversion",
      "-Wno-sign-conversion",
      "-Wstring-conversion",
    ]
    if (!is_nacl) {
      cflags_cc += [ "-Wbitfield-enum-conversion" ]
    }
  }
}

config("absl_test_cflags_cc") {
  cflags_cc = []
  if (is_clang || !is_win) {
    cflags_cc += [
      "-Wno-conversion-null",
      "-Wno-missing-declarations",
      "-Wno-sign-compare",
      "-Wno-unused-function",
      "-Wno-unused-parameter",
      "-Wno-unused-private-field",
    ]
  }
  if (is_win) {
    cflags_cc += [
      "/wd4018",  # signed/unsigned mismatch
      "/wd4101",  # unreferenced local variable
    ]
  }
}

if (build_with_chromium) {
  import("//testing/test.gni")

  if (!is_component_build) {
    test("absl_tests") {
      testonly = true
      deps = [
        "absl/algorithm:algorithm_test",
        "absl/algorithm:container_test",
        "absl/base:config_test",
        "absl/cleanup:cleanup_test",
        "absl/container:inlined_vector_test",
        "absl/container:node_slot_policy_test",
        "absl/container:sample_element_size_test",
        "absl/hash:low_level_hash_test",
        "absl/memory:memory_test",
        "absl/meta:type_traits_test",
        "absl/profiling:exponential_biased_test",
        "absl/profiling:periodic_sampler_test",
        "absl/status:statusor_test",
        "absl/strings:ascii_test",
        "absl/strings:cord_rep_btree_navigator_test",
        "absl/strings:cord_rep_btree_reader_test",
        "absl/strings:cord_rep_btree_test",
        "absl/strings:cord_rep_concat_test",
        "absl/strings:cord_rep_consume_test",
        "absl/strings:cord_rep_crc_test",
        "absl/strings:cordz_functions_test",
        "absl/strings:cordz_info_statistics_test",
        "absl/strings:cordz_info_test",
        "absl/strings:cordz_test",
        "absl/strings:cordz_update_scope_test",
        "absl/strings:cordz_update_tracker_test",
        "absl/strings:match_test",
        "absl/strings:str_replace_test",
        "absl/strings:string_view_test",
        "absl/types:optional_test",
        "absl/types:variant_test",
        "//third_party/googletest:gtest_main",
      ]
    }
  }

  test("absl_hardening_tests") {
    testonly = true
    sources = [ "absl_hardening_test.cc" ]
    deps = [
      "//base/test:run_all_unittests",
      "//third_party/abseil-cpp/absl/base:config",
      "//third_party/abseil-cpp/absl/container:fixed_array",
      "//third_party/abseil-cpp/absl/container:inlined_vector",
      "//third_party/abseil-cpp/absl/strings",
      "//third_party/abseil-cpp/absl/types:optional",
      "//third_party/abseil-cpp/absl/types:span",
      "//third_party/abseil-cpp/absl/types:variant",
      "//third_party/googletest:gtest",
    ]
  }
}