Add a meta-script to run code generators.

This script calls all the various GL and back-end python scripts to
generate our internal format tables and entry points, etc. It uses
a GYP-like scheme of inputs/outputs to check modified time before
running the generators. It also will automatically call 'git cl
format' if any generator was called.

Also updates the copyright in a couple of touched files.

BUG=angleproject:2207

Change-Id: I4187a7622accc1c97a8d779b8f87fe00b74855ea
Reviewed-on: https://chromium-review.googlesource.com/742372
Commit-Queue: Jamie Madill <jmadill@chromium.org>
Reviewed-by: Geoff Lang <geofflang@chromium.org>
diff --git a/scripts/run_code_generation.py b/scripts/run_code_generation.py
new file mode 100644
index 0000000..7b94428
--- /dev/null
+++ b/scripts/run_code_generation.py
@@ -0,0 +1,172 @@
+#!/usr/bin/python
+#
+# Copyright 2017 The ANGLE Project Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+#
+# run_code_reneration.py:
+#   Runs  ANGLE format table and other script run_code_renerationgeneration.
+
+import os, subprocess, sys
+
+# TODO(jmadill): Might be nice to have a standard way for scripts to return
+# their inputs and outputs rather than listing them here.
+generators = {
+    'ANGLE format': {
+        'inputs': [
+            'src/libANGLE/renderer/angle_format.py',
+            'src/libANGLE/renderer/angle_format_data.json',
+            'src/libANGLE/renderer/angle_format_map.json',
+        ],
+        'outputs': [
+            'src/libANGLE/renderer/Format_table_autogen.cpp',
+            'src/libANGLE/renderer/Format_ID_autogen.inl',
+        ],
+        'script': 'src/libANGLE/renderer/gen_angle_format_table.py',
+    },
+    'D3D11 format': {
+        'inputs': [
+            'src/libANGLE/renderer/angle_format.py',
+            'src/libANGLE/renderer/d3d/d3d11/texture_format_data.json',
+            'src/libANGLE/renderer/d3d/d3d11/texture_format_map.json',
+        ],
+        'outputs': [
+            'src/libANGLE/renderer/d3d/d3d11/texture_format_table_autogen.cpp',
+        ],
+        'script': 'src/libANGLE/renderer/d3d/d3d11/gen_texture_format_table.py',
+    },
+    'DXGI format': {
+        'inputs': [
+            'src/libANGLE/renderer/angle_format.py',
+            'src/libANGLE/renderer/angle_format_map.json',
+            'src/libANGLE/renderer/d3d/d3d11/dxgi_format_data.json',
+        ],
+        'outputs': [
+            'src/libANGLE/renderer/d3d/d3d11/dxgi_format_map_autogen.cpp',
+        ],
+        'script': 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_format_table.py',
+    },
+    'DXGI format support': {
+        'inputs': [
+            'src/libANGLE/renderer/d3d/d3d11/dxgi_support_data.json',
+        ],
+        'outputs': [
+            'src/libANGLE/renderer/d3d/d3d11/dxgi_support_table.cpp',
+        ],
+        'script': 'src/libANGLE/renderer/d3d/d3d11/gen_dxgi_support_tables.py',
+    },
+    'GL copy conversion table': {
+        'inputs': [
+            'src/libANGLE/es3_copy_conversion_formats.json',
+        ],
+        'outputs': [
+            'src/libANGLE/es3_copy_conversion_table_autogen.cpp',
+        ],
+        'script': 'src/libANGLE/gen_copy_conversion_table.py',
+    },
+    'GL entry point': {
+        'inputs': [
+            'scripts/entry_point_packed_gl_enums.json',
+            'scripts/gl.xml',
+        ],
+        'outputs': [
+            'src/libGLESv2/entry_points_gles_2_0_autogen.cpp',
+            'src/libGLESv2/entry_points_gles_2_0_autogen.h',
+            'src/libGLESv2/entry_points_gles_3_0_autogen.cpp',
+            'src/libGLESv2/entry_points_gles_3_0_autogen.h',
+        ],
+        'script': 'scripts/generate_entry_points.py',
+    },
+    'GL format map': {
+        'inputs': [
+            'src/libANGLE/es3_format_type_combinations.json',
+            'src/libANGLE/format_map_data.json',
+        ],
+        'outputs': [
+            'src/libANGLE/format_map_autogen.cpp',
+        ],
+        'script': 'src/libANGLE/gen_format_map.py',
+    },
+    'uniform type': {
+        'inputs': [],
+        'outputs': [
+            'src/common/uniform_type_info_autogen.cpp',
+        ],
+        'script': 'src/common/gen_uniform_type_table.py',
+    },
+    'OpenGL dispatch table': {
+        'inputs': [
+            'scripts/gl.xml',
+        ],
+        'outputs': [
+            'src/libANGLE/renderer/gl/DispatchTableGL_autogen.cpp',
+            'src/libANGLE/renderer/gl/DispatchTableGL_autogen.h',
+            'src/libANGLE/renderer/gl/null_functions.h',
+            'src/libANGLE/renderer/gl/null_functions.cpp',
+        ],
+        'script': 'src/libANGLE/renderer/gl/generate_gl_dispatch_table.py',
+    },
+    'packed GLenum': {
+        'inputs': [
+            'src/libANGLE/packed_gl_enums.json',
+        ],
+        'outputs': [
+            'src/libANGLE/PackedGLEnums_autogen.cpp',
+            'src/libANGLE/PackedGLEnums_autogen.h',
+        ],
+        'script': 'src/libANGLE/gen_packed_gl_enums.py',
+    },
+    'Vulkan format': {
+        'inputs': [
+            'src/libANGLE/renderer/angle_format.py',
+            'src/libANGLE/renderer/angle_format_map.json',
+            'src/libANGLE/renderer/vulkan/vk_format_map.json',
+        ],
+        'outputs': [
+            'src/libANGLE/renderer/vulkan/vk_format_table_autogen.cpp',
+        ],
+        'script': 'src/libANGLE/renderer/vulkan/gen_vk_format_table.py',
+    },
+}
+
+root_dir = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), '..'))
+any_dirty = False
+
+for name, info in sorted(generators.iteritems()):
+
+    # Set the CWD to the root ANGLE directory.
+    os.chdir(root_dir)
+
+    script = info['script']
+    dirty = False
+
+    for finput in info['inputs'] + [script]:
+        input_mtime = os.path.getmtime(finput)
+        for foutput in info['outputs']:
+            if not os.path.exists(foutput):
+                print('Output' + foutput + ' not found for ' + name + ' table')
+                dirty = True
+            else:
+                output_mtime = os.path.getmtime(foutput)
+                if input_mtime > output_mtime:
+                    dirty = True
+
+    if dirty:
+        any_dirty = True
+
+        # Set the CWD to the script directory.
+        os.chdir(os.path.dirname(os.path.abspath(script)))
+
+        print('Running ' + name + ' code generator')
+        if subprocess.call(['python', os.path.basename(script)]) != 0:
+            sys.exit(1)
+
+if any_dirty:
+    args = []
+    if os.name == 'nt':
+        args += ['git.bat']
+    else:
+        args += ['git']
+    args += ['cl', 'format']
+    print('Calling git cl format')
+    subprocess.call(args)
\ No newline at end of file