Delete the remove_stale_autogen_files mechanism.
Previously when moving around directories for generated files, Dawn ran into an issue where stale files where #included instead of the new ones, causing compilation failures. To get around this a remove_stale_autogen_files mechanism was added that scans the gen/ directory for files not in an allow-list of directories. This mechanism is now causing problems for bringing up Dawn standalone tests on Android as these test also generate files in Dawn's gen/ directories, and their files get deleted by remove_stale_autogen_files. We are not foresseing any additional shuffling of directories and it's safe to expect that all stale files have been removed from CI builder caches at this time. So remove_stale_autogen_files can go. This is what this CL does. Fixed: dawn:1543 Change-Id: I7dbf1eae6c55b7659f3837b6d4a565052001ce57 Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/103040 Reviewed-by: Austin Eng <enga@chromium.org> Commit-Queue: Corentin Wallez <cwallez@chromium.org>
This commit is contained in:
parent
eebb7d5e52
commit
30f51b94da
|
@ -1,63 +0,0 @@
|
||||||
# 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("dawn_generator.gni")
|
|
||||||
|
|
||||||
# The list of directories in which to check for stale autogenerated files.
|
|
||||||
# It should include the list of all directories in which we ever generated
|
|
||||||
# files but we can't just put dawn_gen_root because there are more than
|
|
||||||
# autogenerated sources there.
|
|
||||||
_stale_dirs = [
|
|
||||||
"dawn",
|
|
||||||
"dawn/native",
|
|
||||||
"dawn/wire",
|
|
||||||
"mock",
|
|
||||||
"src",
|
|
||||||
]
|
|
||||||
|
|
||||||
_allowed_output_dirs_file =
|
|
||||||
"${dawn_gen_root}/removed_stale_autogen_files.allowed_output_dirs"
|
|
||||||
write_file(_allowed_output_dirs_file, dawn_allowed_gen_output_dirs)
|
|
||||||
|
|
||||||
_stale_dirs_file = "${dawn_gen_root}/removed_stale_autogen_files.stale_dirs"
|
|
||||||
write_file(_stale_dirs_file, _stale_dirs)
|
|
||||||
|
|
||||||
_stamp_file = "${dawn_gen_root}/removed_stale_autogen_files.stamp"
|
|
||||||
|
|
||||||
# An action that removes autogenerated files that aren't in allowed directories
|
|
||||||
# see dawn_generator.gni for more details.
|
|
||||||
action("remove_stale_autogen_files") {
|
|
||||||
script = "remove_files.py"
|
|
||||||
args = [
|
|
||||||
"--root-dir",
|
|
||||||
rebase_path(dawn_gen_root, root_build_dir),
|
|
||||||
"--allowed-output-dirs-file",
|
|
||||||
rebase_path(_allowed_output_dirs_file, root_build_dir),
|
|
||||||
"--stale-dirs-file",
|
|
||||||
rebase_path(_stale_dirs_file, root_build_dir),
|
|
||||||
"--stamp",
|
|
||||||
rebase_path(_stamp_file, root_build_dir),
|
|
||||||
]
|
|
||||||
|
|
||||||
# Have the "list of file" inputs as a dependency so that the action reruns
|
|
||||||
# as soon as they change.
|
|
||||||
inputs = [
|
|
||||||
_allowed_output_dirs_file,
|
|
||||||
_stale_dirs_file,
|
|
||||||
]
|
|
||||||
|
|
||||||
# Output a stamp file so we don't re-run this action on every build.
|
|
||||||
outputs = [ _stamp_file ]
|
|
||||||
}
|
|
|
@ -15,41 +15,6 @@
|
||||||
import("../scripts/dawn_overrides_with_defaults.gni")
|
import("../scripts/dawn_overrides_with_defaults.gni")
|
||||||
import("generator_lib.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/common/",
|
|
||||||
"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
|
# Template to help invoking Dawn code generators based on generator_lib
|
||||||
#
|
#
|
||||||
# dawn_generator("my_target_gen") {
|
# dawn_generator("my_target_gen") {
|
||||||
|
@ -84,12 +49,7 @@ template("dawn_generator") {
|
||||||
|
|
||||||
# Force Dawn's autogenerated file structure to mirror exactly the source
|
# Force Dawn's autogenerated file structure to mirror exactly the source
|
||||||
# tree but start at ${dawn_gen_root} instead of ${dawn_root}
|
# 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
|
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" ]
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,11 +37,6 @@
|
||||||
#
|
#
|
||||||
# jinja2_path: Optional Jinja2 installation path.
|
# jinja2_path: Optional Jinja2 installation path.
|
||||||
#
|
#
|
||||||
# allowed_output_dirs: Optional list of directories that are the only
|
|
||||||
# directories in which files of `outputs` are allowed to be (and not
|
|
||||||
# in children directories). Generation will fail if an output isn't
|
|
||||||
# in a directory in the list.
|
|
||||||
#
|
|
||||||
# root_dir: Optional root source dir for Python dependencies
|
# root_dir: Optional root source dir for Python dependencies
|
||||||
# computation. Defaults to "${generator_lib_dir}/..". Any dependency
|
# computation. Defaults to "${generator_lib_dir}/..". Any dependency
|
||||||
# outside of this directory is considered a system file and will be
|
# outside of this directory is considered a system file and will be
|
||||||
|
@ -118,19 +113,6 @@ template("generator_lib_action") {
|
||||||
rebase_path(_expected_outputs_file, root_build_dir),
|
rebase_path(_expected_outputs_file, root_build_dir),
|
||||||
]
|
]
|
||||||
|
|
||||||
# Check that all of the outputs are in a directory that's allowed. This is
|
|
||||||
# useful to keep the list of directories in sink with other parts of the
|
|
||||||
# build.
|
|
||||||
if (defined(invoker.allowed_output_dirs)) {
|
|
||||||
_allowed_output_dirs_file = "${_gen_dir}/${target_name}.allowed_output_dirs"
|
|
||||||
write_file(_allowed_output_dirs_file, invoker.allowed_output_dirs)
|
|
||||||
|
|
||||||
_generator_args += [
|
|
||||||
"--allowed-output-dirs-file",
|
|
||||||
rebase_path(_allowed_output_dirs_file, root_build_dir),
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
# The code generator invocation that will write the JSON tarball, check the
|
# The code generator invocation that will write the JSON tarball, check the
|
||||||
# outputs are what's expected and write a depfile for Ninja.
|
# outputs are what's expected and write a depfile for Ninja.
|
||||||
action(_json_tarball_target) {
|
action(_json_tarball_target) {
|
||||||
|
|
|
@ -258,12 +258,6 @@ def run_generator(generator):
|
||||||
type=str,
|
type=str,
|
||||||
help=('Optional source root directory for Python dependency '
|
help=('Optional source root directory for Python dependency '
|
||||||
'computations'))
|
'computations'))
|
||||||
parser.add_argument(
|
|
||||||
'--allowed-output-dirs-file',
|
|
||||||
default=None,
|
|
||||||
type=str,
|
|
||||||
help=("File containing a list of allowed directories where files "
|
|
||||||
"can be output."))
|
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
'--print-cmake-dependencies',
|
'--print-cmake-dependencies',
|
||||||
default=False,
|
default=False,
|
||||||
|
@ -326,32 +320,6 @@ def run_generator(generator):
|
||||||
|
|
||||||
outputs = _do_renders(renders, args.template_dir)
|
outputs = _do_renders(renders, args.template_dir)
|
||||||
|
|
||||||
# The caller wants to assert that the outputs are only in specific
|
|
||||||
# directories.
|
|
||||||
if args.allowed_output_dirs_file != None:
|
|
||||||
with open(args.allowed_output_dirs_file) as f:
|
|
||||||
allowed_dirs = set([line.strip() for line in f.readlines()])
|
|
||||||
|
|
||||||
for directory in allowed_dirs:
|
|
||||||
if not directory.endswith('/'):
|
|
||||||
print('Allowed directory entry "{}" doesn\'t '
|
|
||||||
'end with /'.format(directory))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
def check_in_subdirectory(path, directory):
|
|
||||||
return path.startswith(
|
|
||||||
directory) and not '/' in path[len(directory):]
|
|
||||||
|
|
||||||
for render in renders:
|
|
||||||
if not any(
|
|
||||||
check_in_subdirectory(render.output, directory)
|
|
||||||
for directory in allowed_dirs):
|
|
||||||
print('Output file "{}" is not in the allowed directory '
|
|
||||||
'list below:'.format(render.output))
|
|
||||||
for directory in sorted(allowed_dirs):
|
|
||||||
print(' "{}"'.format(directory))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
# Output the JSON tarball
|
# Output the JSON tarball
|
||||||
if args.output_json_tarball != None:
|
if args.output_json_tarball != None:
|
||||||
json_root = {}
|
json_root = {}
|
||||||
|
|
|
@ -1,91 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
# 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 argparse, glob, os, sys
|
|
||||||
|
|
||||||
|
|
||||||
def check_in_subdirectory(path, directory):
|
|
||||||
return path.startswith(directory) and not '/' in path[len(directory):]
|
|
||||||
|
|
||||||
|
|
||||||
def check_is_allowed(path, allowed_dirs):
|
|
||||||
return any(
|
|
||||||
check_in_subdirectory(path, directory) for directory in allowed_dirs)
|
|
||||||
|
|
||||||
|
|
||||||
def get_all_files_in_dir(find_directory):
|
|
||||||
result = []
|
|
||||||
for (directory, _, files) in os.walk(find_directory):
|
|
||||||
result += [os.path.join(directory, filename) for filename in files]
|
|
||||||
return result
|
|
||||||
|
|
||||||
|
|
||||||
def run():
|
|
||||||
# Parse command line arguments
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description="Removes stale autogenerated files from gen/ directories.")
|
|
||||||
parser.add_argument(
|
|
||||||
'--root-dir',
|
|
||||||
type=str,
|
|
||||||
help='The root directory, all other paths in files are relative to it.'
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
'--allowed-output-dirs-file',
|
|
||||||
type=str,
|
|
||||||
help='The file containing a list of allowed directories')
|
|
||||||
parser.add_argument(
|
|
||||||
'--stale-dirs-file',
|
|
||||||
type=str,
|
|
||||||
help=
|
|
||||||
'The file containing a list of directories to check for stale files')
|
|
||||||
parser.add_argument('--stamp',
|
|
||||||
type=str,
|
|
||||||
help='A stamp written once this script completes')
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
root_dir = args.root_dir
|
|
||||||
stamp_file = args.stamp
|
|
||||||
|
|
||||||
# Load the list of allowed and stale directories
|
|
||||||
with open(args.allowed_output_dirs_file) as f:
|
|
||||||
allowed_dirs = set(
|
|
||||||
[os.path.join(root_dir, line.strip()) for line in f.readlines()])
|
|
||||||
|
|
||||||
for directory in allowed_dirs:
|
|
||||||
if not directory.endswith('/'):
|
|
||||||
print('Allowed directory entry "{}" doesn\'t end with /'.format(
|
|
||||||
directory))
|
|
||||||
return 1
|
|
||||||
|
|
||||||
with open(args.stale_dirs_file) as f:
|
|
||||||
stale_dirs = set([line.strip() for line in f.readlines()])
|
|
||||||
|
|
||||||
# Remove all files in stale dirs that aren't in the allowed dirs.
|
|
||||||
for stale_dir in stale_dirs:
|
|
||||||
stale_dir = os.path.join(root_dir, stale_dir)
|
|
||||||
|
|
||||||
for candidate in get_all_files_in_dir(stale_dir):
|
|
||||||
if not check_is_allowed(candidate, allowed_dirs):
|
|
||||||
os.remove(candidate)
|
|
||||||
|
|
||||||
# Finished! Write the stamp file so ninja knows to not run this again.
|
|
||||||
with open(stamp_file, "w") as f:
|
|
||||||
f.write("")
|
|
||||||
|
|
||||||
return 0
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
sys.exit(run())
|
|
|
@ -33,8 +33,6 @@ if (build_with_chromium) {
|
||||||
rebase_path(fuzzer_corpus_wgsl_dir, root_build_dir),
|
rebase_path(fuzzer_corpus_wgsl_dir, root_build_dir),
|
||||||
]
|
]
|
||||||
outputs = [ fuzzer_corpus_wgsl_stamp ]
|
outputs = [ fuzzer_corpus_wgsl_stamp ]
|
||||||
|
|
||||||
deps = [ "${dawn_root}/generator:remove_stale_autogen_files" ]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
tint_fuzzer_common_libfuzzer_options = [
|
tint_fuzzer_common_libfuzzer_options = [
|
||||||
|
|
|
@ -23,7 +23,6 @@ if (build_with_chromium) {
|
||||||
sources = [ "protobufs/tint_ast_fuzzer.proto" ]
|
sources = [ "protobufs/tint_ast_fuzzer.proto" ]
|
||||||
generate_python = false
|
generate_python = false
|
||||||
use_protobuf_full = true
|
use_protobuf_full = true
|
||||||
deps = [ "${dawn_root}/generator:remove_stale_autogen_files" ]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
source_set("tint_ast_fuzzer") {
|
source_set("tint_ast_fuzzer") {
|
||||||
|
|
Loading…
Reference in New Issue