# 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")  # Imports android/config.gni.
import("//build/toolchain/ccache.gni")
import("//build/toolchain/gcc_toolchain.gni")
import("//build/toolchain/goma.gni")

# The Android GCC toolchains share most of the same parameters, so we have this
# wrapper around gcc_toolchain to avoid duplication of logic.
#
# Parameters:
#  - android_ndk_sysroot
#      Sysroot for this architecture.
#  - android_ndk_lib_dir
#      Subdirectory inside of android_ndk_sysroot where libs go.
#  - tool_prefix
#      Prefix to be added to the tool names.
#  - toolchain_cpu
#      Same as gcc_toolchain
template("android_gcc_toolchain") {
  gcc_toolchain(target_name) {
    # Make our manually injected libs relative to the build dir.
    android_ndk_lib = rebase_path(
            invoker.android_ndk_sysroot + "/" + invoker.android_ndk_lib_dir,
            root_build_dir)

    libs_section_prefix = "$android_ndk_lib/crtbegin_dynamic.o"
    libs_section_postfix = "$android_ndk_lib/crtend_android.o"

    solink_libs_section_prefix = "$android_ndk_lib/crtbegin_so.o"
    solink_libs_section_postfix = "$android_ndk_lib/crtend_so.o"

    # The tools should be run relative to the build dir.
    tool_prefix = rebase_path(invoker.tool_prefix, root_build_dir)

    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 = ""
    }

    is_clang = invoker.is_clang
    if (is_clang) {
      prefix =
          rebase_path("//buildtools/${host_os}-x64/clang/bin", root_build_dir)

      cc = compiler_prefix + prefix + "/clang"
      cxx = compiler_prefix + prefix + "/clang++"
      ar = prefix + "/llvm-ar"
    } else {
      cc = compiler_prefix + tool_prefix + "gcc"
      cxx = compiler_prefix + tool_prefix + "g++"
      ar = tool_prefix + "ar"
    }

    ld = cxx
    readelf = compiler_prefix + tool_prefix + "readelf"
    nm = compiler_prefix + tool_prefix + "nm"

    toolchain_os = "android"
    toolchain_cpu = invoker.toolchain_cpu

    # We make the assumption that the gcc_toolchain will produce a soname with
    # the following definition.
    soname = "{{target_output_name}}{{output_extension}}"

    stripped_soname = "lib.stripped/${soname}"
    temp_stripped_soname = "${stripped_soname}.tmp"

    android_strip = "${tool_prefix}strip"

    strip_command =
        "$android_strip --strip-unneeded -o $temp_stripped_soname $soname"
    replace_command = "if ! cmp -s $temp_stripped_soname $stripped_soname; then mv $temp_stripped_soname $stripped_soname; fi"
    postsolink = "$strip_command && $replace_command"
    solink_outputs = [ stripped_soname ]
    default_output_extension = android_product_extension

    # We make the assumption that the gcc_toolchain will produce an exe with
    # the following definition.
    exe = "{{root_out_dir}}/{{target_output_name}}{{output_extension}}"
    stripped_exe = "exe.stripped/$exe"
    postlink = "$android_strip --strip-unneeded -o $stripped_exe $exe"
    link_outputs = [ stripped_exe ]
  }
}

template("android_gcc_toolchains_helper") {
  android_gcc_toolchain(target_name) {
    android_ndk_sysroot = invoker.android_ndk_sysroot
    android_ndk_lib_dir = invoker.android_ndk_lib_dir
    tool_prefix = invoker.tool_prefix
    toolchain_cpu = invoker.toolchain_cpu
  }
  android_gcc_toolchain("clang_$target_name") {
    android_ndk_sysroot = invoker.android_ndk_sysroot
    android_ndk_lib_dir = invoker.android_ndk_lib_dir
    tool_prefix = invoker.tool_prefix
    toolchain_cpu = invoker.toolchain_cpu
    is_clang = true
  }
}

android_gcc_toolchains_helper("x86") {
  android_ndk_sysroot = "$android_ndk_root/$x86_android_sysroot_subdir"
  android_ndk_lib_dir = "usr/lib"

  tool_prefix = "$x86_android_toolchain_root/bin/i686-linux-android-"
  toolchain_cpu = "x86"
}

android_gcc_toolchains_helper("arm") {
  android_ndk_sysroot = "$android_ndk_root/$arm_android_sysroot_subdir"
  android_ndk_lib_dir = "usr/lib"

  tool_prefix = "$arm_android_toolchain_root/bin/arm-linux-androideabi-"
  toolchain_cpu = "arm"
}

android_gcc_toolchains_helper("x64") {
  android_ndk_sysroot = "$android_ndk_root/$x86_64_android_sysroot_subdir"
  android_ndk_lib_dir = "usr/lib64"

  tool_prefix = "$x86_64_android_toolchain_root/bin/x86_64-linux-android-"
  toolchain_cpu = "x86_64"
}

android_gcc_toolchains_helper("arm64") {
  android_ndk_sysroot = "$android_ndk_root/$arm64_android_sysroot_subdir"
  android_ndk_lib_dir = "usr/lib"

  tool_prefix = "$arm64_android_toolchain_root/bin/aarch64-linux-android-"
  toolchain_cpu = "aarch64"
}
