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

# This file should only be imported from files that define toolchains.
# There's no way to enforce this exactly, but all toolchains are processed
# in the context of the default_toolchain, so we can at least check for that.
assert(current_toolchain == default_toolchain)

import("//build/config/compiler/compiler.gni")
import("//build/config/sanitizers/sanitizers.gni")
import("//build/toolchain/toolchain.gni")

declare_args() {
  # Limit the number of concurrent links; we often want to run fewer
  # links at once than we do compiles, because linking is memory-intensive.
  # The default to use varies by platform and by the amount of memory
  # available, so we call out to a script to get the right value.
  concurrent_links = -1
}

if (concurrent_links == -1) {
  if (use_thin_lto) {
    _args = [
      "--mem_per_link_gb=10",
      "--reserve_mem_gb=10",
    ]
  } else if (use_sanitizer_coverage || use_fuzzing_engine) {
    # Sanitizer coverage instrumentation increases linker memory consumption
    # significantly.
    _args = [ "--mem_per_link_gb=16" ]
  } else if (is_win) {
    _args = [ "--mem_per_link_gb=5" ]
  } else if (is_mac) {
    _args = [ "--mem_per_link_gb=4" ]
  } else if (is_android && !is_component_build && symbol_level == 2) {
    _args = [ "--mem_per_link_gb=25" ]
  } else {
    _args = []
  }

  # TODO(crbug.com/617429) Pass more build configuration info to the script
  # so that we can compute better values.
  concurrent_links = exec_script("get_concurrent_links.py", _args, "value")
}
