# 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("$dir_pw_docgen/docs.gni")
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_m3") {
  toolchain_template = "arm_gcc_toolchain"

  common_toolchain_cflags = [
    "-mabi=aapcs",
    "-mcpu=cortex-m3",
    "-mfloat-abi=soft",
    "-mthumb",
    "-specs=nano.specs",
    "-specs=nosys.specs",
    "-u _printf_float",
  ]

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

  toolchains = [
    # All Cortex-M3 toolchains use software-emulated floating point.
    {
      toolchain_name = "arm_gcc_cortex_m3_og"
      additional_cflags = [ "-Og" ]
    },
    {
      toolchain_name = "arm_gcc_cortex_m3_o1"
      additional_cflags = [ "-O1" ]
    },
    {
      toolchain_name = "arm_gcc_cortex_m3_o2"
      additional_cflags = [ "-O2" ]
    },
    {
      toolchain_name = "arm_gcc_cortex_m3_os"
      additional_cflags = [ "-Os" ]
    },
  ]
}

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",
    "-u _printf_float",
  ]

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

pw_doc_group("docs") {
  sources = [ "docs.rst" ]
}
