# Copyright 2013 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/sysroot.gni")
import("//build/toolchain/ccache.gni")
import("//build/toolchain/clang.gni")
import("//build/toolchain/gcc_toolchain.gni")
import("//build/toolchain/goma.gni")

if (use_goma) {
  assert(!use_ccache, "Goma and ccache can't be used together.")
  compiler_prefix = "$goma_dir/gomacc "
} else if (use_ccache) {
  compiler_prefix = "ccache "
} else {
  compiler_prefix = ""
}

gcc_toolchain("arm") {
  cc = "${compiler_prefix}arm-linux-gnueabi-gcc"
  cxx = "${compiler_prefix}arm-linux-gnueabi-g++"

  ar = "arm-linux-gnueabi-ar"
  ld = cxx

  toolchain_cpu = "arm"
  toolchain_os = "linux"
  is_clang = false
}

gcc_toolchain("clang_x86") {
  if (use_clang_type_profiler) {
    prefix = rebase_path("//third_party/llvm-allocated-type/Linux_ia32/bin",
                         root_build_dir)
  } else {
    prefix = rebase_path("//third_party/llvm-build/Release+Asserts/bin",
                         root_build_dir)
  }
  cc = "${compiler_prefix}$prefix/clang"
  cxx = "${compiler_prefix}$prefix/clang++"

  ar = "ar"
  ld = cxx

  toolchain_cpu = "x86"
  toolchain_os = "linux"
  is_clang = true
}

gcc_toolchain("x86") {
  cc = "${compiler_prefix}gcc"
  cxx = "$compiler_prefix}g++"

  ar = "ar"
  ld = cxx

  toolchain_cpu = "x86"
  toolchain_os = "linux"
  is_clang = false
}

gcc_toolchain("clang_x64") {
  if (use_clang_type_profiler) {
    prefix = rebase_path("//third_party/llvm-allocated-type/Linux_x64/bin",
                         root_build_dir)
  } else {
    prefix = rebase_path("//third_party/llvm-build/Release+Asserts/bin",
                         root_build_dir)
  }
  cc = "${compiler_prefix}$prefix/clang"
  cxx = "${compiler_prefix}$prefix/clang++"

  ar = "ar"
  ld = cxx

  toolchain_cpu = "x64"
  toolchain_os = "linux"
  is_clang = true
}

gcc_toolchain("x64") {
  cc = "${compiler_prefix}gcc"
  cxx = "${compiler_prefix}g++"

  ar = "ar"
  ld = cxx

  toolchain_cpu = "x64"
  toolchain_os = "linux"
  is_clang = false
}

gcc_toolchain("mipsel") {
  cc = "mipsel-linux-gnu-gcc"
  cxx = "mipsel-linux-gnu-g++"
  ar = "mipsel-linux-gnu-ar"
  ld = cxx

  toolchain_cpu = "mipsel"
  toolchain_os = "linux"
  is_clang = false
}
