# Copyright 2019 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("arm_gcc.gni")
import("x86_linux_gcc.gni")

# Creates a series of toolchain targets with common compiler options.
#
# Args:
#   toolchain_template: The target template to use to create the toolchains.
#   common_toolchain_cflags: cflags to be shared by all toolchains.
#   common_toolchain_ldflags: ldflags to be shared by all toolchains.
#   toolchains: List of scopes defining each of the desired toolchains.
#     Each scope contains up to three variables:
#       toolchain_name: The full target name of the toolchain.
#       additional_cflags: Optional list of extra cflags for the toolchain.
#       additional_ldflags: Optional list of extra ldflags for the toolchain.
template("generate_toolchains") {
  not_needed([ "target_name" ])

  assert(defined(invoker.toolchain_template),
         "generate_toolchains requires a toolchain template")
  assert(defined(invoker.toolchains),
         "generate_toolchains must be called with a list of toolchains")

  if (defined(invoker.common_toolchain_cflags)) {
    _common_cflags = invoker.common_toolchain_cflags
  } else {
    _common_cflags = []
  }

  if (defined(invoker.common_toolchain_ldflags)) {
    _common_ldflags = invoker.common_toolchain_ldflags
  } else {
    _common_ldflags = []
  }

  # Create a target for each of the desired toolchains, appending its own cflags
  # and ldflags to the common ones.
  foreach(toolchain_config, invoker.toolchains) {
    # GN does not allow assigning a non-empty array to a non-empty array.
    # This must be done as two assignments, first clearing the original value.
    _toolchain_cflags = []
    _toolchain_cflags = _common_cflags
    if (defined(toolchain_config.additional_cflags)) {
      _toolchain_cflags += toolchain_config.additional_cflags
    }

    _toolchain_ldflags = []
    _toolchain_ldflags = _common_ldflags
    if (defined(toolchain_config.additional_ldflags)) {
      _toolchain_ldflags += toolchain_config.additional_ldflags
    }

    target(invoker.toolchain_template, toolchain_config.toolchain_name) {
      toolchain_cflags = _toolchain_cflags
      toolchain_ldflags = _toolchain_ldflags
    }
  }
}

generate_toolchains("cortex_m4") {
  toolchain_template = "arm_gcc_toolchain"

  common_toolchain_cflags = [
    "-mabi=aapcs",
    "-mcpu=cortex-m4",
    "-mfpu=fpv4-sp-d16",
    "-mfloat-abi=hard",
    "-mthumb",

    # Disable obnoxious ABI warning.
    #
    # GCC 7.1 adds an over-zealous ABI warning with little useful information
    # on how to resolve the issue. The warning you get is:
    #
    #   note: parameter passing for argument of type '...' changed in GCC 7.1
    #
    # There is no other information, and searching for the error is needed to
    # understand what is happening. For upstream Pigweed, we compile from
    # source so this is irrelevant; so disable it.
    #
    # See: https://gcc.gnu.org/gcc-7/changes.html (search for "psabi").
    #      https://gcc.gnu.org/ml/gcc/2017-05/msg00073.html
    "-Wno-psabi",
  ]

  common_toolchain_ldflags = [
    "--specs=nosys.specs",
    "-lnosys",
    "-lc",
  ]

  toolchains = [
    {
      toolchain_name = "arm_gcc_cortex_m4_og"
      additional_cflags = [ "-Og" ]
    },
    {
      toolchain_name = "arm_gcc_cortex_m4_o1"
      additional_cflags = [ "-O1" ]
    },
    {
      toolchain_name = "arm_gcc_cortex_m4_o2"
      additional_cflags = [ "-O2" ]
    },
    {
      toolchain_name = "arm_gcc_cortex_m4_os"
      additional_cflags = [ "-Os" ]
    },
  ]
}

generate_toolchains("linux") {
  toolchain_template = "x86_gcc_toolchain"

  toolchains = [
    {
      toolchain_name = "x86_linux_o2"
      additional_cflags = [ "-O2" ]
    },
  ]
}
