# 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",
                                       root_build_dir),
                           "--message \"$_message\"",
                           "--target",
                           _label,
                           "--root",
                           rebase_path("//", root_build_dir),
                           "--out",
                           ".",
                         ])

  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}}" ]
    }
  }
}
