| OLD | NEW |
| (Empty) |
| 1 #!/usr/bin/python | |
| 2 # Copyright (C) 2010 Google Inc. All rights reserved. | |
| 3 # | |
| 4 # Redistribution and use in source and binary forms, with or without | |
| 5 # modification, are permitted provided that the following conditions | |
| 6 # are met: | |
| 7 # 1. Redistributions of source code must retain the above copyright | |
| 8 # notice, this list of conditions and the following disclaimer. | |
| 9 # 2. Redistributions in binary form must reproduce the above copyright | |
| 10 # notice, this list of conditions and the following disclaimer in the | |
| 11 # documentation and/or other materials provided with the distribution. | |
| 12 # | |
| 13 # THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY | |
| 14 # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
| 15 # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | |
| 16 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR | |
| 17 # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, | |
| 18 # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
| 19 # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | |
| 20 # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | |
| 21 # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 22 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 23 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 24 # | |
| 25 | |
| 26 import traceback | |
| 27 | |
| 28 import fnmatch | |
| 29 from optparse import OptionParser | |
| 30 import os | |
| 31 import shutil | |
| 32 import sys | |
| 33 import tempfile | |
| 34 | |
| 35 import compute_interfaces_info_individual | |
| 36 from compute_interfaces_info_individual import compute_info_individual, info_ind
ividual | |
| 37 import compute_interfaces_info_overall | |
| 38 from compute_interfaces_info_overall import compute_interfaces_info_overall, int
erfaces_info | |
| 39 from compiler import IdlCompilerDart | |
| 40 | |
| 41 # TODO(terry): Temporary solution list of IDLs to parse and IDL as dependencies. | |
| 42 from idl_files import full_path_core_idl_files, full_path_core_dependency_idl_fi
les, full_path_modules_idl_files, full_path_modules_dependency_idl_files | |
| 43 | |
| 44 #from dart_tests import run_dart_tests | |
| 45 | |
| 46 | |
| 47 EXTENDED_ATTRIBUTES_FILE = 'bindings/IDLExtendedAttributes.txt' | |
| 48 | |
| 49 idl_compiler = None | |
| 50 | |
| 51 | |
| 52 def parse_options(): | |
| 53 parser = OptionParser() | |
| 54 | |
| 55 parser.add_option("--output-directory", | |
| 56 action="store", | |
| 57 type="string", | |
| 58 dest="output_directory", | |
| 59 help="Generate output to a known directory") | |
| 60 parser.add_option("-v", "--verbose", | |
| 61 action="store_true", | |
| 62 dest="verbose", | |
| 63 default=False, | |
| 64 help="Show all information messages") | |
| 65 parser.add_option("-k", "--keep", | |
| 66 action="store_true", | |
| 67 dest="keep", | |
| 68 default=False, | |
| 69 help="Don't delete the temporary directory on exit") | |
| 70 parser.add_option("--compute-idls", type='int', help="Compile IDLs interface
s and dependencies (GYP)") | |
| 71 parser.add_option('--globals-only', type='int', help="Generate the globals") | |
| 72 | |
| 73 options, args = parser.parse_args() | |
| 74 | |
| 75 options.compute_idls = bool(options.compute_idls) | |
| 76 options.globals_only = bool(options.globals_only) | |
| 77 | |
| 78 return options | |
| 79 | |
| 80 | |
| 81 class ScopedTempFileProvider(object): | |
| 82 def __init__(self, keep=False): | |
| 83 self.keep = keep | |
| 84 self.dir_paths = [] | |
| 85 | |
| 86 def __enter__(self): | |
| 87 return self | |
| 88 | |
| 89 def __exit__(self, exc_type, exc_value, traceback): | |
| 90 if not self.keep: | |
| 91 for dir_path in self.dir_paths: | |
| 92 # Temporary directories are used as output directories, so they | |
| 93 # contains unknown files (they aren't empty), hence use rmtree | |
| 94 shutil.rmtree(dir_path) | |
| 95 | |
| 96 def new_temp_dir(self): | |
| 97 dir_path = tempfile.mkdtemp() | |
| 98 self.dir_paths.append(dir_path) | |
| 99 return dir_path | |
| 100 | |
| 101 | |
| 102 class DirectoryProvider(object): | |
| 103 def __init__(self, path=""): | |
| 104 self.dir_path = path | |
| 105 | |
| 106 def __enter__(self): | |
| 107 return self | |
| 108 | |
| 109 def new_temp_dir(self): | |
| 110 return self.dir_path | |
| 111 | |
| 112 | |
| 113 def idl_paths_recursive(directory): | |
| 114 idl_paths = [] | |
| 115 for dirpath, _, files in os.walk(directory): | |
| 116 idl_paths.extend(os.path.join(dirpath, filename) | |
| 117 for filename in fnmatch.filter(files, '*.idl')) | |
| 118 return idl_paths | |
| 119 | |
| 120 | |
| 121 class Build(): | |
| 122 def __init__(self, provider): | |
| 123 self.output_directory = provider.new_temp_dir() | |
| 124 | |
| 125 attrib_file = os.path.join('Source', EXTENDED_ATTRIBUTES_FILE) | |
| 126 # Create compiler. | |
| 127 self.idl_compiler = IdlCompilerDart(self.output_directory, | |
| 128 attrib_file, | |
| 129 interfaces_info=interfaces_info, | |
| 130 only_if_changed=True) | |
| 131 | |
| 132 def format_exception(self, e): | |
| 133 exception_list = traceback.format_stack() | |
| 134 exception_list = exception_list[:-2] | |
| 135 exception_list.extend(traceback.format_tb(sys.exc_info()[2])) | |
| 136 exception_list.extend(traceback.format_exception_only(sys.exc_info()[0],
sys.exc_info()[1])) | |
| 137 | |
| 138 exception_str = "Traceback (most recent call last):\n" | |
| 139 exception_str += "".join(exception_list) | |
| 140 # Removing the last \n | |
| 141 exception_str = exception_str[:-1] | |
| 142 | |
| 143 return exception_str | |
| 144 | |
| 145 def generate_from_idl(self, idl_file): | |
| 146 try: | |
| 147 idl_file_fullpath = os.path.realpath(idl_file) | |
| 148 self.idl_compiler.compile_file(idl_file_fullpath) | |
| 149 except Exception as err: | |
| 150 print 'ERROR: idl_compiler.py: ' + os.path.basename(idl_file) | |
| 151 print err | |
| 152 print | |
| 153 print 'Stack Dump:' | |
| 154 print self.format_exception(err) | |
| 155 | |
| 156 return 1 | |
| 157 | |
| 158 def generate_global(self): | |
| 159 try: | |
| 160 self.idl_compiler.generate_global() | |
| 161 except Exception as err: | |
| 162 print 'ERROR: idl_compiler.py generate global' | |
| 163 print err | |
| 164 print | |
| 165 print 'Stack Dump:' | |
| 166 print self.format_exception(err) | |
| 167 | |
| 168 return 1 | |
| 169 | |
| 170 return 0 | |
| 171 | |
| 172 | |
| 173 def main(argv): | |
| 174 ''' | |
| 175 Runs Dart IDL code generator; IDL files. IDL files same as GYP files in | |
| 176 Source/bindings/core/core.gypi and Source/bindings/modules/modules.gypi (see | |
| 177 idl_files.py on list of files). | |
| 178 | |
| 179 To run the PYTHONPATH should have the directories: | |
| 180 | |
| 181 Source/bindings/scripts | |
| 182 Source/bindings/scripts/dart | |
| 183 ''' | |
| 184 | |
| 185 options = parse_options() | |
| 186 | |
| 187 if options.compute_idls: | |
| 188 # TODO(terry): Assumes CWD is third_party/WebKit so any call to | |
| 189 # full_path_NNNN is prefixing 'Source/core' to path. | |
| 190 core_idls = full_path_core_idl_files() | |
| 191 core_dependency_idls = full_path_core_dependency_idl_files() | |
| 192 modules_idls = full_path_modules_idl_files() | |
| 193 modules_dependency_idls = full_path_modules_dependency_idl_files() | |
| 194 | |
| 195 all_interfaces = core_idls + modules_idls | |
| 196 all_dependencies = core_dependency_idls + modules_dependency_idls | |
| 197 all_files = all_interfaces + all_dependencies | |
| 198 | |
| 199 # 2-stage computation: individual, then overall | |
| 200 for idl_filename in all_files: | |
| 201 compute_info_individual(idl_filename, 'dart') | |
| 202 info_individuals = [info_individual()] | |
| 203 compute_interfaces_info_overall(info_individuals) | |
| 204 | |
| 205 # Compile just IDLs with interfaces (no dependencies). | |
| 206 if (options.output_directory == None): | |
| 207 with ScopedTempFileProvider(keep=options.keep) as provider: | |
| 208 build = Build(provider) | |
| 209 else: | |
| 210 provider = DirectoryProvider(path=options.output_directory) | |
| 211 build = Build(provider) | |
| 212 | |
| 213 if options.verbose and options.keep: | |
| 214 print 'Output directory %s created' % build.output_directory | |
| 215 | |
| 216 # Compile IDLs | |
| 217 for filename in all_interfaces: | |
| 218 if not filename.endswith('.idl'): | |
| 219 continue | |
| 220 if build.generate_from_idl(filename): | |
| 221 return False | |
| 222 | |
| 223 if options.verbose: | |
| 224 print '%s IDLs with interfaces processed' % len(all_interfaces) | |
| 225 | |
| 226 if options.verbose and not options.keep: | |
| 227 print 'Output directory %s deleted' % build.output_directory | |
| 228 | |
| 229 if options.globals_only: | |
| 230 if (options.output_directory == None): | |
| 231 with ScopedTempFileProvider(keep=options.keep) as provider: | |
| 232 build = Build(provider) | |
| 233 else: | |
| 234 provider = DirectoryProvider(path=options.output_directory) | |
| 235 build = Build(provider) | |
| 236 | |
| 237 if options.verbose: | |
| 238 print 'Generating global...' | |
| 239 | |
| 240 build.generate_global() | |
| 241 | |
| 242 if options.verbose: | |
| 243 print 'Created DartWebkitClassIds .h/.cpp' | |
| 244 | |
| 245 | |
| 246 if __name__ == '__main__': | |
| 247 sys.exit(main(sys.argv)) | |
| OLD | NEW |