Commit c40a21f3 by Brian Sheedy Committed by Commit Bot

Add export_targets.py to presubmit

Adds export_targets.py to run as part of presubmit in order to help prevent breaking Firefox with BUILD.gn changes. Bug: chromium:1003151 Change-Id: I5a7ab00891cd7c094c797e6150f642f803a726b6 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1802038 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarYuly Novikov <ynovikov@chromium.org>
parent dce09168
......@@ -7,7 +7,10 @@ See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
for more details on the presubmit API built into depot_tools.
"""
from subprocess import call
import os
import shutil
import subprocess
import tempfile
# Fragment of a regular expression that matches C++ and Objective-C++ implementation files.
_IMPLEMENTATION_EXTENSIONS = r'\.(cc|cpp|cxx|mm)$'
......@@ -15,6 +18,13 @@ _IMPLEMENTATION_EXTENSIONS = r'\.(cc|cpp|cxx|mm)$'
# Fragment of a regular expression that matches C++ and Objective-C++ header files.
_HEADER_EXTENSIONS = r'\.(h|hpp|hxx)$'
_PRIMARY_EXPORT_TARGETS = [
'//:libEGL',
'//:libGLESv1_CM',
'//:libGLESv2',
'//:translator',
]
def _CheckChangeHasBugField(input_api, output_api):
"""Requires that the changelist have a Bug: field."""
......@@ -102,12 +112,42 @@ def _CheckNewHeaderWithoutGnChange(input_api, output_api):
return []
def _CheckExportValidity(input_api, output_api):
outdir = tempfile.mkdtemp()
try:
try:
subprocess.check_output(['gn', 'gen', outdir])
except subprocess.CalledProcessError as e:
return [
output_api.PresubmitError(
'Unable to run gn gen for export_targets.py: %s' % e.output)
]
export_target_script = os.path.join(input_api.PresubmitLocalPath(), 'scripts',
'export_targets.py')
try:
subprocess.check_output(
['vpython3', export_target_script, outdir] + _PRIMARY_EXPORT_TARGETS,
stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
if input_api.is_committing:
return [output_api.PresubmitError('export_targets.py failed: %s' % e.output)]
return [
output_api.PresubmitPromptWarning(
'export_targets.py failed, this may just be due to your local checkout: %s' %
e.output)
]
return []
finally:
shutil.rmtree(outdir)
def CheckChangeOnUpload(input_api, output_api):
results = []
results.extend(_CheckCodeGeneration(input_api, output_api))
results.extend(_CheckChangeHasBugField(input_api, output_api))
results.extend(input_api.canned_checks.CheckChangeHasDescription(input_api, output_api))
results.extend(_CheckNewHeaderWithoutGnChange(input_api, output_api))
results.extend(_CheckExportValidity(input_api, output_api))
results.extend(
input_api.canned_checks.CheckPatchFormatted(
input_api, output_api, result_factory=output_api.PresubmitError))
......@@ -121,5 +161,6 @@ def CheckChangeOnCommit(input_api, output_api):
input_api.canned_checks.CheckPatchFormatted(
input_api, output_api, result_factory=output_api.PresubmitError))
results.extend(_CheckChangeHasBugField(input_api, output_api))
results.extend(_CheckExportValidity(input_api, output_api))
results.extend(input_api.canned_checks.CheckChangeHasDescription(input_api, output_api))
return results
......@@ -107,7 +107,7 @@ print('Importing graph', file=sys.stderr)
try:
p = run_checked('gn', 'desc', '--format=json', str(OUT_DIR), '*', stdout=subprocess.PIPE,
shell=True, env=GN_ENV)
env=GN_ENV, shell=(True if sys.platform == 'win32' else False))
except subprocess.CalledProcessError:
sys.stderr.buffer.write(b'`gn` failed. Is depot_tools in your PATH?\n')
exit(1)
......@@ -157,8 +157,17 @@ INCLUDE_REGEX = re.compile(b'(?:^|\\n) *# *include +([<"])([^>"]+)[>"]')
assert INCLUDE_REGEX.match(b'#include "foo"')
assert INCLUDE_REGEX.match(b'\n#include "foo"')
# Most of these are ignored because this script does not currently handle
# #includes in #ifdefs properly, so they will erroneously be marked as being
# included, but not part of the source list.
IGNORED_INCLUDES = {
b'compiler/translator/TranslatorESSL.h',
b'compiler/translator/TranslatorGLSL.h',
b'compiler/translator/TranslatorHLSL.h',
b'compiler/translator/TranslatorVulkan.h',
b'libANGLE/renderer/d3d/DeviceD3D.h',
b'libANGLE/renderer/d3d/DisplayD3D.h',
b'libANGLE/renderer/d3d/RenderTargetD3D.h',
b'libANGLE/renderer/d3d/d3d11/winrt/NativeWindow11WinRT.h',
b'libANGLE/renderer/gl/glx/DisplayGLX.h',
b'libANGLE/renderer/gl/cgl/DisplayCGL.h',
......@@ -188,7 +197,21 @@ IGNORED_INCLUDE_PREFIXES = {
b'X11',
}
IGNORED_DIRECTORIES = {
'//third_party/glslang',
'//third_party/spirv-tools',
'//third_party/SwiftShader',
'//third_party/vulkan-headers',
'//third_party/vulkan-loader',
'//third_party/vulkan-tools',
'//third_party/vulkan-validation-layers',
}
def has_all_includes(target_name: str, descs: dict) -> bool:
for ignored_directory in IGNORED_DIRECTORIES:
if target_name.startswith(ignored_directory):
return True
flat = flattened_target(target_name, descs, stop_at_lib=False)
acceptable_sources = flat.get('sources', []) + flat.get('outputs', [])
acceptable_sources = {x.rsplit('/', 1)[-1].encode() for x in acceptable_sources}
......@@ -262,7 +285,6 @@ for (k,desc) in out.items():
for dep_name in set(desc['deps']):
dep = descs[dep_name]
if dep['type'] in LIBRARY_TYPES:
assert dep_name.startswith('//:'), dep_name
dep_libs.add(dep_name[3:])
desc['deps'] = sortedi(dep_libs)
......
......@@ -160,6 +160,7 @@ if (angle_swiftshader) {
action("angle_swiftshader_icd") {
deps = [
":angle_swiftshader_icd_rename",
"$angle_root/third_party/vulkan-headers/src:vulkan_headers",
]
script = "$angle_root/scripts/generate_vulkan_layers_json.py"
sources = [
......
......@@ -16,6 +16,7 @@ util_sources = [
"util/util_export.h",
"util/util_gl.h",
"util/Event.h",
"util/EGLPlatformParameters.h",
"util/EGLWindow.cpp",
"util/EGLWindow.h",
"util/Matrix.cpp",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment