# Copyright 2018 The Chromium Authors
# 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/compiler/compiler.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" ]
}

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

    if (is_win && is_clang) {
      file = "symbols_${current_cpu}"
      if (is_debug) {
        file = "${file}_dbg"
      } else {
        file = "${file}_rel"
      }
      if (!is_debug && current_cpu == "x64" && is_asan) {
        file = "${file}_asan"
      }
      if (use_cxx23) {
        file = "${file}_cxx23"
      }
      file = "${file}.def"
      sources = [ file ]
    }
  }
  if (is_win) {
    all_dependent_configs = [ "//tools/win/DebugVisualizers:absl" ]
    inputs = [
      # absl.natvis listed as an input here instead of in
      # //tools/win/DebugVisualizers:absl to prevent unnecessary size increase
      # in generated build files.
      "//tools/win/DebugVisualizers/absl.natvis",
    ]
  }
}

group("absl_component_deps") {
  public_deps = [
    "//third_party/abseil-cpp/absl/algorithm",
    "//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/base:fast_type_id",
    "//third_party/abseil-cpp/absl/base:log_severity",
    "//third_party/abseil-cpp/absl/base:no_destructor",
    "//third_party/abseil-cpp/absl/base:nullability",
    "//third_party/abseil-cpp/absl/base:prefetch",
    "//third_party/abseil-cpp/absl/base:throw_delegate",
    "//third_party/abseil-cpp/absl/cleanup",
    "//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:hash_container_defaults",
    "//third_party/abseil-cpp/absl/container:inlined_vector",
    "//third_party/abseil-cpp/absl/container:linked_hash_map",
    "//third_party/abseil-cpp/absl/container:linked_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/crc:crc32c",
    "//third_party/abseil-cpp/absl/debugging:failure_signal_handler",
    "//third_party/abseil-cpp/absl/debugging:leak_check",
    "//third_party/abseil-cpp/absl/debugging:stacktrace",
    "//third_party/abseil-cpp/absl/debugging:symbolize",
    "//third_party/abseil-cpp/absl/functional:any_invocable",
    "//third_party/abseil-cpp/absl/functional:bind_front",
    "//third_party/abseil-cpp/absl/functional:function_ref",
    "//third_party/abseil-cpp/absl/functional:overload",
    "//third_party/abseil-cpp/absl/hash",
    "//third_party/abseil-cpp/absl/log:absl_check",
    "//third_party/abseil-cpp/absl/log:absl_log",
    "//third_party/abseil-cpp/absl/log:absl_vlog_is_on",
    "//third_party/abseil-cpp/absl/log:die_if_null",
    "//third_party/abseil-cpp/absl/log:globals",
    "//third_party/abseil-cpp/absl/log:initialize",
    "//third_party/abseil-cpp/absl/log:log_entry",
    "//third_party/abseil-cpp/absl/log:log_sink",
    "//third_party/abseil-cpp/absl/log:log_sink_registry",
    "//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/random:bit_gen_ref",
    "//third_party/abseil-cpp/absl/random:distributions",
    "//third_party/abseil-cpp/absl/random:mocking_access",
    "//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:charset",
    "//third_party/abseil-cpp/absl/strings:cord",
    "//third_party/abseil-cpp/absl/strings:has_ostream_operator",
    "//third_party/abseil-cpp/absl/strings:str_format",
    "//third_party/abseil-cpp/absl/strings:string_view",
    "//third_party/abseil-cpp/absl/synchronization",
    "//third_party/abseil-cpp/absl/time",
    "//third_party/abseil-cpp/absl/time:clock_interface",
    "//third_party/abseil-cpp/absl/types:any_span",
    "//third_party/abseil-cpp/absl/types:optional",
    "//third_party/abseil-cpp/absl/types:optional_ref",
    "//third_party/abseil-cpp/absl/types:source_location",
    "//third_party/abseil-cpp/absl/types:span",
    "//third_party/abseil-cpp/absl/types:variant",
    "//third_party/abseil-cpp/absl/utility",
  ]

  # Dependencies that preferably shouldn't be public in chromium.
  public_deps += [
    # public in abseil, but deprecated in chromium, yet used.
    "//third_party/abseil-cpp/absl/base:dynamic_annotations",

    # base/logging.cc uses this non-public absl dependency while there no better
    # alternative to inject abort hook. See notes in `base/logging.cc`.
    "//third_party/abseil-cpp/absl/base:raw_logging_internal",

    # absl internal utilities used by protobuf.
    "//third_party/abseil-cpp/absl/container:layout",
  ]

  if (is_component_build) {
    public_deps += [ ":absl_full_deps" ]
  }

  visibility = [ ":absl" ]
}

