# Copyright 2023 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("//build_overrides/pigweed_environment.gni")

import("$dir_pw_build/defaults.gni")
import("$dir_pw_toolchain/rbe.gni")
import("$dir_pw_toolchain_extra/generate_toolchain.gni")

pw_toolchain_CORTEX_M_CPU = {
  M0 = "m0"
  M0_SMALL_MULTIPLY = "m0_small_multiply"
  M0PLUS = "m0plus"
  M0PLUS_SMALL_MULTIPLY = "m0plus_small_multiply"
  M1 = "m1"
  M1_SMALL_MULTIPLY = "m1_small_multiply"
  M3 = "m3"
  M4 = "m4"
  M7 = "m7"
  M23 = "m23"
  M33 = "m33"
  M35P = "m35p"
  M55 = "m55"
}

pw_toolchain_CORTEX_M_FPU = {
  SOFTWARE = "soft"
  FPV4_SP = "fpv4_sp"
  FP_V5 = "fpv5"
  FP_V5_SP = "fpv5_sp"
}

declare_args() {
  pw_toolchain_ARM_NONE_EABI_ROOT =
      rebase_path(pw_env_setup_CIPD_ARM + "/bin/", root_build_dir)
}

# In addition to all the arguments supported by pw_toolchain, this template
# adds the following arguments:
#   cpu (required): Which Cortex-M CPU to build for.
#   fpu (optional): Which Cortex-M FPU architecture to build for. Defaults to
#       emulated (software) FPU.
#   use_newlib_nano (optional): Whether or not to use newlib-nano. Defaults to
#       true.
#   use_nosys (optional): Whether or not to use nosys implementation stubs for
#       syscalls. Defaults to true.
template("pw_cortex_m_gcc_toolchain") {
  pw_toolchain(target_name) {
    _tool_prefix = "arm-none-eabi-"
    _toolchain_root = pw_toolchain_ARM_NONE_EABI_ROOT

    cc = _toolchain_root + _tool_prefix + "gcc"
    cxx = _toolchain_root + _tool_prefix + "g++"
    ar = _toolchain_root + _tool_prefix + "ar"
    ld = _toolchain_root + _tool_prefix + "g++"

    rbe_config = pw_rbe_arm_gcc_config
    rbe_input_dir = _toolchain_root

    # Default to enabling link_whole_archive for Cortex-M builds.
    if (!defined(invoker.link_whole_archive)) {
      link_whole_archive = true
    }

    # TODO(amontanez): Add check for supported options. Also CPU.
    if (defined(invoker.fpu)) {
      _fpu = invoker.fpu
    } else {
      _fpu = pw_toolchain_CORTEX_M_FPU.SOFTWARE
    }

    default_configs = [
      "$dir_pw_toolchain_extra/cortex_m:disable_psabi_warning",
      "$dir_pw_toolchain_extra/cortex_m:thumb",
      "$dir_pw_toolchain_extra/cortex_m:cortex_${invoker.cpu}",
      "$dir_pw_toolchain_extra/cortex_m:fpu_${_fpu}",
    ]
    default_configs += pigweed_default_configs

    if (!defined(invoker.use_newlib_nano) || invoker.use_newlib_nano) {
      default_configs += [ "$dir_pw_toolchain_extra/cortex_m:newlib_nano" ]
    }
    if (!defined(invoker.use_nosys) || invoker.use_nosys) {
      default_configs += [ "$dir_pw_toolchain_extra/cortex_m:nosys" ]
    }

    if (defined(invoker.default_configs)) {
      default_configs += invoker.default_configs
    }

    if (!defined(invoker.current_cpu)) {
      current_cpu = "arm"
    }

    # Arguments that are consumed by this template and shouldn't be directly
    # forwarded to the underlying template.
    _args_used = [
      "cpu",
      "fpu",
      "use_newlib_nano",
      "use_nosys",
      "default_configs",
    ]
    forward_variables_from(invoker, "*", _args_used)
  }
}
