# Copyright 2014 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.

import("//build/config/compiler/compiler.gni")
import("//build/config/sysroot.gni")
import("//build/toolchain/gcc_toolchain.gni")
import("//build/toolchain/cros_toolchain.gni")

# This is the normal toolchain for most targets.
gcc_toolchain("target") {
  ar = cros_target_ar
  cc = cros_target_cc
  cxx = cros_target_cxx
  ld = cxx
  if (cros_target_ld != "") {
    ld = cros_target_ld
  }
  if (cros_target_nm != "") {
    nm = cros_target_nm
  }
  if (cros_target_readelf != "") {
    readelf = cros_target_readelf
  }
  extra_cflags = cros_target_extra_cflags
  extra_cppflags = cros_target_extra_cppflags
  extra_cxxflags = cros_target_extra_cxxflags
  extra_ldflags = cros_target_extra_ldflags

  toolchain_args = {
    cc_wrapper = ""
    current_cpu = target_cpu
    current_os = "chromeos"
    is_clang = is_clang
    use_debug_fission = use_debug_fission
    use_gold = use_gold
    use_sysroot = use_sysroot
  }
}

# This is a special toolchain needed just for the nacl_bootstrap target in
# //native_client/src/trusted/service_runtime/linux. It is identical
# to ":target" except that it forces use_debug_fission, use_gold, and
# use_sysroot off, and allows the user to set different sets of extra flags.
gcc_toolchain("nacl_bootstrap") {
  ar = cros_target_ar
  cc = cros_target_cc
  cxx = cros_target_cxx
  ld = cxx
  if (cros_target_ld != "") {
    ld = cros_target_ld
  }
  if (cros_target_nm != "") {
    nm = cros_target_nm
  }
  if (cros_target_readelf != "") {
    readelf = cros_target_readelf
  }
  extra_cflags = cros_nacl_bootstrap_extra_cflags
  extra_cppflags = cros_nacl_bootstrap_extra_cppflags
  extra_cxxflags = cros_nacl_bootstrap_extra_cxxflags
  extra_ldflags = cros_nacl_bootstrap_extra_ldflags

  toolchain_args = {
    cc_wrapper = ""
    current_cpu = target_cpu
    current_os = "chromeos"
    is_clang = is_clang
    use_debug_fission = false
    use_gold = false
    use_sysroot = false
  }
}

gcc_toolchain("host") {
  # These are args for the template.
  ar = cros_host_ar
  cc = cros_host_cc
  cxx = cros_host_cxx
  ld = cxx
  if (cros_host_ld != "") {
    ld = cros_host_ld
  }
  if (cros_host_nm != "") {
    nm = cros_host_nm
  }
  if (cros_host_readelf != "") {
    readelf = cros_host_readelf
  }
  extra_cflags = cros_host_extra_cflags
  extra_cppflags = cros_host_extra_cppflags
  extra_cxxflags = cros_host_extra_cxxflags
  extra_ldflags = cros_host_extra_ldflags

  toolchain_args = {
    cc_wrapper = ""
    is_clang = cros_host_is_clang
    current_cpu = host_cpu
    current_os = "linux"
    use_sysroot = false
  }
}

gcc_toolchain("v8_snapshot") {
  # These are args for the template.
  ar = cros_v8_snapshot_ar
  cc = cros_v8_snapshot_cc
  cxx = cros_v8_snapshot_cxx
  ld = cxx
  if (cros_v8_snapshot_ld != "") {
    ld = cros_v8_snapshot_ld
  }
  if (cros_v8_snapshot_nm != "") {
    nm = cros_v8_snapshot_nm
  }
  if (cros_v8_snapshot_readelf != "") {
    readelf = cros_v8_snapshot_readelf
  }
  extra_cflags = cros_v8_snapshot_extra_cflags
  extra_cppflags = cros_v8_snapshot_extra_cppflags
  extra_cxxflags = cros_v8_snapshot_extra_cxxflags
  extra_ldflags = cros_v8_snapshot_extra_ldflags

  toolchain_args = {
    cc_wrapper = ""
    is_clang = cros_v8_snapshot_is_clang
    if (target_cpu == "x86" || target_cpu == "arm" || target_cpu == "mipsel") {
      current_cpu = "x86"
    } else {
      current_cpu = "x64"
    }
    v8_current_cpu = v8_target_cpu
    current_os = "linux"
    use_sysroot = false
  }
}