# Abseil testing utilities should only be included in test binaries.
source_set("test_support") {
  testonly = true
  public_deps = [ "//third_party/abseil-cpp/absl/hash:hash_testing" ]
  deps = [ ":absl" ]
}

# Some third-party libraries use additional parts of absl that are banned in
# Chrome (e.g. flags generates static initializers that are undesirable in
# non-test binaries). These third-party libraries can depend on `absl_full`
# instead of `absl` to use those banned subsets of Abseil as well.
source_set("absl_full") {
  public_deps = [ ":absl" ]

  # In component builds, `absl` itself depends on `absl_full_deps` directly so
  # that all of absl is built as a single shared library. This is to prevent
  # globals from being duplicated between both `absl` and `absl_full` (e.g.
  # inline variables), and the subtle breakage that could cause.
  #
  # Deps violations will still be enforced by the non-component build.
  if (!is_component_build) {
    public_deps += [ ":absl_full_deps" ]
  }

  if (build_with_chromium) {
    visibility = [
      # Used by some test executables, but not by anything that is a
      # part of Chrome.
      "//components/optimization_guide/internal/*",
      "//third_party/fuzztest:*",
      "//third_party/webrtc/*",

      # GoogleTest doesn't actually need absl_full, but this makes gn check
      # happier.
      "//third_party/googletest:*",
    ]
  }
}

group("absl_full_deps") {
  public_deps = [
    # Banned because each flag registration generates a static initializer, and
    # the flag registration mechanism is problematic in component builds.
    "//third_party/abseil-cpp/absl/flags:config",
    "//third_party/abseil-cpp/absl/flags:flag",
    "//third_party/abseil-cpp/absl/flags:marshalling",
    "//third_party/abseil-cpp/absl/flags:parse",
    "//third_party/abseil-cpp/absl/flags:reflection",
    "//third_party/abseil-cpp/absl/flags:usage",

    # Banned because the LOG and CHECK macros conflict with Chrome's version of
    # those macros.
    "//third_party/abseil-cpp/absl/log",
    "//third_party/abseil-cpp/absl/log:check",
  ]

  visibility = [
    ":absl_component_deps",
    ":absl_full",
  ]

  public_configs = [ "//third_party/abseil-cpp/absl/flags:absl_flags_config" ]
}

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",
      "-Wstring-conversion",
      "-Wbitfield-enum-conversion",
    ]
  }
}

