910e62b5创建于 1月15日历史提交
# 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/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: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: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/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/types:optional",
    "//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: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: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:common_policy_traits_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: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:fnmatch_test",
        "absl/log/internal:stderr_log_sink_test",
        "absl/log/internal:structured_proto_test",
        "absl/memory:memory_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: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:string_view_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:time_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",
    ]
  }
}