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

_script_path = rebase_path("../py/pw_toolchain/clang_arm_toolchain.py")

# This template generates a config that can be used to target ARM cores using
# a clang compiler.
#
# Clang isn't a plug-and-play experience for Cortex-M baremetal targets; it's
# missing C runtime libraries, C/C++ standard libraries, and a few other
# things. This template uses the provided cflags, asmflags, ldflags, etc. to
# generate a config that pulls the missing components from an arm-none-eabi-gcc
# compiler on the system PATH. The end result is a clang-based compiler that
# pulls in gcc-provided headers and libraries to complete the toolchain.
#
# Args:
#   - asmflags, cflags, cflags_c, cflags_cc, ldflags: These flags are used to
#         locate the correct architecture-specific libraries/headers. To
#         properly drive the script, provide all architecture flags (e.g. -mcpu,
#         -mabi, -mthumb, -mfloat-abi, -mfpu) in at least one of these
#         variables.
#
# Generated targets:
#   - $target_name: The final config to use with your clang toolchain.
template("pw_clang_arm_config") {
  config(target_name) {
    # Pull all the compiler flags into a single list.
    _compiler_flags = []
    forward_variables_from(invoker, "*")
    if (defined(asmflags)) {
      _compiler_flags += asmflags
    } else {
      asmflags = []
    }
    if (defined(cflags)) {
      _compiler_flags += cflags
    } else {
      cflags = []
    }
    if (defined(cflags_c)) {
      _compiler_flags += cflags_c
    } else {
      cflags_c = []
    }
    if (defined(cflags_cc)) {
      _compiler_flags += cflags_cc
    } else {
      cflags_cc = []
    }
    if (defined(ldflags)) {
      _compiler_flags += ldflags
    } else {
      ldflags = []
    }

    # Invoke the script that will generate clang flags based on the current
    # compiler version and desired arch.
    _script_flags = [
      "--gn-scope",
      "--cflags",
      "--ldflags",
      "--",
    ]
    _script_flags += _compiler_flags
    _arm_flags = exec_script(_script_path, _script_flags, "scope")

    cflags += _arm_flags.cflags
    ldflags += _arm_flags.cflags
    ldflags += _arm_flags.ldflags
  }
}
