# 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 a host Linux 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("host_gcc") {
  _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)

  # Specify the default C++ version, which targets can override with a config.
  _toolchain_cflags_cc = "-std=c++17 -Wno-register"

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

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

  toolchain(target_name) {
    tool("asm") {
      depfile = "{{output}}.d"
      command = string_join(" ",
                            [
                              "$_cc",
                              "-MMD -MF $depfile",
                              _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",
                              _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(" ",
                            [
                              "$_cxx",
                              "-MMD -MF $depfile",
                              _toolchain_cflags_cc,
                              _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_flags = [
      "$_cxx",
      "{{ldflags}}",

      _toolchain_cflags,
      _toolchain_ldflags,

      "{{inputs}}",
      "{{libs}}",

      "-o $_link_outfile",
    ]

    _link_mapfile = "{{output_dir}}/{{target_output_name}}.map"

    if (host_os == "mac") {
      _link_flags += [
        # Output a map file that shows symbols and their location.
        "-Wl,-map,$_link_mapfile",

        # Delete unreferenced sections. Helpful with -ffunction-sections.
        "-Wl,-dead_strip",
      ]
    } else {
      _link_flags += [
        # Output a map file that shows symbols and their location.
        "-Wl,-Map,$_link_mapfile",

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

    _link_command = string_join(" ", _link_flags)

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

    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") {
      if (host_os == "win") {
        command = "cmd /c type nul > \"{{output}}\""
      } else {
        command = "touch {{output}}"
      }
      description = "stamp {{output}}"
    }

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