chromium/build_overrides/build.gni

# 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.com/40124378): Add dependency on perfetto to support typed events.
  enable_base_tracing = 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/40251117): 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 = !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)
}