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

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