1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134

build / toolchain / toolchain.gni [blame]

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

  # Cronet is shipped in AOSP, where it is built using the Android Mainline
  # Clang. Please refer to go/cronet-builders-with-mainline-clang-design for
  # more information.
  # If this arg is set to true, we use the Android Mainline LLVM.
  llvm_android_mainline = false

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

  # Whether this toolchain is to be used for building host tools that are
  # consumed during the build process. That includes proc macros and Cargo build
  # scripts.
  toolchain_for_rust_host_build_tools = false

  # If false, the toolchain overrides `use_partition_alloc_as_malloc` in
  # PartitionAlloc, to allow use of the system allocator.
  toolchain_allows_use_partition_alloc_as_malloc = true
}

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() {
  if (llvm_android_mainline) {  # https://crbug.com/1481060
    clang_version = "17"
  } else {
    clang_version = "20"
  }
}

# Extension for shared library files (including leading dot).
if (is_apple) {
  shlib_extension = ".dylib"
} else if (is_posix || is_fuchsia) {
  shlib_extension = ".so"
} else if (is_win) {
  shlib_extension = ".dll"
} else {
  assert(false, "Platform not supported")
}

# Same extension but for the host platform. We have significantly fewer host
# platforms.
if (host_os == "mac") {
  host_shlib_extension = ".dylib"
} else if (host_os == "win") {
  host_shlib_extension = ".dll"
} else if (host_os == "linux" || host_os == "aix" || host_os == "zos") {
  host_shlib_extension = ".so"
} else {
  assert(false, "Host 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}})"
}

# 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

# A toolchain for building tools that run on the host machine and need to use
# the system allocator. This toolchain does not use PartitionAlloc-Everywhere by
# design. We use a name with `_host` injected into it to avoid colliding with
# toolchains of the same name (but different path) between different OSes.
host_system_allocator_toolchain = "${host_toolchain}_host_with_system_allocator"

# A toolchain for building tools that run on the default target machine and need
# to use the system allocator. This toolchain does not use
# PartitionAlloc-Everywhere by design.
default_system_allocator_toolchain =
    "${default_toolchain}_with_system_allocator"