# 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.

import("../scripts/dawn_overrides_with_defaults.gni")
import("generator_lib.gni")

# Dawn used to put autogenerated files in a lot of different places. When we
# started to move them around, some compilation issues arised because some
# stale include files stayed in the build directory and were picked up.
# To counter this, now Dawn does the following:
#
#  1. The generated output file directory structure has to match the structure
#    of the source tree, starting at dawn_gen_root (gen/ or
#    gen/third_party/dawn depending on where we are).
#  2. src/include and dawn_gen_root/src/include has to match the structure of
#    the source tree too.
#  3. Dawn files must use include relative to src/ or src/include such as
#    "dawn/dawn.h" or "dawn_native/backend/BackendStuff.h".
#
# The allowed list below ensure 1). Include directory rules for Dawn ensure 3)
# and 2) is something we need to enforce in code review.
#
# However GN's toolchains automatically add some include directories for us
# which breaks 3) slightly. To avoid stale headers in for example
# dawn_gen_root/src/dawn/dawn/ to be picked up (instead of
# dawn_gen_root/src/dawn), we have a special action that removes files in
# disallowed gen directories.

dawn_allowed_gen_output_dirs = [
  "src/dawn/",
  "src/dawn_native/",
  "src/dawn_native/opengl/",
  "src/dawn_wire/client/",
  "src/dawn_wire/server/",
  "src/dawn_wire/",
  "src/include/dawn/",
  "emscripten-bits/",
  "webgpu-headers/",
]

# Template to help invoking Dawn code generators based on generator_lib
#
#   dawn_generator("my_target_gen") {
#     # The script and generator specific arguments
#     script = [ "my_awesome_generator.py" ]
#     args = [
#       "--be-awesome",
#       "yes"
#     ]
#
#     # The list of expected outputs, generation fails if there's a mismatch
#     outputs = [
#       "MyAwesomeTarget.cpp",
#       "MyAwesomeTarget.h",
#     ]
#   }
#
# Using the generated files is done like so:
#
#   shared_library("my_target") {
#     deps = [ ":my_target_gen "]
#     sources = get_target_outputs(":my_target_gen")
#   }
#
template("dawn_generator") {
  generator_lib_action(target_name) {
    forward_variables_from(invoker, "*")

    # Set arguments required to find the python libraries for the generator
    generator_lib_dir = "${dawn_root}/generator"
    jinja2_path = dawn_jinja2_dir

    # Force Dawn's autogenerated file structure to mirror exactly the source
    # tree but start at ${dawn_gen_root} instead of ${dawn_root}
    allowed_output_dirs = dawn_allowed_gen_output_dirs
    custom_gen_dir = dawn_gen_root

    # Make sure that we delete stale autogenerated file in directories that are
    # no longer used by code generation to avoid include conflicts.
    deps = [ "${dawn_root}/generator:remove_stale_autogen_files" ]
  }
}

# Helper generator for calling the generator from dawn.json
#
#   dawn_json_generator("my_target_gen") {
#     # Which generator target to output
#     target = "my_target"
#
#     # Also supports `outputs` and `custom_gen_dir` like dawn_generator.
#   }
template("dawn_json_generator") {
  dawn_generator(target_name) {
    script = "${dawn_root}/generator/dawn_json_generator.py"

    # The base arguments for the generator: from this dawn.json, generate this
    # target using templates in this directory.
    args = [
      "--dawn-json",
      rebase_path("${dawn_root}/dawn.json", root_build_dir),
      "--wire-json",
      rebase_path("${dawn_root}/dawn_wire.json", root_build_dir),
      "--targets",
      invoker.target,
    ]

    forward_variables_from(invoker, "*", [ "target" ])
  }
}
