OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """The frontend for the Mojo bindings system.""" | 6 """The frontend for the Mojo bindings system.""" |
7 | 7 |
8 | 8 |
9 import argparse | 9 import argparse |
10 import imp | 10 import imp |
(...skipping 28 matching lines...) Expand all Loading... |
39 else: | 39 else: |
40 print "Unknown generator name %s" % generator_name | 40 print "Unknown generator name %s" % generator_name |
41 sys.exit(1) | 41 sys.exit(1) |
42 generator_module = imp.load_source(os.path.basename(generator_name)[:-3], | 42 generator_module = imp.load_source(os.path.basename(generator_name)[:-3], |
43 generator_name) | 43 generator_name) |
44 generators.append(generator_module) | 44 generators.append(generator_module) |
45 return generators | 45 return generators |
46 | 46 |
47 def ProcessFile(args, generator_modules, filename, processed_files): | 47 def ProcessFile(args, generator_modules, filename, processed_files): |
48 # Ensure we only visit each file once. | 48 # Ensure we only visit each file once. |
49 processed_files.append(filename) | 49 if filename in processed_files: |
| 50 if processed_files[filename] is None: |
| 51 raise Exception("Circular dependency: " + filename) |
| 52 return processed_files[filename] |
| 53 processed_files[filename] = None |
50 | 54 |
51 dirname, name = os.path.split(filename) | 55 dirname, name = os.path.split(filename) |
52 name = os.path.splitext(name)[0] | 56 name = os.path.splitext(name)[0] |
53 # TODO(darin): There's clearly too many layers of translation here! We can | 57 # TODO(darin): There's clearly too many layers of translation here! We can |
54 # at least avoid generating the serialized Mojom IR. | 58 # at least avoid generating the serialized Mojom IR. |
55 tree = mojo_parser.Parse(filename) | 59 tree = mojo_parser.Parse(filename) |
56 mojom = mojo_translate.Translate(tree, name) | 60 mojom = mojo_translate.Translate(tree, name) |
57 if args.debug_print_intermediate: | 61 if args.debug_print_intermediate: |
58 pprint.PrettyPrinter().pprint(mojom) | 62 pprint.PrettyPrinter().pprint(mojom) |
59 | 63 |
60 # Process all our imports first and collect the module object for each. | 64 # Process all our imports first and collect the module object for each. |
61 # We use these to generate proper type info. | 65 # We use these to generate proper type info. |
62 for import_data in mojom['imports']: | 66 for import_data in mojom['imports']: |
63 import_filename = os.path.join(dirname, import_data['filename']) | 67 import_filename = os.path.join(dirname, import_data['filename']) |
64 if import_filename not in processed_files: | 68 import_data['module'] = ProcessFile( |
65 import_data['module'] = ProcessFile( | 69 args, generator_modules, import_filename, processed_files) |
66 args, generator_modules, import_filename, processed_files) | |
67 | 70 |
68 module = mojom_data.OrderedModuleFromData(mojom) | 71 module = mojom_data.OrderedModuleFromData(mojom) |
69 for generator_module in generator_modules: | 72 for generator_module in generator_modules: |
70 generator = generator_module.Generator(module, args.include_dir, | 73 generator = generator_module.Generator(module, args.include_dir, |
71 args.output_dir) | 74 args.output_dir) |
72 generator.GenerateFiles() | 75 generator.GenerateFiles() |
73 | 76 |
| 77 processed_files[filename] = module |
74 return module | 78 return module |
75 | 79 |
76 def Main(): | 80 def Main(): |
77 parser = argparse.ArgumentParser( | 81 parser = argparse.ArgumentParser( |
78 description="Generate bindings from mojom files.") | 82 description="Generate bindings from mojom files.") |
79 parser.add_argument("filename", nargs="+", | 83 parser.add_argument("filename", nargs="+", |
80 help="mojom input file") | 84 help="mojom input file") |
81 parser.add_argument("-i", "--include_dir", dest="include_dir", default=".", | 85 parser.add_argument("-i", "--include_dir", dest="include_dir", default=".", |
82 help="include path for #includes") | 86 help="include path for #includes") |
83 parser.add_argument("-o", "--output_dir", dest="output_dir", default=".", | 87 parser.add_argument("-o", "--output_dir", dest="output_dir", default=".", |
84 help="output directory for generated files") | 88 help="output directory for generated files") |
85 parser.add_argument("-g", "--generators", dest="generators_string", | 89 parser.add_argument("-g", "--generators", dest="generators_string", |
86 metavar="GENERATORS", default="c++,javascript", | 90 metavar="GENERATORS", default="c++,javascript", |
87 help="comma-separated list of generators") | 91 help="comma-separated list of generators") |
88 parser.add_argument("--debug_print_intermediate", action="store_true", | 92 parser.add_argument("--debug_print_intermediate", action="store_true", |
89 help="print the intermediate representation") | 93 help="print the intermediate representation") |
90 args = parser.parse_args() | 94 args = parser.parse_args() |
91 | 95 |
92 generator_modules = LoadGenerators(args.generators_string) | 96 generator_modules = LoadGenerators(args.generators_string) |
93 | 97 |
94 if not os.path.exists(args.output_dir): | 98 if not os.path.exists(args.output_dir): |
95 os.makedirs(args.output_dir) | 99 os.makedirs(args.output_dir) |
96 | 100 |
97 for filename in args.filename: | 101 for filename in args.filename: |
98 ProcessFile(args, generator_modules, filename, []) | 102 ProcessFile(args, generator_modules, filename, {}) |
99 | 103 |
100 return 0 | 104 return 0 |
101 | 105 |
102 | 106 |
103 if __name__ == "__main__": | 107 if __name__ == "__main__": |
104 sys.exit(Main()) | 108 sys.exit(Main()) |
OLD | NEW |