# Copyright 2018 Google, LLC
#
# Permission is hereby granted, free of charge, to any person obtaining a
# copy of this software and associated documentation files (the "Software"),
# to deal in the Software without restriction, including without limitation
# the rights to use, copy, modify, merge, publish, distribute, sublicense,
# and/or sell copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice (including the next
# paragraph) shall be included in all copies or substantial portions of the
# Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
# IN THE SOFTWARE.

import("//build/python/python_binary.gni")
import("//src/graphics/lib/magma/gnbuild/magma.gni")

mesa_build_root = "//third_party/mesa"

template("mesa_source_set") {
  source_set(target_name) {
    # Can't forward configs because doing so overwrites the default
    # configs specified by the build system.
    forward_variables_from(invoker, "*", [ "configs" ])
    if (!defined(public_configs)) {
      public_configs = []
    }
    public_configs += [ "//third_party/mesa/src:common_config" ]
    if (defined(invoker.configs)) {
      configs += invoker.configs
    }
  }
}

# Executes a python script and writes its output to a file.
#
# Example
#
#   mesa_python_stdout_to_file_action("opcodes.c") {
#     output = "opcodes.c"
#     script = "opcodes_c.py"
#     sources = [ "opcodes_lib.py" ]
#     libraries = [ "//third_party/mako" ]
#   }
#
# Parameters
#
#   script (required)
#     The .py file that will be interpreted.
#     Type: path
#
#   output (required)
#     Path to the output file. Assumed to be relative to ${target_gen_dir}.
#     Type: path
#
#   sources (optional)
#     Extra .py source files script imports.
#     Type: list(path)
#     Default: empty list
#
#   libraries (optional)
#     Paths to python_libraries script imports.
#     Type: list(string)
#     Default: empty list
#
#   args (optional)
#     Arguments to pass to the script.
#     Type: list(str)
#     Default: empty list
#
#   deps
#   inputs
#   testonly
#   visibility
template("mesa_python_stdout_to_file_action") {
  assert(defined(invoker.script), "script is required")
  assert(defined(invoker.output), "output is required")

  py_binary_target = "${target_name}_py_binary"
  python_binary(py_binary_target) {
    forward_variables_from(invoker,
                           [
                             "sources",
                             "testonly",
                           ])
    main_source = invoker.script
    if (defined(invoker.libraries)) {
      deps = invoker.libraries
    }
    visibility = [ ":*" ]
  }

  action(target_name) {
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "visibility",
                             "inputs",
                           ])

    script = "${mesa_build_root}/scripts/gn_script_wrapper.sh"
    outputs = [ "${target_gen_dir}/${invoker.output}" ]

    py_binary = get_target_outputs(":${py_binary_target}")
    assert(py_binary == [ py_binary[0] ],
           "${py_binary_target} should only have one output")
    py_binary = py_binary[0]
    sources = [ py_binary ]

    args = [
      rebase_path(python_exe_src, root_build_dir),

      # TODO(jayzhuang): remove this arg after migrating mesa_python_action.
      magma_python_path,
      rebase_path(outputs[0], root_build_dir),
      rebase_path(py_binary, root_build_dir),
    ]
    if (defined(invoker.args)) {
      args += invoker.args
    }

    deps = [ ":${py_binary_target}" ]
    if (defined(invoker.deps)) {
      deps += invoker.deps
    }
  }
}

# Executes a python script with PYTHONPATH=${magma_python_path}
#
# Parameters
# Same as for action().

template("mesa_python_action") {
  action(target_name) {
    forward_variables_from(invoker,
                           "*",
                           [
                             "args",
                             "inputs",
                             "script",
                           ])

    script = "${mesa_build_root}/scripts/gn_script_wrapper.sh"

    args = [
      rebase_path(python_exe_src, root_build_dir),
      magma_python_path,

      # path to write stdout to, which we don't need.
      "/dev/stdout",
      rebase_path(invoker.script, root_build_dir),
    ]
    if (defined(invoker.args)) {
      args += invoker.args
    }

    inputs = [
      invoker.script,

      # Some file that we can use as a signal that the other files
      # in magma_python_path have changed.
      "${magma_python_path}/doc/build/changelog.rst",
    ]
    if (defined(invoker.inputs)) {
      inputs += invoker.inputs
    }
  }
}
