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

# Toolchain-related configuration that may be needed outside the context of the
# toolchain() rules themselves.

import("//build/config/chrome_build.gni")
import("//build/config/chromecast_build.gni")
import("//build_overrides/build.gni")

declare_args() {
  # If this is set to true, we use the revision in the llvm repo to determine
  # the CLANG_REVISION to use, instead of the version hard-coded into
  # //tools/clang/scripts/update.py. This should only be used in
  # conjunction with setting the llvm_force_head_revision DEPS variable when
  # `gclient runhooks` is run as well.
  llvm_force_head_revision = false

  # Used for binary size analysis.
  generate_linker_map = is_android && is_official_build

  # Whether this toolchain should avoid building any sanitizer support
  # because it's a host toolchain where we aim to make shared objects that may
  # be loaded by prebuilt binaries without sanitizer support.
  toolchain_disables_sanitizers = false
}

if (generate_linker_map) {
  assert(is_official_build || is_castos || is_cast_android,
         "Linker map files should only be generated when is_official_build = " +
             "true or is_castos = true or is_cast_android = true")
  assert(current_os == "android" || current_os == "linux" ||
             target_os == "android" || target_os == "linux" ||
             target_os == "chromeos",
         "Linker map files should only be generated for Android, Linux, " +
             "or ChromeOS.")
}

declare_args() {
  clang_version = "17"
}

# Extension for shared library files (including leading dot).
if (is_apple) {
  shlib_extension = ".dylib"
} else if (is_android && is_component_build) {
  # By appending .cr, we prevent name collisions with libraries already
  # loaded by the Android zygote.
  shlib_extension = ".cr.so"
} else if (is_posix || is_fuchsia) {
  shlib_extension = ".so"
} else if (is_win) {
  shlib_extension = ".dll"
} else {
  assert(false, "Platform not supported")
}

# Prefix for shared library files.
if (is_posix || is_fuchsia) {
  shlib_prefix = "lib"
} else {
  shlib_prefix = ""
}

# Directory for shared library files.
if (is_fuchsia) {
  shlib_subdir = "/lib"
} else {
  shlib_subdir = ""
}

# While other "tool"s in a toolchain are specific to the target of that
# toolchain, the "stamp" and "copy" tools are really generic to the host;
# but each toolchain must define them separately.  GN doesn't allow a
# template instantiation inside a toolchain definition, so some boilerplate
# has to be repeated in each toolchain to define these two tools.  These
# four variables reduce the duplication in that boilerplate.
stamp_description = "STAMP {{output}}"
copy_description = "COPY {{source}} {{output}}"
if (host_os == "win") {
  _tool_wrapper_path =
      rebase_path("//build/toolchain/win/tool_wrapper.py", root_build_dir)

  stamp_command = "cmd /c type nul > \"{{output}}\""
  copy_command =
      "\"$python_path\" $_tool_wrapper_path recursive-mirror {{source}} {{output}}"
} else {
  stamp_command = "touch {{output}}"
  copy_command = "ln -f {{source}} {{output}} 2>/dev/null || (rm -rf {{output}} && cp -af {{source}} {{output}})"
}

if (!defined(toolchain_disables_sanitizers)) {
  toolchain_disables_sanitizers = false
}

# This variable is true if the current toolchain is one of the target
# toolchains, i.e. a toolchain which is being used to build the main Chrome
# binary. This generally means "not the host toolchain", but in the case where
# we're targeting the host it's true then as well. We do require current_os to
# match target_os so that for example we avoid considering Android as a target
# toolchain when targeting CrOS.
is_a_target_toolchain =
    (current_toolchain != host_toolchain ||
     default_toolchain == host_toolchain) && current_os == target_os
