# Copyright 2021 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("//build_overrides/pigweed.gni")

# Creates a toolchain that provides no C/C++ compiler. It can be used for
# non-C/C++ languages or actions that should only happen once across all builds.
# The toolchain cannot compile C/C++, and trying to use it to is an error.
#
# Args:
#   command: Run this command if this toolchain is used to build C/C++ code.
#
template("pw_non_c_toolchain") {
  # Import the universal stamp & copy tools.
  import("$dir_pw_toolchain/universal_tools.gni")
  _label = get_label_info(":$target_name", "label_no_toolchain")

  # If the user tries to build a target with this toolchain, run a script that
  # prints out an error.
  _message =
      "Attempted to use the $target_name toolchain to compile {{source}}.\n" +
      "This toolchain cannot be used to compile C/C++ source code.\n\n" +
      "This toolchain was either explicitly specified in a deps list with\n" +
      "GN's :target($_label) syntax or was set as the\n" +
      "default toolchain in the BUILDCONFIG.gn file.\n\n" +
      "Ensure that no C/C++ GN targets are referred to with this toolchain,\n" +
      "even transitively.\n\n" +
      "See https://pigweed.dev/pw_toolchain for more information."

  _command = string_join(" ",
                         [
                           "python",
                           rebase_path("$dir_pw_build/py/pw_build/error.py"),
                           "--message \"$_message\"",
                           "--target",
                           _label,
                           "--root",
                           rebase_path("//"),
                           "--out",
                           rebase_path(root_build_dir),
                         ])

  if (defined(invoker.command)) {
    _command = invoker.command
  } else {
    not_needed([ "invoker" ])
  }

  toolchain(target_name) {
    tool("stamp") {
      forward_variables_from(pw_universal_stamp, "*")
    }

    tool("copy") {
      forward_variables_from(pw_universal_copy, "*")
    }

    tool("asm") {
      command = _command
      outputs =
          [ "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o" ]
    }

    tool("cc") {
      command = _command
      outputs =
          [ "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o" ]
    }

    tool("cxx") {
      command = _command
      outputs =
          [ "{{source_out_dir}}/{{target_output_name}}.{{source_file_part}}.o" ]
    }

    # Can't use {{source}} for the linker, so replace it if it's in the command.
    _command_no_source = string_replace(_command, "{{source}}", "C/C++ sources")

    tool("link") {
      command = _command_no_source
      outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
    }

    tool("alink") {
      command = _command_no_source
      outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
    }

    tool("solink") {
      command = _command_no_source
      outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}" ]
    }
  }
}