config("absl_test_config") {
  cflags_cc = []
  if (is_win && !is_clang) {
    cflags_cc += [ "/wd4996" ]
  }
  if (is_clang) {
    cflags_cc += [
      "-Wno-deprecated-declarations",
      "-Wno-implicit-const-int-float-conversion",
      "-Wno-unused-private-field",
      "-Wno-unused-function",
    ]
  }
}

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

  if (!is_component_build) {
    test("absl_tests") {
      testonly = true
      deps = [
        "absl/algorithm:algorithm_test",
        "absl/algorithm:container_test",
        "absl/base:attributes_test",
        "absl/base:casts_test",
        "absl/base:config_test",
        "absl/base:hardening_test",
        "absl/base:iterator_traits_test",
        "absl/base:no_destructor_test",
        "absl/base:nullability_default_nonnull_test",
        "absl/base:nullability_test",
        "absl/base:nullability_traits_test",
        "absl/base:optimization_test",
        "absl/base:poison_test",
        "absl/base:prefetch_test",
        "absl/base:raw_logging_test",
        "absl/base:sysinfo_test",
        "absl/base:thread_identity_test",
        "absl/base:tracing_internal_strong_test",
        "absl/base:tracing_internal_weak_test",
        "absl/cleanup:cleanup_test",
        "absl/container:chunked_queue_test",
        "absl/container:common_policy_traits_test",
        "absl/container:compressed_tuple_test",
        "absl/container:fixed_array_test",
        "absl/container:flat_hash_map_test",
        "absl/container:flat_hash_set_test",
        "absl/container:hash_function_defaults_test",
        "absl/container:inlined_vector_test",
        "absl/container:linked_hash_map_test",
        "absl/container:linked_hash_set_test",
        "absl/container:node_hash_map_test",
        "absl/container:node_hash_set_test",
        "absl/container:node_slot_policy_test",
        "absl/container:raw_hash_set_allocator_test",
        "absl/container:raw_hash_set_resize_impl_test",
        "absl/container:sample_element_size_test",
        "absl/crc:crc32c_test",
        "absl/crc:crc_cord_state_test",
        "absl/crc:crc_memcpy_test",
        "absl/crc:non_temporal_memcpy_test",
        "absl/debugging:bounded_utf8_length_sequence_test",
        "absl/debugging:decode_rust_punycode_test",
        "absl/debugging:demangle_rust_test",
        "absl/debugging:stacktrace_test",
        "absl/debugging:utf8_for_code_point_test",
        "absl/flags:flag_test",
        "absl/functional:any_invocable_test",
        "absl/functional:function_ref_test",
        "absl/functional:overload_test",
        "absl/hash:hash_instantiated_test",
        "absl/hash:hash_test",
        "absl/hash:low_level_hash_test",
        "absl/log:absl_check_test",
        "absl/log:absl_log_basic_test",
        "absl/log:die_if_null_test",
        "absl/log:flags_test",
        "absl/log:globals_test",
        "absl/log:log_entry_test",
        "absl/log:log_format_test",
        "absl/log:log_macro_hygiene_test",
        "absl/log:log_modifier_methods_test",
        "absl/log:log_sink_test",
        "absl/log:log_streamer_test",
        "absl/log:scoped_mock_log_test",
        "absl/log:stripping_test",
        "absl/log:vlog_is_on_test",
        "absl/log/internal:container_test",
        "absl/log/internal:fnmatch_test",
        "absl/log/internal:stderr_log_sink_test",
        "absl/log/internal:structured_proto_test",
        "absl/memory:memory_test",
        "absl/meta:constexpr_testing_test",
        "absl/meta:requires_test",
        "absl/meta:type_traits_test",
        "absl/numeric:int128_test",
        "absl/profiling:exponential_biased_test",
        "absl/profiling:periodic_sampler_test",
        "absl/random:distributions_test",
        "absl/random:mock_distributions_test",
        "absl/random/internal:nonsecure_base_test",
        "absl/status:status_matchers_test",
        "absl/status:status_test",
        "absl/status:statusor_test",
        "absl/strings:append_and_overwrite_test",
        "absl/strings:ascii_test",
        "absl/strings:char_formatting_test",
        "absl/strings:charset_test",
        "absl/strings:cord_buffer_test",
        "absl/strings:cord_data_edge_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_crc_test",
        "absl/strings:cord_test",
        "absl/strings:cordz_functions_test",
        "absl/strings:cordz_handle_test",
        "absl/strings:cordz_info_statistics_test",
        "absl/strings:cordz_info_test",
        "absl/strings:cordz_sample_token_test",
        "absl/strings:cordz_test",
        "absl/strings:cordz_update_scope_test",
        "absl/strings:cordz_update_tracker_test",
        "absl/strings:damerau_levenshtein_distance_test",
        "absl/strings:generic_printer_test",
        "absl/strings:has_absl_stringify_test",
        "absl/strings:has_ostream_operator_test",
        "absl/strings:match_test",
        "absl/strings:resize_and_overwrite_test",
        "absl/strings:str_cat_test",
        "absl/strings:str_format_arg_test",
        "absl/strings:str_format_bind_test",
        "absl/strings:str_format_checker_test",
        "absl/strings:str_format_convert_test",
        "absl/strings:str_format_extension_test",
        "absl/strings:str_format_output_test",
        "absl/strings:str_format_parser_test",
        "absl/strings:str_format_test",
        "absl/strings:str_replace_test",
        "absl/strings:str_split_test",
        "absl/strings:string_view_test",
        "absl/strings:stringify_stream_test",
        "absl/synchronization:barrier_test",
        "absl/synchronization:graphcycles_test",
        "absl/synchronization:kernel_timeout_internal_test",
        "absl/synchronization:mutex_test",
        "absl/synchronization:per_thread_sem_test",
        "absl/synchronization:waiter_test",
        "absl/time:clock_interface_test",
        "absl/time:simulated_clock_test",
        "absl/time:time_test",
        "absl/types:optional_ref_test",
        "absl/types:source_location_test",
        "absl/types:span_test",
        "absl/types:variant_test",
        "//third_party/googletest:gtest_main",
      ]
    }
  }

  test("absl_hardening_tests") {
    testonly = true
    sources = [ "absl_hardening_test.cc" ]
    deps = [
      ":absl",
      "//base/test:run_all_unittests",
      "//third_party/googletest:gtest",
    ]
  }
}
