# Copyright 2019 The Dawn 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
#
#     http://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.

# Template to help invoking code generators based on generator_lib.py
# Internal use only, this should only be called from templates implementing
# generator-specific actions.
#
# Variables:
#   script: Path to generator script.
#
#   args: List of extra command-line arguments passed to the generator.
#
#   outputs: List of expected outputs, generation will fail if there is a
#     mistmatch.
#
#   deps: additional deps for the code generation targets.
#
#   generator_lib_dir: directory where generator_lib.py is located.
#
#   custom_gen_dir: Optional custom target gen dir. Defaults to $target_gen_dir
#     but allows output files to not depend on the location of the BUILD.gn
#     that generates them.
#
#   template_dir: Optional template root directory. Defaults to
#     "${generator_lib_dir}/templates".
#
#   jinja2_path: Optional Jinja2 installation path.
#
#   root_dir: Optional root source dir for Python dependencies
#     computation. Defaults to "${generator_lib_dir}/..". Any dependency
#     outside of this directory is considered a system file and will be
#     omitted.
#
template("generator_lib_action") {
  _generator_args = []
  if (defined(invoker.args)) {
    _generator_args += invoker.args
  }

  assert(defined(invoker.generator_lib_dir),
         "generator_lib_dir must be defined before calling this action!")

  _template_dir = "${invoker.generator_lib_dir}/templates"
  if (defined(invoker.template_dir)) {
    _template_dir = invoker.template_dir
  }
  _generator_args += [
    "--template-dir",
    rebase_path(_template_dir, root_build_dir),
  ]

  if (defined(invoker.root_dir)) {
    _generator_args += [
      "--root-dir",
      rebase_path(_root_dir, root_build_dir),
    ]
  }

  if (defined(invoker.jinja2_path)) {
    _generator_args += [
      "--jinja2-path",
      rebase_path(invoker.jinja2_path, root_build_dir),
    ]
  }

  # Chooses either the default gen_dir or the custom one required by the
  # invoker. This allows moving the definition of code generators in different
  # BUILD.gn files without changing the location of generated file. Without
  # this generated headers could cause issues when old headers aren't removed.
  _gen_dir = target_gen_dir
  if (defined(invoker.custom_gen_dir)) {
    _gen_dir = invoker.custom_gen_dir
  }

  # For build parallelism GN wants to know the exact inputs and outputs of
  # action targets like we use for our code generator. We avoid asking the
  # generator about its inputs by using the "depfile" feature of GN/Ninja.
  #
  # A ninja limitation is that the depfile is a subset of Makefile that can
  # contain a single target, so we output a single "JSON-tarball" instead.
  _json_tarball = "${_gen_dir}/${target_name}.json_tarball"
  _json_tarball_target = "${target_name}__json_tarball"
  _json_tarball_depfile = "${_json_tarball}.d"

  _generator_args += [
    "--output-json-tarball",
    rebase_path(_json_tarball, root_build_dir),
    "--depfile",
    rebase_path(_json_tarball_depfile, root_build_dir),
  ]

  # After the JSON tarball is created we need an action target to extract it
  # with a list of its outputs. The invoker provided a list of expected
  # outputs. To make sure the list is in sync between the generator and the
  # build files, we write it to a file and ask the generator to assert it is
  # correct.
  _expected_outputs_file = "${_gen_dir}/${target_name}.expected_outputs"
  write_file(_expected_outputs_file, invoker.outputs)

  _generator_args += [
    "--expected-outputs-file",
    rebase_path(_expected_outputs_file, root_build_dir),
  ]

  # The code generator invocation that will write the JSON tarball, check the
  # outputs are what's expected and write a depfile for Ninja.
  action(_json_tarball_target) {
    script = invoker.script
    outputs = [ _json_tarball ]
    depfile = _json_tarball_depfile
    args = _generator_args
    if (defined(invoker.deps)) {
      deps = invoker.deps
    }
  }

  # Extract the JSON tarball into the gen_dir
  action(target_name) {
    script = "${invoker.generator_lib_dir}/extract_json.py"
    args = [
      rebase_path(_json_tarball, root_build_dir),
      rebase_path(_gen_dir, root_build_dir),
    ]

    deps = [ ":${_json_tarball_target}" ]
    inputs = [ _json_tarball ]

    # The expected output list is relative to the gen_dir but action
    # target outputs are from the root dir so we need to rebase them.
    outputs = []
    foreach(source, invoker.outputs) {
      outputs += [ "${_gen_dir}/${source}" ]
    }
  }
}
