# Copyright 2020 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.

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

template("absl_source_set") {
  source_set(target_name) {
    forward_variables_from(invoker, "*")
    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",
    ]

    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 (is_mac && use_lld) {
        # TODO(crbug.com/1220100) -- remove once lld bug is fixed.
        # (Or always pass, seems like good change.)
        cflags = [ "-fvisibility-inlines-hidden" ]
      }
    }

    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 = [ "*" ]
      }
    }
  }
}
