# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

# This file contains the definition of the template absl_source_set which
# should be the only type of target needed in abseil's BUILD.gn files.
# This template will correctly set "configs" and "public_configs" in order
# to correctly compile abseil in Chromium.
#
# Usage:
# Most of the times its usage will be similar to the example below but all
# the arguments avilable in source_set are also available for absl_source_set.
#
#  absl_source_set("foo") {
#    sources = [ "foo.cc" ]
#    public = [ "foo.h" ]
#    deps = [ ":bar" ]
#  }

import("//build_overrides/build.gni")

template("absl_source_set") {
  source_set(target_name) {
    forward_variables_from(invoker, "*")
    if (!use_cobalt_customizations) {
    configs -= [ "//build/config/compiler:chromium_code" ]
    }
    configs += [
      "//build/config/compiler:no_chromium_code",
      "//build/config/compiler:prevent_unsafe_narrowing",
      "//third_party/abseil-cpp:absl_default_cflags_cc",
      "//third_party/abseil-cpp:absl_define_config",
    ]

    if (is_component_build) {
      defines = [ "ABSL_BUILD_DLL" ]
      if (!is_win) {
        configs -= [ "//build/config/gcc:symbol_visibility_hidden" ]
        configs += [ "//build/config/gcc:symbol_visibility_default" ]
      }
    }

    if (!defined(public_configs)) {
      public_configs = []
    }
    public_configs += [ "//third_party/abseil-cpp:absl_include_config" ]

    if (!defined(visibility)) {
      # Within Chromium builds, restrict direct visibility of Abseil sources, so
      # users must depend on //third_party/abseil-cpp:absl. This prevents use of
      # banned targets like absl/types:any. A few targets require exceptions.
      # TODO(crbug.com/1096380): Consider replacing build_with_chromium with
      # is_component_build for a narrower, more accurate condition.
      if (build_with_chromium) {
        visibility = [
          # Abseil itself.
          "//third_party/abseil-cpp/*",

          # GTest.  It unconditionally #includes any.h if pretty-print support
          # for absl types is enabled.
          "//third_party/googletest/*",

          # WebRTC binary to run PSNR and SSIM video quality analysis. It
          # statically links absl and it is used by "browser_tests" when
          # is_component_build=false but it cannot depend on the absl
          # component because it uses absl/flags.
          "//third_party/webrtc/rtc_tools:frame_analyzer",

          # WebRTC binaries used by //:chromium_builder_asan. They both
          # statically link absl (because they depend on absl/flags) and are
          # used by Chromium only when is_component_build=false.
          "//third_party/webrtc/rtc_tools:rtp_generator",
          "//third_party/webrtc/rtc_tools:video_replay",

          # Not used by Chromium directly.
          "//chromecast/internal/*",
          "//libassistant/*",
        ]
      } else {
        visibility = [ "*" ]
      }
    }
  }
}

template("absl_test") {
  source_set(target_name) {
    forward_variables_from(invoker, "*")
    testonly = true
    if (!use_cobalt_customizations) {
    configs -= [ "//build/config/compiler:chromium_code" ]
    }
    configs += [
      "//build/config/compiler:no_chromium_code",
      "//third_party/abseil-cpp:absl_default_cflags_cc",
      "//third_party/abseil-cpp:absl_define_config",
      "//third_party/abseil-cpp:absl_test_config",
    ]

    if (!defined(public_configs)) {
      public_configs = []
    }
    public_configs += [ "//third_party/abseil-cpp:absl_include_config" ]

    visibility = [ "//third_party/abseil-cpp/:*" ]
    deps += [
      "//third_party/googletest:gmock",
      "//third_party/googletest:gtest",
    ]
  }
}
