# Copyright 2021 The Pigweed Authors
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.

import("//build_overrides/pigweed.gni")

import("$dir_pw_android_toolchain/android.gni")
import("$dir_pw_toolchain/generate_toolchain.gni")

# Creates an Android toolchain target.
#
# Arguments are forwarded to $generate_toolchain.
template("pw_generate_android_toolchain") {
  assert(pw_android_toolchain_NDK_PATH != "",
         "pw_android_toolchain_NDK_PATH is not set")
  assert(defined(invoker.defaults), "toolchain is missing 'defaults'")
  invoker_toolchain_args = invoker.defaults

  # Build _clang_prefix from "host_os" and "host_cpu".
  _host_os = ""
  if (host_os == "linux") {
    _host_os = "linux"
  } else if (host_os == "mac") {
    _host_os = "darwin"
  } else if (host_os == "win") {
    _host_os = "windows"
  }

  _host_cpu = ""
  if (host_cpu == "x64") {
    _host_cpu = "-x86_64"
  }

  _clang_prefix = "${pw_android_toolchain_NDK_PATH}/toolchains/llvm/prebuilt/${_host_os}${_host_cpu}/bin/"

  # Build _tool_name_root from "_ndk_cpu" and "api_level".
  if (defined(invoker_toolchain_args.api_level)) {
    _api_level = invoker_toolchain_args.api_level
  } else {
    _api_level = pw_android_toolchain_API_LEVEL
  }

  assert(defined(invoker_toolchain_args.current_cpu),
         "toolchain.defaults is missing 'current_cpu'")
  if (invoker_toolchain_args.current_cpu == "arm") {
    _tool_name_root = "armv7a-linux-androideabi${_api_level}-"
  } else if (invoker_toolchain_args.current_cpu == "arm64") {
    _tool_name_root = "aarch64-linux-android${_api_level}-"
  } else if (invoker_toolchain_args.current_cpu == "x86") {
    _tool_name_root = "i686-linux-android${_api_level}-"
  } else if (invoker_toolchain_args.current_cpu == "x64") {
    _tool_name_root = "x86_64-linux-android${_api_level}-"
  } else {
    assert(false, "toolchain.defaults.current_cpu unknown or invalid")
  }

  generate_toolchain(target_name) {
    ar = _clang_prefix + "llvm-ar"
    cc = _clang_prefix + _tool_name_root + "clang"
    cxx = _clang_prefix + _tool_name_root + "clang++"

    forward_variables_from(invoker,
                           "*",
                           [
                             "defaults",
                             "name",
                           ])
    defaults = {
      current_os = "android"
      forward_variables_from(invoker_toolchain_args, "*")
    }
  }
}

# Creates a series of Android toolchain targets with common compiler options.
#
# Args:
#   toolchains: List of scopes defining each of the desired tolchains.
#   The scope must contain a "name" variable; other variables are forwared to
#   $generate_toolchain.
template("pw_generate_android_toolchains") {
  not_needed([ "target_name" ])
  assert(
      defined(invoker.toolchains),
      "pw_generate_android_toolchains must be called with a list of toolchains")

  # Create a target for each of the desired toolchains.
  foreach(_toolchain, invoker.toolchains) {
    # If the toolchain defines a CPU, use that, otherwise expand to all of the
    # CPU targets an NDK may contain and prepend the CPU name.
    _current_cpu = ""
    if (defined(_toolchain.defaults)) {
      invoker_toolchain_args = {
      }
      invoker_toolchain_args = _toolchain.defaults
      if (defined(invoker_toolchain_args.current_cpu)) {
        _current_cpu = invoker_toolchain_args.current_cpu
      }
    }

    if (_current_cpu != "") {
      pw_generate_android_toolchain(_toolchain.name) {
        forward_variables_from(_toolchain, "*", [ "name" ])
      }
    } else {
      foreach(_current_cpu, pw_android_toolchain_cpu_targets) {
        pw_generate_android_toolchain("${_current_cpu}_${_toolchain.name}") {
          forward_variables_from(_toolchain,
                                 "*",
                                 [
                                   "defaults",
                                   "name",
                                 ])
          defaults = {
            current_cpu = _current_cpu
            if (defined(_toolchain.defaults)) {
              forward_variables_from(_toolchain.defaults, "*")
            }
          }
        }
      }
    }
  }
}
