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

  software_fpu_cflags = [ "-mfloat-abi=soft" ]

  hardware_fpu_cflags = [
    # When hardware FPU is enabled, PW_ARMV7M_ENABLE_FPU is set to 1.
    # TODO(pwbug/17): Replace when there's a more sophisticated configuration
    # system.
    "-DPW_ARMV7M_ENABLE_FPU=1",
    "-mfloat-abi=hard",
    "-mfpu=fpv4-sp-d16",
  ]

  common_toolchain_cflags = [
    "-mabi=aapcs",
    "-mcpu=cortex-m4",
    "-mthumb",
    "-specs=nano.specs",
    "-specs=nosys.specs",
  ]

  common_toolchain_ldflags = [
    "-lnosys",
    "-lc",
  ]

  toolchains = [
    # Cortex-M4 toolchains that use software-emulated floating point.
    {
      toolchain_name = "arm_gcc_cortex_m4_og"
      additional_cflags = [ "-Og" ]
      additional_cflags += software_fpu_cflags
    },
    {
      toolchain_name = "arm_gcc_cortex_m4_o1"
      additional_cflags = [ "-O1" ]
      additional_cflags += software_fpu_cflags
    },
    {
      toolchain_name = "arm_gcc_cortex_m4_o2"
      additional_cflags = [ "-O2" ]
      additional_cflags += software_fpu_cflags
    },
    {
      toolchain_name = "arm_gcc_cortex_m4_os"
      additional_cflags = [ "-Os" ]
      additional_cflags += software_fpu_cflags
    },

    # Cortex-M4 toolchains that use hardware FPU instructions.
    {
      toolchain_name = "arm_gcc_cortex_m4f_og"
      additional_cflags = [ "-Og" ]
      additional_cflags += hardware_fpu_cflags
    },
    {
      toolchain_name = "arm_gcc_cortex_m4f_o1"
      additional_cflags = [ "-O1" ]
      additional_cflags += hardware_fpu_cflags
    },
    {
      toolchain_name = "arm_gcc_cortex_m4f_o2"
      additional_cflags = [ "-O2" ]
      additional_cflags += hardware_fpu_cflags
    },
    {
      toolchain_name = "arm_gcc_cortex_m4f_os"
      additional_cflags = [ "-Os" ]
      additional_cflags += hardware_fpu_cflags
    },
  ]
}

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" ]
    },
  ]
}
