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

import("//build/config/features.gni")
import("//build/config/gclient_args.gni")

# Uncomment these to specify a different NDK location and version in
# non-Chromium builds.
# default_android_ndk_root = "//third_party/android_toolchain/ndk"
# default_android_ndk_version = "r10e"

# Some non-Chromium builds don't support building java targets.
enable_java_templates = true

# Variable that can be used to support multiple build scenarios, like when
# V8 is embedded within a target.
build_with_v8_embedder = build_with_chromium

# Enables assertions on safety checks in libc++.
#
# This should be set to true whenever building with Chrome's custom libc++ in
# order to guard against undefined behavior. However, the asserts added by
# hardening libc++ may introduce some performance overhead, so this is
# configurable to simplify A/B tests, and to allow performance-sensitive
# projects embedding Chrome (e.g. ANGLE) to disable libc++ hardening.
#
# Note that setting this to true only has an effect when also building with
# `use_custom_libcxx = true`.
enable_safe_libcxx = true

# Features used by //base/trace_event and //services/tracing.
declare_args() {
  # Tracing support requires //third_party/perfetto, which is not available in
  # libchrome (CrOS's version of //base). This flag can disable tracing support
  # altogether, in which case all tracing instrumentation in //base becomes a
  # no-op.
  # TODO(crbug/1065905): Add dependency on perfetto to support typed events.
  enable_base_tracing = true

  # Switches the TRACE_EVENT instrumentation from base's TraceLog implementation
  # to //third_party/perfetto's client library (crbug/1006541).
  use_perfetto_client_library = true

  # Limits the defined //third_party/android_deps targets to only "buildCompile"
  # and "buildCompileNoDeps" targets. This is useful for third-party
  # repositories which do not use JUnit tests. For instance,
  # limit_android_deps == true removes "gn gen" requirement for
  # //third_party/robolectric .
  limit_android_deps = false

  # Allows googletest to pretty-print various absl types.  Disabled for nacl due
  # to lack of toolchain support.
  gtest_enable_absl_printers = !is_nacl

  # Allow projects that wish to stay on C++17 to override Chromium's default.
  # TODO(crbug.com/1402249): evaluate removing this end of 2023
  use_cxx17 = false
}

# Features used by //base/trace_event.
declare_args() {
  # Use Perfetto's trace processor for converting protobuf-encoded traces to
  # the legacy JSON format in base::TraceLog.
  use_perfetto_trace_processor = use_perfetto_client_library && !is_nacl
}

# Allows different projects to specify their own suppression/ignore lists for
# sanitizer tools.
# asan_suppressions_file = "path/to/asan_suppressions.cc"
# asan_win_ignorelist_path = "path/to/asan/blocklist_win.txt"
# lsan_suppressions_file = "path/to/lsan_suppressions.cc"
# tsan_suppressions_file = "path/to/tsan_suppressions.cc"
# tsan_ignorelist_path = "path/to/tsan/ignores.txt"
# msan_ignorelist_path = "path/to/msan/ignorelist.txt"
# ubsan_ignorelist_path = "path/to/ubsan/ignorelist.txt"
# ubsan_vptr_ignorelist_path = "path/to/ubsan/vptr_ignorelist.txt"
# ubsan_security_ignorelist_path = "path/to/ubsan/security_ignorelist.txt"
# cfi_ignorelist_path = "path/to/cfi/ignores.txt"

if (host_os == "mac" || is_apple) {
  # Needed for is_apple when targeting macOS or iOS, independent of host.
  # Needed for host_os=="mac" for running host tool such as gperf in blink
  # even when targeting e.g. Windows.
  # TODO(thakis): See TODO in scripts.gni -- this should really only be needed
  # if is_apple, independent of host_os.
  declare_args() {
    # Use the system install of Xcode for tools like ibtool, libtool, etc.
    # This does not affect the compiler. When this variable is false, targets
    # will instead use a hermetic install of Xcode. [The hermetic install can
    # be obtained with gclient sync after setting the environment variable
    # FORCE_MAC_TOOLCHAIN for target_os mac only].
    use_system_xcode = ""
  }

  if (use_system_xcode == "") {
    _result = exec_script("//build/mac/should_use_hermetic_xcode.py",
                          [ current_os ],
                          "value")

    assert(_result != 2,
           "Do not allow building targets with the default" +
               "hermetic toolchain if the minimum OS version is not met.")
    assert(_result != 3,
           "iOS does not support building with a hermetic toolchain. " +
               "Please install Xcode.")

    use_system_xcode = _result != 1
  }

  assert(current_os != "ios" || use_system_xcode)
  assert(host_os == "mac" || !use_system_xcode)
}
