OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file | 2 # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
3 # for details. All rights reserved. Use of this source code is governed by a | 3 # for details. All rights reserved. Use of this source code is governed by a |
4 # BSD-style license that can be found in the LICENSE file. | 4 # BSD-style license that can be found in the LICENSE file. |
5 | 5 |
6 """This is the entry point to create Dart APIs from the IDL database.""" | 6 """This is the entry point to create Dart APIs from the IDL database.""" |
7 | 7 |
8 import css_code_generator | 8 import css_code_generator |
9 import os | |
10 import sys | |
11 | |
12 # Setup all paths to find our PYTHON code | |
13 dart_dir = os.path.abspath(os.path.normpath(os.path.join(os.path.dirname(__file_
_), '..', '..', '..'))) | |
14 sys.path.insert(1, os.path.join(dart_dir, 'tools/dom/new_scripts')) | |
15 sys.path.insert(1, os.path.join(dart_dir, 'third_party/WebCore/bindings/scripts'
)) | |
16 sys.path.insert(1, os.path.join(dart_dir, 'third_party')) | |
17 sys.path.insert(1, os.path.join(dart_dir, 'tools/dom/scripts')) | |
18 | |
19 import dartgenerator | 9 import dartgenerator |
20 import database | 10 import database |
21 import fremontcutbuilder | 11 import fremontcutbuilder |
22 import logging | 12 import logging |
23 import monitored | 13 import monitored |
24 import multiemitter | 14 import multiemitter |
25 import optparse | 15 import optparse |
| 16 import os |
26 import shutil | 17 import shutil |
27 import subprocess | 18 import subprocess |
28 import time | 19 import sys |
29 from dartmetadata import DartMetadata | 20 from dartmetadata import DartMetadata |
30 from generator import TypeRegistry | 21 from generator import TypeRegistry |
31 from htmleventgenerator import HtmlEventGenerator | 22 from htmleventgenerator import HtmlEventGenerator |
32 from htmlrenamer import HtmlRenamer | 23 from htmlrenamer import HtmlRenamer |
33 from systemhtml import DartLibraryEmitter, Dart2JSBackend,\ | 24 from systemhtml import DartLibraryEmitter, Dart2JSBackend,\ |
34 HtmlDartInterfaceGenerator, DartLibrary, DartLibraries,\ | 25 HtmlDartInterfaceGenerator, DartLibrary, DartLibraries,\ |
35 HTML_LIBRARY_NAMES | 26 HTML_LIBRARY_NAMES |
36 from systemnative import CPPLibraryEmitter, DartiumBackend, \ | 27 from systemnative import CPPLibraryEmitter, DartiumBackend, \ |
37 GetNativeLibraryEmitter | 28 GetNativeLibraryEmitter |
38 from templateloader import TemplateLoader | 29 from templateloader import TemplateLoader |
39 | 30 |
40 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..')) | 31 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..')) |
41 | |
42 import utils | 32 import utils |
43 | 33 |
44 | |
45 _logger = logging.getLogger('dartdomgenerator') | 34 _logger = logging.getLogger('dartdomgenerator') |
46 | 35 |
47 class GeneratorOptions(object): | 36 class GeneratorOptions(object): |
48 def __init__(self, templates, database, type_registry, renamer, | 37 def __init__(self, templates, database, type_registry, renamer, |
49 metadata): | 38 metadata): |
50 self.templates = templates | 39 self.templates = templates |
51 self.database = database | 40 self.database = database |
52 self.type_registry = type_registry | 41 self.type_registry = type_registry |
53 self.renamer = renamer | 42 self.renamer = renamer |
54 self.metadata = metadata; | 43 self.metadata = metadata; |
55 | 44 |
56 def LoadDatabase(database_dir, use_database_cache): | 45 def LoadDatabase(database_dir, use_database_cache): |
57 common_database = database.Database(database_dir) | 46 common_database = database.Database(database_dir) |
58 if use_database_cache: | 47 if use_database_cache: |
59 common_database.LoadFromCache() | 48 common_database.LoadFromCache() |
60 else: | 49 else: |
61 common_database.Load() | 50 common_database.Load() |
62 return common_database | 51 return common_database |
63 | 52 |
64 def GenerateFromDatabase(common_database, dart2js_output_dir, | 53 def GenerateFromDatabase(common_database, dart2js_output_dir, |
65 dartium_output_dir, update_dom_metadata=False, | 54 dartium_output_dir, update_dom_metadata=False): |
66 logging_level=logging.WARNING): | |
67 start_time = time.time() | |
68 | |
69 current_dir = os.path.dirname(__file__) | 55 current_dir = os.path.dirname(__file__) |
70 auxiliary_dir = os.path.join(current_dir, '..', 'src') | 56 auxiliary_dir = os.path.join(current_dir, '..', 'src') |
71 template_dir = os.path.join(current_dir, '..', 'templates') | 57 template_dir = os.path.join(current_dir, '..', 'templates') |
72 | 58 |
73 _logger.setLevel(logging_level) | 59 generator = dartgenerator.DartGenerator() |
74 | |
75 generator = dartgenerator.DartGenerator(logging_level) | |
76 generator.LoadAuxiliary(auxiliary_dir) | 60 generator.LoadAuxiliary(auxiliary_dir) |
77 | 61 |
78 generator.FilterMembersWithUnidentifiedTypes(common_database) | 62 generator.FilterMembersWithUnidentifiedTypes(common_database) |
79 webkit_database = common_database.Clone() | 63 webkit_database = common_database.Clone() |
80 | 64 |
81 # Generate Dart interfaces for the WebKit DOM. | 65 # Generate Dart interfaces for the WebKit DOM. |
82 generator.FilterInterfaces(database = webkit_database, | 66 generator.FilterInterfaces(database = webkit_database, |
83 or_annotations = ['WebKit', 'Dart'], | 67 or_annotations = ['WebKit', 'Dart'], |
84 exclude_displaced = ['WebKit'], | 68 exclude_displaced = ['WebKit'], |
85 exclude_suppressed = ['WebKit', 'Dart']) | 69 exclude_suppressed = ['WebKit', 'Dart']) |
86 generator.FixEventTargets(webkit_database) | 70 generator.FixEventTargets(webkit_database) |
87 generator.AddMissingArguments(webkit_database) | 71 generator.AddMissingArguments(webkit_database) |
88 | 72 |
89 emitters = multiemitter.MultiEmitter(logging_level) | 73 emitters = multiemitter.MultiEmitter() |
90 metadata = DartMetadata( | 74 metadata = DartMetadata( |
91 os.path.join(current_dir, '..', 'dom.json'), | 75 os.path.join(current_dir, '..', 'dom.json'), |
92 os.path.join(current_dir, '..', 'docs', 'docs.json'), | 76 os.path.join(current_dir, '..', 'docs', 'docs.json')) |
93 logging_level) | |
94 renamer = HtmlRenamer(webkit_database, metadata) | 77 renamer = HtmlRenamer(webkit_database, metadata) |
95 type_registry = TypeRegistry(webkit_database, renamer) | 78 type_registry = TypeRegistry(webkit_database, renamer) |
96 | 79 |
97 print 'GenerateFromDatabase %s seconds' % round((time.time() - start_time), 2) | |
98 | |
99 def RunGenerator(dart_libraries, dart_output_dir, | 80 def RunGenerator(dart_libraries, dart_output_dir, |
100 template_loader, backend_factory): | 81 template_loader, backend_factory): |
101 options = GeneratorOptions( | 82 options = GeneratorOptions( |
102 template_loader, webkit_database, type_registry, renamer, | 83 template_loader, webkit_database, type_registry, renamer, |
103 metadata) | 84 metadata) |
104 dart_library_emitter = DartLibraryEmitter( | 85 dart_library_emitter = DartLibraryEmitter( |
105 emitters, dart_output_dir, dart_libraries) | 86 emitters, dart_output_dir, dart_libraries) |
106 event_generator = HtmlEventGenerator(webkit_database, renamer, metadata, | 87 event_generator = HtmlEventGenerator(webkit_database, renamer, metadata, |
107 template_loader) | 88 template_loader) |
108 | 89 |
109 def generate_interface(interface): | 90 def generate_interface(interface): |
110 backend = backend_factory(interface) | 91 backend = backend_factory(interface) |
111 interface_generator = HtmlDartInterfaceGenerator( | 92 interface_generator = HtmlDartInterfaceGenerator( |
112 options, dart_library_emitter, event_generator, interface, backend) | 93 options, dart_library_emitter, event_generator, interface, backend) |
113 interface_generator.Generate() | 94 interface_generator.Generate() |
114 | 95 |
115 generator.Generate(webkit_database, common_database, generate_interface) | 96 generator.Generate(webkit_database, common_database, generate_interface) |
116 | 97 |
117 dart_library_emitter.EmitLibraries(auxiliary_dir) | 98 dart_library_emitter.EmitLibraries(auxiliary_dir) |
118 | 99 |
119 if dart2js_output_dir: | 100 if dart2js_output_dir: |
120 template_paths = ['html/dart2js', 'html/impl', 'html/interface', ''] | 101 template_paths = ['html/dart2js', 'html/impl', 'html/interface', ''] |
121 template_loader = TemplateLoader(template_dir, | 102 template_loader = TemplateLoader(template_dir, |
122 template_paths, | 103 template_paths, |
123 {'DARTIUM': False, 'DART2JS': True}) | 104 {'DARTIUM': False, 'DART2JS': True}) |
124 backend_options = GeneratorOptions( | 105 backend_options = GeneratorOptions( |
125 template_loader, webkit_database, type_registry, renamer, | 106 template_loader, webkit_database, type_registry, renamer, |
126 metadata) | 107 metadata) |
127 backend_factory = lambda interface:\ | 108 backend_factory = lambda interface:\ |
128 Dart2JSBackend(interface, backend_options, logging_level) | 109 Dart2JSBackend(interface, backend_options) |
129 | 110 |
130 dart_output_dir = os.path.join(dart2js_output_dir, 'dart') | 111 dart_output_dir = os.path.join(dart2js_output_dir, 'dart') |
131 dart_libraries = DartLibraries( | 112 dart_libraries = DartLibraries( |
132 HTML_LIBRARY_NAMES, template_loader, 'dart2js', dart2js_output_dir) | 113 HTML_LIBRARY_NAMES, template_loader, 'dart2js', dart2js_output_dir) |
133 | 114 |
134 print '\nGenerating dart2js:\n' | 115 RunGenerator(dart_libraries, dart_output_dir, |
135 start_time = time.time() | 116 template_loader, backend_factory) |
136 | |
137 RunGenerator(dart_libraries, dart_output_dir, template_loader, | |
138 backend_factory) | |
139 | |
140 print 'Generated dart2js in %s seconds' % round(time.time() - start_time, 2) | |
141 | 117 |
142 if dartium_output_dir: | 118 if dartium_output_dir: |
143 template_paths = ['html/dartium', 'html/impl', 'html/interface', ''] | 119 template_paths = ['html/dartium', 'html/impl', 'html/interface', ''] |
144 template_loader = TemplateLoader(template_dir, | 120 template_loader = TemplateLoader(template_dir, |
145 template_paths, | 121 template_paths, |
146 {'DARTIUM': True, 'DART2JS': False}) | 122 {'DARTIUM': True, 'DART2JS': False}) |
147 backend_options = GeneratorOptions( | 123 backend_options = GeneratorOptions( |
148 template_loader, webkit_database, type_registry, renamer, | 124 template_loader, webkit_database, type_registry, renamer, |
149 metadata) | 125 metadata) |
150 cpp_output_dir = os.path.join(dartium_output_dir, 'cpp') | 126 cpp_output_dir = os.path.join(dartium_output_dir, 'cpp') |
151 cpp_library_emitter = CPPLibraryEmitter(emitters, cpp_output_dir) | 127 cpp_library_emitter = CPPLibraryEmitter(emitters, cpp_output_dir) |
152 dart_output_dir = os.path.join(dartium_output_dir, 'dart') | 128 dart_output_dir = os.path.join(dartium_output_dir, 'dart') |
153 native_library_emitter = \ | 129 native_library_emitter = \ |
154 GetNativeLibraryEmitter(emitters, template_loader, | 130 GetNativeLibraryEmitter(emitters, template_loader, |
155 dartium_output_dir, dart_output_dir, | 131 dartium_output_dir, dart_output_dir, |
156 auxiliary_dir) | 132 auxiliary_dir) |
157 backend_factory = lambda interface:\ | 133 backend_factory = lambda interface:\ |
158 DartiumBackend(interface, native_library_emitter, | 134 DartiumBackend(interface, native_library_emitter, |
159 cpp_library_emitter, backend_options) | 135 cpp_library_emitter, backend_options) |
160 dart_libraries = DartLibraries( | 136 dart_libraries = DartLibraries( |
161 HTML_LIBRARY_NAMES, template_loader, 'dartium', dartium_output_dir) | 137 HTML_LIBRARY_NAMES, template_loader, 'dartium', dartium_output_dir) |
162 | |
163 print '\nGenerating dartium:\n' | |
164 start_time = time.time() | |
165 | |
166 RunGenerator(dart_libraries, dart_output_dir, | 138 RunGenerator(dart_libraries, dart_output_dir, |
167 template_loader, backend_factory) | 139 template_loader, backend_factory) |
168 print 'Generated dartium in %s seconds' % round(time.time() - start_time, 2) | |
169 | |
170 cpp_library_emitter.EmitDerivedSources( | 140 cpp_library_emitter.EmitDerivedSources( |
171 template_loader.Load('cpp_derived_sources.template'), | 141 template_loader.Load('cpp_derived_sources.template'), |
172 dartium_output_dir) | 142 dartium_output_dir) |
173 cpp_library_emitter.EmitResolver( | 143 cpp_library_emitter.EmitResolver( |
174 template_loader.Load('cpp_resolver.template'), dartium_output_dir) | 144 template_loader.Load('cpp_resolver.template'), dartium_output_dir) |
175 cpp_library_emitter.EmitClassIdTable( | 145 cpp_library_emitter.EmitClassIdTable( |
176 webkit_database, dartium_output_dir, type_registry, renamer) | 146 webkit_database, dartium_output_dir, type_registry, renamer) |
177 emitters.Flush() | 147 emitters.Flush() |
178 | 148 |
179 if update_dom_metadata: | 149 if update_dom_metadata: |
180 metadata.Flush() | 150 metadata.Flush() |
181 | 151 |
182 monitored.FinishMonitoring(dart2js_output_dir, _logger) | 152 monitored.FinishMonitoring(dart2js_output_dir) |
183 | 153 |
184 def GenerateSingleFile(library_path, output_dir, generated_output_dir=None): | 154 def GenerateSingleFile(library_path, output_dir, generated_output_dir=None): |
185 library_dir = os.path.dirname(library_path) | 155 library_dir = os.path.dirname(library_path) |
186 library_filename = os.path.basename(library_path) | 156 library_filename = os.path.basename(library_path) |
187 copy_dart_script = os.path.relpath('../../copy_dart.py', | 157 copy_dart_script = os.path.relpath('../../copy_dart.py', |
188 library_dir) | 158 library_dir) |
189 output_dir = os.path.relpath(output_dir, library_dir) | 159 output_dir = os.path.relpath(output_dir, library_dir) |
190 command = ' '.join(['cd', library_dir, ';', | 160 command = ' '.join(['cd', library_dir, ';', |
191 copy_dart_script, output_dir, library_filename]) | 161 copy_dart_script, output_dir, library_filename]) |
192 subprocess.call([command], shell=True) | 162 subprocess.call([command], shell=True) |
(...skipping 22 matching lines...) Expand all Loading... |
215 help='Directory to put the generated files') | 185 help='Directory to put the generated files') |
216 parser.add_option('--use-database-cache', dest='use_database_cache', | 186 parser.add_option('--use-database-cache', dest='use_database_cache', |
217 action='store_true', | 187 action='store_true', |
218 default=False, | 188 default=False, |
219 help='''Use the cached database from the previous run to | 189 help='''Use the cached database from the previous run to |
220 improve startup performance''') | 190 improve startup performance''') |
221 parser.add_option('--update-dom-metadata', dest='update_dom_metadata', | 191 parser.add_option('--update-dom-metadata', dest='update_dom_metadata', |
222 action='store_true', | 192 action='store_true', |
223 default=False, | 193 default=False, |
224 help='''Update the metadata list of DOM APIs''') | 194 help='''Update the metadata list of DOM APIs''') |
225 parser.add_option('--blink-parser', dest='blink_parser', | |
226 action='store_true', default=False, | |
227 help='Use New Blink IDL parser.') | |
228 parser.add_option('--verbose', dest='logging_level', | |
229 action='store_false', default=logging.WARNING, | |
230 help='Output all informational messages') | |
231 parser.add_option('--logging', dest='logging', type='int', | |
232 action='store', default=logging.NOTSET, | |
233 help='Level of logging 20 is Info, 30 is Warnings, 40 is Err
ors') | |
234 | |
235 (options, args) = parser.parse_args() | 195 (options, args) = parser.parse_args() |
236 | 196 |
237 current_dir = os.path.dirname(__file__) | 197 current_dir = os.path.dirname(__file__) |
238 database_dir = os.path.join(current_dir, '..', 'database') | 198 database_dir = os.path.join(current_dir, '..', 'database') |
239 logging.config.fileConfig(os.path.join(current_dir, 'logging.conf')) | 199 logging.config.fileConfig(os.path.join(current_dir, 'logging.conf')) |
240 systems = options.systems.split(',') | 200 systems = options.systems.split(',') |
241 | 201 |
242 output_dir = options.output_dir or os.path.join( | 202 output_dir = options.output_dir or os.path.join( |
243 current_dir, '..', '..', utils.GetBuildDir(utils.GuessOS()), | 203 current_dir, '..', '..', utils.GetBuildDir(utils.GuessOS()), |
244 'generated') | 204 'generated') |
245 | 205 |
246 dart2js_output_dir = None | 206 dart2js_output_dir = None |
247 if 'htmldart2js' in systems: | 207 if 'htmldart2js' in systems: |
248 dart2js_output_dir = os.path.join(output_dir, 'dart2js') | 208 dart2js_output_dir = os.path.join(output_dir, 'dart2js') |
249 dartium_output_dir = None | 209 dartium_output_dir = None |
250 if 'htmldartium' in systems: | 210 if 'htmldartium' in systems: |
251 dartium_output_dir = os.path.join(output_dir, 'dartium') | 211 dartium_output_dir = os.path.join(output_dir, 'dartium') |
252 | 212 |
253 logging_level = options.logging_level \ | |
254 if options.logging == logging.NOTSET else options.logging | |
255 | |
256 start_time = time.time() | |
257 | |
258 UpdateCssProperties() | 213 UpdateCssProperties() |
259 | |
260 if options.rebuild: | 214 if options.rebuild: |
261 # Parse the IDL and create the database. | 215 # Parse the IDL and create the database. |
262 database = fremontcutbuilder.main(options.parallel, options.blink_parser, | 216 database = fremontcutbuilder.main(options.parallel) |
263 logging_level=logging_level) | |
264 else: | 217 else: |
265 # TODO(terry): Should be able to remove this... | |
266 # Load the previously generated database. | 218 # Load the previously generated database. |
267 if not options.blink_parser: | 219 database = LoadDatabase(database_dir, options.use_database_cache) |
268 database = LoadDatabase(database_dir, options.use_database_cache) | |
269 | |
270 GenerateFromDatabase(database, dart2js_output_dir, dartium_output_dir, | 220 GenerateFromDatabase(database, dart2js_output_dir, dartium_output_dir, |
271 options.update_dom_metadata, logging_level) | 221 options.update_dom_metadata) |
272 | |
273 file_generation_start_time = time.time() | |
274 | 222 |
275 if 'htmldart2js' in systems: | 223 if 'htmldart2js' in systems: |
276 _logger.info('Generating dart2js single files.') | 224 _logger.info('Generating dart2js single files.') |
277 | |
278 for library_name in HTML_LIBRARY_NAMES: | 225 for library_name in HTML_LIBRARY_NAMES: |
279 GenerateSingleFile( | 226 GenerateSingleFile( |
280 os.path.join(dart2js_output_dir, '%s_dart2js.dart' % library_name), | 227 os.path.join(dart2js_output_dir, '%s_dart2js.dart' % library_name), |
281 os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dart2js')) | 228 os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dart2js')) |
282 | |
283 if 'htmldartium' in systems: | 229 if 'htmldartium' in systems: |
284 _logger.info('Generating dartium single files.') | 230 _logger.info('Generating dartium single files.') |
285 file_generation_start_time = time.time() | |
286 | |
287 for library_name in HTML_LIBRARY_NAMES: | 231 for library_name in HTML_LIBRARY_NAMES: |
288 GenerateSingleFile( | 232 GenerateSingleFile( |
289 os.path.join(dartium_output_dir, '%s_dartium.dart' % library_name), | 233 os.path.join(dartium_output_dir, '%s_dartium.dart' % library_name), |
290 os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dartium')) | 234 os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dartium')) |
291 GenerateSingleFile( | 235 GenerateSingleFile( |
292 os.path.join(dartium_output_dir, '_blink_dartium.dart'), | 236 os.path.join(dartium_output_dir, '_blink_dartium.dart'), |
293 os.path.join('..', '..', '..', 'sdk', 'lib', '_blink', 'dartium')) | 237 os.path.join('..', '..', '..', 'sdk', 'lib', '_blink', 'dartium')) |
294 | 238 |
295 print '\nGenerating single file %s seconds' % round(time.time() - file_generat
ion_start_time, 2) | |
296 | |
297 end_time = time.time() | |
298 | |
299 print '\nDone (dartdomgenerator) %s seconds' % round(end_time - start_time, 2) | |
300 | |
301 if __name__ == '__main__': | 239 if __name__ == '__main__': |
302 sys.exit(main()) | 240 sys.exit(main()) |
OLD | NEW |