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

# Generates an arm-eabi-none gcc toolchain for a specific target.
#
# Args:
#   toolchain_cflags: Additional C/C++ compiler flags for the target.
#   toolchain_ldflags: Additional linker flags for the target.
template("arm_gcc_toolchain") {
  _cflags_list = [
    # Colorize output. Ninja's GCC invocation disables color by default.
    "-fdiagnostics-color",

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

  if (defined(invoker.toolchain_cflags)) {
    _cflags_list += invoker.toolchain_cflags
  }

  _toolchain_cflags = string_join(" ", _cflags_list)

  _toolchain_ldflags = ""
  if (defined(invoker.toolchain_ldflags)) {
    _toolchain_ldflags += string_join(" ", invoker.toolchain_ldflags)
  }

  # TODO(frolv): This assumes that the ARM gcc toolchain is in the PATH.
  # It should be updated to point to the prebuilt path within the source tree
  # once that is added.
  _tool_name_root = "arm-none-eabi-"

  _ar = _tool_name_root + "ar"
  _cc = _tool_name_root + "gcc"
  _cxx = _tool_name_root + "g++"

  toolchain(target_name) {
    tool("asm") {
      depfile = "{{output}}.d"
      command = string_join(" ",
                            [
                              _cc,
                              "-MMD -MF $depfile",  # Write out dependencies.
                              _toolchain_cflags,
                              "{{defines}}",
                              "{{include_dirs}}",
                              "{{asmflags}}",
                              "-c {{source}}",
                              "-o {{output}}",
                            ])
      depsformat = "gcc"
      description = "as {{output}}"
      outputs = [
        # Use {{source_file_part}}, which includes the extension, instead of
        # {{source_name_part}} so that object files created from <file_name>.c
        # and <file_name>.cc sources are unique.
        "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o",
      ]
    }

    tool("cc") {
      depfile = "{{output}}.d"
      command = string_join(" ",
                            [
                              _cc,
                              "-MMD -MF $depfile",  # Write out dependencies.
                              _toolchain_cflags,
                              "{{defines}}",
                              "{{include_dirs}}",
                              "{{cflags}}",
                              "{{cflags_c}}",
                              "-c {{source}}",
                              "-o {{output}}",
                            ])
      depsformat = "gcc"
      description = "cc {{output}}"
      outputs = [
        "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o",
      ]
    }

    tool("cxx") {
      depfile = "{{output}}.d"
      command = string_join(" ",
                            [
                              _cc,
                              "-MMD -MF $depfile",  # Write out dependencies.
                              _toolchain_cflags,
                              "{{defines}}",
                              "{{include_dirs}}",
                              "{{cflags}}",
                              "{{cflags_cc}}",
                              "-c {{source}}",
                              "-o {{output}}",
                            ])
      depsformat = "gcc"
      description = "c++ {{output}}"
      outputs = [
        "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o",
      ]
    }

    tool("alink") {
      command = "rm -f {{output}} && $_ar rcs {{output}} {{inputs}}"
      description = "ar {{target_output_name}}{{output_extension}}"
      outputs = [
        "{{target_out_dir}}/{{target_output_name}}{{output_extension}}",
      ]
      default_output_extension = ".a"
    }

    lib_switch = "-l"
    lib_dir_switch = "-L"

    _link_outfile = "{{output_dir}}/{{target_output_name}}{{output_extension}}"
    _link_mapfile = "{{output_dir}}/{{target_output_name}}.map"
    _link_command = string_join(
            " ",
            [
              _cxx,
              "{{ldflags}}",

              # Delete unreferenced sections. Helpful with -ffunction-sections.
              "-Wl,--gc-sections",

              # Output a map file that shows symbols and their location.
              "-Wl,-Map=$_link_mapfile",

              _toolchain_cflags,
              _toolchain_ldflags,

              "{{inputs}}",

              # Load all object files from all libraries to resolve symbols.
              # Short of living in the ideal world where all dependency graphs
              # among static libs are acyclic and all developers diligently
              # express such graphs in terms that GN understands, this is the
              # safest option.
              # Make sure you use this with --gc-sections, otherwise the
              # resulting binary will contain every symbol defined in every
              # input file and every static library. That could be quite a lot.
              "-Wl,--whole-archive",
              "{{libs}}",
              "-Wl,--no-whole-archive",

              "-o $_link_outfile",
            ])

    tool("link") {
      command = _link_command
      description = "ld $_link_outfile"
      outputs = [
        _link_outfile,
      ]
      default_output_dir = "{{target_out_dir}}"
      default_output_extension = ".elf"
    }

    tool("solink") {
      command = _link_command + " -shared"
      description = "ld -shared $_link_outfile"
      outputs = [
        _link_outfile,
      ]
      default_output_dir = "{{target_out_dir}}"
      default_output_extension = ".so"
    }

    tool("stamp") {
      command = "touch {{output}}"
      description = "stamp {{output}}"
    }

    tool("copy") {
      command = "cp -af {{source}} {{output}}"
      description = "cp {{source}} {{output}}"
    }
  }
}
