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: Yuly Novikov <ynovikov@chromium.org>
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index de83d12..3c8bf04 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -7,7 +7,10 @@
 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 @@
 # 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 @@
     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 @@
         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