# 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")

declare_args() {
  absl_build_tests = build_with_chromium
}

template("absl_source_set") {
  source_set(target_name) {
    if (defined(invoker.testonly) && invoker.testonly && !absl_build_tests) {
      not_needed(invoker, "*")
    } else {
      forward_variables_from(invoker, "*")
      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 (!defined(defines)) {
        defines = []
      }
      if (is_component_build) {
        defines += [ "ABSL_BUILD_DLL" ]
        if (!is_win && current_os != "aix") {
          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.
        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/*",
          ]

          if (!is_component_build) {
            visibility += [
              # Not used by Chromium directly.
              "//chromecast/internal/*",
              "//libassistant/*",
            ]
          }
        } else {
          visibility = [ "*" ]
        }
      }
    }
  }
}

template("absl_test") {
  source_set(target_name) {
    if (!absl_build_tests) {
      not_needed(invoker, "*")
    } else {
      forward_variables_from(invoker, "*")
      testonly = true
      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",
      ]
    }
  }
}
