# Copyright (c) 2014 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/nacl/config.gni")
import("//build/toolchain/gcc_toolchain.gni")

# This template defines a NaCl toolchain.
#
# It requires the following variables specifying the executables to run:
#  - cc
#  - cxx
#  - ar
#  - ld
# and the following which is used in the toolchain_args
#  - toolchain_cpu  (What "current_cpu" should be set to when invoking a
#                    build using this toolchain.)

template("nacl_toolchain") {
  assert(defined(invoker.cc), "nacl_toolchain() must specify a \"cc\" value")
  assert(defined(invoker.cxx), "nacl_toolchain() must specify a \"cxx\" value")
  assert(defined(invoker.ar), "nacl_toolchain() must specify a \"ar\" value")
  assert(defined(invoker.ld), "nacl_toolchain() must specify a \"ld\" value")
  assert(defined(invoker.toolchain_cpu),
         "nacl_toolchain() must specify a \"toolchain_cpu\"")
  gcc_toolchain(target_name) {
    toolchain_os = "nacl"

    if (defined(invoker.executable_extension)) {
      executable_extension = invoker.executable_extension
    } else {
      executable_extension = ".nexe"
    }

    forward_variables_from(invoker,
                           [
                             "ar",
                             "cc",
                             "cxx",
                             "deps",
                             "ld",
                             "link_outputs",
                             "nm",
                             "readelf",
                             "strip",
                             "toolchain_cpu",
                           ])

    if (defined(invoker.is_clang)) {
      is_clang = invoker.is_clang
    }
    if (defined(invoker.is_nacl_glibc)) {
      is_nacl_glibc = invoker.is_nacl_glibc
    }
    if (defined(invoker.symbol_level)) {
      symbol_level = invoker.symbol_level
    }

    # We do not support component builds or sanitizers with the NaCl toolchains.
    is_component_build = false
    clear_sanitizers = true

    # We do not support tcmalloc in the NaCl toolchains.
    use_allocator = "none"

    rebuild_define = "NACL_TC_REV=" + invoker.toolchain_revision
  }
}
