# 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. include and dawn_gen_root/include has to match the structure of # the source tree too. # 3. Dawn files must use include relative to src/ or 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/", "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" ]) } }