# 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("host_clang.gni")
import("host_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",
    "-mfloat-abi=soft",
    "-mthumb",
    "-specs=nano.specs",
    "-specs=nosys.specs",
  ]

  common_toolchain_ldflags = [
    "-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("host_gcc_suite") {
  toolchain_template = "host_gcc"

  toolchains = [
    {
      toolchain_name = "host_gcc_og"
      additional_cflags = [ "-Og" ]
    },
    {
      toolchain_name = "host_gcc_o2"
      additional_cflags = [ "-O2" ]
    },
    {
      toolchain_name = "host_gcc_os"
      additional_cflags = [ "-Os" ]
    },
  ]
}

generate_toolchains("host_clang_suite") {
  toolchain_template = "host_clang"
  common_toolchain_cflags = [ "-g3" ]

  toolchains = [
    {
      toolchain_name = "host_clang_og"
      additional_cflags = [ "-Og" ]
    },
    {
      toolchain_name = "host_clang_o2"
      additional_cflags = [ "-O2" ]
    },
    {
      toolchain_name = "host_clang_os"
      additional_cflags = [ "-Os" ]
    },
  ]
}
