# 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 clang 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_clang") {
  # Toolchain C flags
  _cflags_list = [
    # Colorize output. Ninja's Clang invocation disables color by default.
    "-fdiagnostics-color",
  ]
  if (defined(invoker.toolchain_cflags)) {
    _cflags_list += invoker.toolchain_cflags
  }

  if (host_os == "mac") {
    _xcode_sysroot = exec_script("$dir_pw_build/py/exec.py",
                                 [
                                   "--",
                                   "/usr/bin/xcrun",
                                   "--show-sdk-path",
                                 ],
                                 "trim string")
    _cflags_list += [ "--sysroot=$_xcode_sysroot" ]
  }

  _toolchain_cflags = string_join(" ", _cflags_list)

  # Toolchain LD flags
  _toolchain_ldflags = ""
  if (defined(invoker.toolchain_ldflags)) {
    _toolchain_ldflags = string_join(" ", invoker.toolchain_ldflags)
  }

  # Note: On macOS, there is no "llvm-ar", only "ar", which happens to be LLVM
  # ar. This should get updated for linux systems.
  _ar = "ar"
  _cc = "clang"
  _cxx = "clang++"

  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 = [
        "{{source_out_dir}}/{{target_output_name}}.{{source_name_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_name_part}}.o",
      ]
    }

    tool("cxx") {
      depfile = "{{output}}.d"
      command = string_join(" ",
                            [
                              "$_cxx",
                              "-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_name_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 == "linux") {
      _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",
      ]
    } else 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",
      ]
    }

    _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") {
      command = "touch {{output}}"
      description = "stamp {{output}}"
    }

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