Index: mojo/public/tools/bindings/run_code_generators.py |
diff --git a/mojo/public/tools/bindings/run_code_generators.py b/mojo/public/tools/bindings/run_code_generators.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..87faccdb91f851d1e1975bb7eadacf5025f9ccd7 |
--- /dev/null |
+++ b/mojo/public/tools/bindings/run_code_generators.py |
@@ -0,0 +1,161 @@ |
+#!/usr/bin/env python |
+# Copyright 2015 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+# |
+# This script accepts the output of version 2 of the mojom parser and uses that |
+# data to invoke the code generators. |
+# |
+# This script is not related mojom_bindings_generator.py (which is part of v1 |
+# of the mojom parser pipeline). |
+ |
+import argparse |
+import imp |
+import os |
+import sys |
+ |
+ |
+def _ParseCLIArgs(): |
+ """Parses the command line arguments. |
+ |
+ Returns: |
+ tuple<Namespace, list<str>> The first value of the tuple is a Namespace |
+ holding the value of the optional args. The second value of the tuple is |
+ a list of the remaining arguments. |
+ """ |
+ parser = argparse.ArgumentParser( |
+ description='Generate bindings from mojom parser output.') |
+ parser.add_argument('-f', '--file-graph', dest='file_graph', |
+ help='Location of the parser output. "-" for stdin. ' |
+ '(default "-")', default='-') |
+ parser.add_argument('-p', '--python-bindings-dir', dest='py_bindings_dir', |
+ default='out/Debug/python', |
+ help='Location of the compiled python bindings') |
+ parser.add_argument("-o", "--output-dir", dest="output_dir", default=".", |
+ help="output directory for generated files") |
+ parser.add_argument("-g", "--generators", dest="generators_string", |
+ metavar="GENERATORS", |
+ default="c++,dart,go,javascript,java,python", |
+ help="comma-separated list of generators") |
+ parser.add_argument("-d", "--depth", dest="depth", default=".", |
+ help="relative path to the root of the source tree.") |
+ |
+ return parser.parse_known_args() |
+ |
+ |
+def _FixPath(): |
+ # We need to parse command line args before imports so we can find out where |
+ # the python bindings are located and add them to sys.path. |
+ args, _ = _ParseCLIArgs() |
+ sys.path.insert(0, args.py_bindings_dir) |
+ sys.path.insert(0, os.path.join(os.path.dirname( |
+ os.path.abspath(__file__)), "pylib")) |
+ |
+ |
+_FixPath() |
+ |
+ |
+from generated import mojom_files_mojom |
+from mojom.generate import mojom_translator |
+from mojo_bindings import serialization |
+ |
+ |
+def LoadGenerators(generators_string): |
+ if not generators_string: |
+ return [] # No generators. |
+ |
+ script_dir = os.path.dirname(os.path.abspath(__file__)) |
+ generators = [] |
+ for generator_name in [s.strip() for s in generators_string.split(",")]: |
+ # "Built-in" generators: |
+ if generator_name.lower() == "c++": |
+ generator_name = os.path.join(script_dir, "generators", |
+ "mojom_cpp_generator.py") |
+ elif generator_name.lower() == "dart": |
+ generator_name = os.path.join(script_dir, "generators", |
+ "mojom_dart_generator.py") |
+ elif generator_name.lower() == "go": |
+ generator_name = os.path.join(script_dir, "generators", |
+ "mojom_go_generator.py") |
+ elif generator_name.lower() == "javascript": |
+ generator_name = os.path.join(script_dir, "generators", |
+ "mojom_js_generator.py") |
+ elif generator_name.lower() == "java": |
+ generator_name = os.path.join(script_dir, "generators", |
+ "mojom_java_generator.py") |
+ elif generator_name.lower() == "python": |
+ generator_name = os.path.join(script_dir, "generators", |
+ "mojom_python_generator.py") |
+ # Specified generator python module: |
+ elif generator_name.endswith(".py"): |
+ pass |
+ else: |
+ print "Unknown generator name %s" % generator_name |
+ sys.exit(1) |
+ generator_module = imp.load_source(os.path.basename(generator_name)[:-3], |
+ generator_name) |
+ generators.append(generator_module) |
+ return generators |
+ |
+ |
+def ReadMojomFileGraphFromFile(fp): |
+ """Reads a mojom_files_mojom.MojomFileGraph from a file. |
+ |
+ Args: |
+ fp: A file pointer from which a serialized mojom_fileS_mojom.MojomFileGraph |
+ can be read. |
+ |
+ Returns: |
+ The mojom_files_mojom.MojomFileGraph that was deserialized from the file. |
+ """ |
+ data = bytearray(fp.read()) |
+ context = serialization.RootDeserializationContext(data, []) |
+ return mojom_files_mojom.MojomFileGraph.Deserialize(context) |
+ |
+ |
+def FixModulePath(module, src_root_path): |
+ """Fix the path attribute of the provided module and its imports. |
+ |
+ The path provided for the various modules is the absolute path to the mojom |
+ file which the module represents. But the generators expect the path to be |
+ relative to the root of the source tree. |
+ |
+ Args: |
+ module: {module.Module} whose path is to be updated. |
+ abs_root: {str} absolute path to the root of the source tree. |
+ """ |
+ module.path = os.path.relpath(module.path, src_root_path) |
+ for import_dict in module.imports: |
+ FixModulePath(import_dict['module'], src_root_path) |
+ |
+ |
+def main(): |
+ args, remaining_args = _ParseCLIArgs() |
+ |
+ if args.file_graph == '-': |
+ fp = sys.stdin |
+ else: |
+ fp = open(args.file_graph) |
+ |
+ mojom_file_graph = ReadMojomFileGraphFromFile(fp) |
+ modules = mojom_translator.TranslateFileGraph(mojom_file_graph) |
+ |
+ generator_modules = LoadGenerators(args.generators_string) |
+ |
+ for _, module in modules.iteritems(): |
+ FixModulePath(module, os.path.abspath(args.depth)) |
+ for generator_module in generator_modules: |
+ generator = generator_module.Generator(module, args.output_dir) |
+ |
+ # Look at unparsed args for generator-specific args. |
+ filtered_args = [] |
+ if hasattr(generator_module, 'GENERATOR_PREFIX'): |
+ prefix = '--' + generator_module.GENERATOR_PREFIX + '_' |
+ filtered_args = [arg for arg in remaining_args |
+ if arg.startswith(prefix)] |
+ |
+ generator.GenerateFiles(filtered_args) |
+ |
+ |
+if __name__ == "__main__": |
+ sys.exit(main()) |