| OLD | NEW |
| 1 #!/usr/bin/python | 1 #!/usr/bin/python |
| 2 # | 2 # |
| 3 # Copyright (C) 2009 Google Inc. All rights reserved. | 3 # Copyright (C) 2009 Google Inc. All rights reserved. |
| 4 # | 4 # |
| 5 # Redistribution and use in source and binary forms, with or without | 5 # Redistribution and use in source and binary forms, with or without |
| 6 # modification, are permitted provided that the following conditions are | 6 # modification, are permitted provided that the following conditions are |
| 7 # met: | 7 # met: |
| 8 # | 8 # |
| 9 # * Redistributions of source code must retain the above copyright | 9 # * Redistributions of source code must retain the above copyright |
| 10 # notice, this list of conditions and the following disclaimer. | 10 # notice, this list of conditions and the following disclaimer. |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 44 IDL_FILES_LIST is a text file containing the IDL file paths, so the command | 44 IDL_FILES_LIST is a text file containing the IDL file paths, so the command |
| 45 line doesn't exceed OS length limits. | 45 line doesn't exceed OS length limits. |
| 46 OUTPUT_FILE1 etc. are filenames of output files. | 46 OUTPUT_FILE1 etc. are filenames of output files. |
| 47 | 47 |
| 48 Design doc: http://www.chromium.org/developers/design-documents/idl-build | 48 Design doc: http://www.chromium.org/developers/design-documents/idl-build |
| 49 """ | 49 """ |
| 50 | 50 |
| 51 import errno | 51 import errno |
| 52 import os | 52 import os |
| 53 import re | 53 import re |
| 54 import subprocess | |
| 55 import sys | 54 import sys |
| 56 | 55 |
| 57 from utilities import idl_filename_to_interface_name | 56 from utilities import idl_filename_to_interface_name, read_idl_files_list_from_f
ile |
| 58 | 57 |
| 59 # A regexp for finding Conditional attributes in interface definitions. | 58 # A regexp for finding Conditional attributes in interface definitions. |
| 60 CONDITIONAL_PATTERN = re.compile( | 59 CONDITIONAL_PATTERN = re.compile( |
| 61 r'\[' | 60 r'\[' |
| 62 r'[^\]]*' | 61 r'[^\]]*' |
| 63 r'Conditional=([\_0-9a-zA-Z&|]*)' | 62 r'Conditional=([\_0-9a-zA-Z]*)' |
| 64 r'[^\]]*' | 63 r'[^\]]*' |
| 65 r'\]\s*' | 64 r'\]\s*' |
| 66 r'((callback|partial)\s+)?' | 65 r'((callback|partial)\s+)?' |
| 67 r'interface\s+' | 66 r'interface\s+' |
| 68 r'\w+\s*' | 67 r'\w+\s*' |
| 69 r'(:\s*\w+\s*)?' | 68 r'(:\s*\w+\s*)?' |
| 70 r'{', | 69 r'{', |
| 71 re.MULTILINE) | 70 re.MULTILINE) |
| 72 | 71 |
| 73 COPYRIGHT_TEMPLATE = """/* | 72 COPYRIGHT_TEMPLATE = """/* |
| (...skipping 20 matching lines...) Expand all Loading... |
| 94 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | 93 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
| 95 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR | 94 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
| 96 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY | 95 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
| 97 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 96 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 98 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 97 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 99 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 98 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 100 */ | 99 */ |
| 101 """ | 100 """ |
| 102 | 101 |
| 103 | 102 |
| 104 def format_conditional(conditional): | |
| 105 """Wraps conditional with ENABLE() and replace '&','|' with '&&','||' if | |
| 106 more than one conditional is specified.""" | |
| 107 def wrap_with_enable(s): | |
| 108 if s in ['|', '&']: | |
| 109 return s * 2 | |
| 110 return 'ENABLE(' + s + ')' | |
| 111 return ' '.join(map(wrap_with_enable, conditional)) | |
| 112 | |
| 113 | |
| 114 def extract_conditional(idl_file_path): | 103 def extract_conditional(idl_file_path): |
| 115 """Find [Conditional] interface extended attribute.""" | 104 """Find [Conditional] interface extended attribute.""" |
| 116 with open(idl_file_path) as idl_file: | 105 with open(idl_file_path) as idl_file: |
| 117 idl_contents = idl_file.read() | 106 idl_contents = idl_file.read() |
| 118 | 107 |
| 119 match = CONDITIONAL_PATTERN.search(idl_contents) | 108 match = CONDITIONAL_PATTERN.search(idl_contents) |
| 120 if not match: | 109 if not match: |
| 121 return None | 110 return None |
| 122 conditional = match.group(1) | 111 return match.group(1) |
| 123 return re.split('([|,])', conditional) | |
| 124 | 112 |
| 125 | 113 |
| 126 def extract_meta_data(file_paths): | 114 def extract_meta_data(file_paths): |
| 127 """Extracts conditional and interface name from each IDL file.""" | 115 """Extracts conditional and interface name from each IDL file.""" |
| 128 meta_data_list = [] | 116 meta_data_list = [] |
| 129 | 117 |
| 130 for file_path in file_paths: | 118 for file_path in file_paths: |
| 131 if not file_path.endswith('.idl'): | 119 if not file_path.endswith('.idl'): |
| 132 print 'WARNING: non-IDL file passed: "%s"' % file_path | 120 print 'WARNING: non-IDL file passed: "%s"' % file_path |
| 133 continue | 121 continue |
| (...skipping 20 matching lines...) Expand all Loading... |
| 154 | 142 |
| 155 # List all includes segmented by if and endif. | 143 # List all includes segmented by if and endif. |
| 156 prev_conditional = None | 144 prev_conditional = None |
| 157 files_meta_data_this_partition.sort(key=lambda e: e['conditional']) | 145 files_meta_data_this_partition.sort(key=lambda e: e['conditional']) |
| 158 for meta_data in files_meta_data_this_partition: | 146 for meta_data in files_meta_data_this_partition: |
| 159 conditional = meta_data['conditional'] | 147 conditional = meta_data['conditional'] |
| 160 if prev_conditional != conditional: | 148 if prev_conditional != conditional: |
| 161 if prev_conditional: | 149 if prev_conditional: |
| 162 output.append('#endif\n') | 150 output.append('#endif\n') |
| 163 if conditional: | 151 if conditional: |
| 164 output.append('\n#if %s\n' % format_conditional(conditional)) | 152 output.append('\n#if ENABLE(%s)\n' % conditional) |
| 165 prev_conditional = conditional | 153 prev_conditional = conditional |
| 166 | 154 |
| 167 output.append('#include "bindings/%s/%s/%s%s.cpp"\n' % | 155 output.append('#include "bindings/%s/%s/%s%s.cpp"\n' % |
| 168 (component_dir, prefix.lower(), prefix, meta_data['name'])
) | 156 (component_dir, prefix.lower(), prefix, meta_data['name'])
) |
| 169 | 157 |
| 170 if prev_conditional: | 158 if prev_conditional: |
| 171 output.append('#endif\n') | 159 output.append('#endif\n') |
| 172 | 160 |
| 173 return ''.join(output) | 161 return ''.join(output) |
| 174 | 162 |
| 175 | 163 |
| 176 def write_content(content, output_file_name): | 164 def write_content(content, output_file_name): |
| 177 parent_path, file_name = os.path.split(output_file_name) | 165 parent_path, file_name = os.path.split(output_file_name) |
| 178 if not os.path.exists(parent_path): | 166 if not os.path.exists(parent_path): |
| 179 print 'Creating directory: %s' % parent_path | 167 print 'Creating directory: %s' % parent_path |
| 180 os.makedirs(parent_path) | 168 os.makedirs(parent_path) |
| 181 with open(output_file_name, 'w') as f: | 169 with open(output_file_name, 'w') as f: |
| 182 f.write(content) | 170 f.write(content) |
| 183 | 171 |
| 184 | 172 |
| 185 def resolve_cygpath(cygdrive_names): | |
| 186 if not cygdrive_names: | |
| 187 return [] | |
| 188 cmd = ['cygpath', '-f', '-', '-wa'] | |
| 189 process = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIP
E, stderr=subprocess.STDOUT) | |
| 190 idl_file_names = [] | |
| 191 for file_name in cygdrive_names: | |
| 192 process.stdin.write('%s\n' % file_name) | |
| 193 process.stdin.flush() | |
| 194 idl_file_names.append(process.stdout.readline().rstrip()) | |
| 195 process.stdin.close() | |
| 196 process.wait() | |
| 197 return idl_file_names | |
| 198 | |
| 199 | |
| 200 def main(args): | 173 def main(args): |
| 201 if len(args) <= 4: | 174 if len(args) <= 4: |
| 202 raise Exception('Expected at least 5 arguments.') | 175 raise Exception('Expected at least 5 arguments.') |
| 203 if (args[1] == '--dart'): | 176 if (args[1] == '--dart'): |
| 204 component_dir = args[2] | 177 component_dir = args[2] |
| 205 input_file_name = args[3] | 178 input_file_name = args[3] |
| 206 prefix = 'Dart' | 179 prefix = 'Dart' |
| 207 else: | 180 else: |
| 208 component_dir = args[1] | 181 component_dir = args[1] |
| 209 input_file_name = args[2] | 182 input_file_name = args[2] |
| 210 prefix = 'V8' | 183 prefix = 'V8' |
| 211 in_out_break_index = args.index('--') | 184 in_out_break_index = args.index('--') |
| 212 output_file_names = args[in_out_break_index + 1:] | 185 output_file_names = args[in_out_break_index + 1:] |
| 213 | 186 |
| 214 with open(input_file_name) as input_file: | 187 idl_file_names = read_idl_files_list_from_file(input_file_name) |
| 215 file_names = sorted([os.path.realpath(line.rstrip('\n')) | |
| 216 for line in input_file]) | |
| 217 idl_file_names = [file_name for file_name in file_names | |
| 218 if not file_name.startswith('/cygdrive')] | |
| 219 cygdrive_names = [file_name for file_name in file_names | |
| 220 if file_name.startswith('/cygdrive')] | |
| 221 idl_file_names.extend(resolve_cygpath(cygdrive_names)) | |
| 222 | |
| 223 files_meta_data = extract_meta_data(idl_file_names) | 188 files_meta_data = extract_meta_data(idl_file_names) |
| 224 total_partitions = len(output_file_names) | 189 total_partitions = len(output_file_names) |
| 225 for partition, file_name in enumerate(output_file_names): | 190 for partition, file_name in enumerate(output_file_names): |
| 226 files_meta_data_this_partition = [ | 191 files_meta_data_this_partition = [ |
| 227 meta_data for meta_data in files_meta_data | 192 meta_data for meta_data in files_meta_data |
| 228 if hash(meta_data['name']) % total_partitions == partition] | 193 if hash(meta_data['name']) % total_partitions == partition] |
| 229 file_contents = generate_content(component_dir, | 194 file_contents = generate_content(component_dir, |
| 230 files_meta_data_this_partition, | 195 files_meta_data_this_partition, |
| 231 prefix) | 196 prefix) |
| 232 write_content(file_contents, file_name) | 197 write_content(file_contents, file_name) |
| 233 | 198 |
| 234 | 199 |
| 235 if __name__ == '__main__': | 200 if __name__ == '__main__': |
| 236 sys.exit(main(sys.argv)) | 201 sys.exit(main(sys.argv)) |
| OLD | NEW |