| Index: Source/bindings/scripts/aggregate_generated_bindings.py
|
| diff --git a/Source/bindings/scripts/aggregate_generated_bindings.py b/Source/bindings/scripts/aggregate_generated_bindings.py
|
| index 5efb42c9ea0edd46e2750bf8e03aa6655672e3ae..9623be297f5d627f422084c8b050bf69d1bddf43 100755
|
| --- a/Source/bindings/scripts/aggregate_generated_bindings.py
|
| +++ b/Source/bindings/scripts/aggregate_generated_bindings.py
|
| @@ -37,23 +37,18 @@
|
| This can be a single output file, to preserve symbol space; or multiple output
|
| files, to reduce maximum compilation unit size and allow parallel compilation.
|
|
|
| -Usage:
|
| -aggregate_generated_bindings.py COMPONENT_DIR IDL_FILES_LIST -- OUTPUT_FILE1 OUTPUT_FILE2 ...
|
| -
|
| -COMPONENT_DIR is the relative directory of a component, e.g., 'core', 'modules'.
|
| -IDL_FILES_LIST is a text file containing the IDL file paths, so the command
|
| -line doesn't exceed OS length limits.
|
| -OUTPUT_FILE1 etc. are filenames of output files.
|
| -
|
| Design doc: http://www.chromium.org/developers/design-documents/idl-build
|
| """
|
|
|
| +import cPickle as pickle
|
| import errno
|
| +from optparse import OptionParser
|
| import os
|
| import re
|
| import sys
|
|
|
| -from utilities import idl_filename_to_interface_name, read_idl_files_list_from_file
|
| +from idl_reader import IdlReader
|
| +from utilities import idl_filename_to_component, idl_filename_to_interface_name, read_idl_files_list_from_file
|
|
|
| # A regexp for finding Conditional attributes in interface definitions.
|
| CONDITIONAL_PATTERN = re.compile(
|
| @@ -100,6 +95,46 @@ COPYRIGHT_TEMPLATE = """/*
|
| """
|
|
|
|
|
| +def parse_options():
|
| + usage = 'Usage: %prog [options] OUTPUT_FILE1 OUTPUT_FILE2 ...'
|
| + parser = OptionParser(usage=usage)
|
| + parser.add_option('--cache-directory',
|
| + help='cache directory, defaults to output directory')
|
| + parser.add_option('--idl-files-list', help="a text file containing the IDL file paths, so the command line doesn't exceed OS length limits.")
|
| + parser.add_option('--component-dir', help="the relative directory of a component, e.g., 'core', 'modules'")
|
| + parser.add_option('--partial', type='int', help='if true, aggregates partial interface code, e.g. V8XXXPartial.cpp')
|
| + parser.add_option('--interfaces-info')
|
| + parser.add_option('--write-file-only-if-changed', type='int')
|
| + # ensure output comes last, so command line easy to parse via regexes
|
| + parser.disable_interspersed_args()
|
| +
|
| + options, args = parser.parse_args()
|
| + if options.idl_files_list is None:
|
| + parser.error('Must specify idl files list file using --idl-files-list.')
|
| + if options.component_dir is None:
|
| + parser.error('Must specify component directory using --component-dir.')
|
| + if options.partial:
|
| + if options.interfaces_info is None:
|
| + parser.error('Must specify interfaces info using --interfaces-info-file because of --partial.')
|
| + options.partial = True
|
| + else:
|
| + options.partial = False
|
| + options.write_file_only_if_changed = bool(options.write_file_only_if_changed)
|
| + if len(args) == 0:
|
| + parser.error('Must specify exactly more than 1 output file as argument, but %d given.' % len(args))
|
| + return options, args[0:]
|
| +
|
| +
|
| +def format_conditional(conditional):
|
| + """Wraps conditional with ENABLE() and replace '&','|' with '&&','||' if
|
| + more than one conditional is specified."""
|
| + def wrap_with_enable(s):
|
| + if s in ['|', '&']:
|
| + return s * 2
|
| + return 'ENABLE(' + s + ')'
|
| + return ' '.join(map(wrap_with_enable, conditional))
|
| +
|
| +
|
| def extract_conditional(idl_file_path):
|
| """Find [Conditional] interface extended attribute."""
|
| with open(idl_file_path) as idl_file:
|
| @@ -135,7 +170,7 @@ def extract_meta_data(file_paths):
|
| return meta_data_list
|
|
|
|
|
| -def generate_content(component_dir, files_meta_data_this_partition):
|
| +def generate_content(component_dir, partial, files_meta_data_this_partition):
|
| # Add fixed content.
|
| output = [COPYRIGHT_TEMPLATE,
|
| '#define NO_IMPLICIT_ATOMICSTRING\n\n']
|
| @@ -152,8 +187,8 @@ def generate_content(component_dir, files_meta_data_this_partition):
|
| output.append('\n#if ENABLE(%s)\n' % conditional)
|
| prev_conditional = conditional
|
|
|
| - output.append('#include "bindings/%s/v8/V8%s.cpp"\n' %
|
| - (component_dir, meta_data['name']))
|
| + output.append('#include "bindings/%s/v8/V8%s%s.cpp"\n' %
|
| + (component_dir, meta_data['name'], 'Partial' if partial else ''))
|
|
|
| if prev_conditional:
|
| output.append('#endif\n')
|
| @@ -170,22 +205,39 @@ def write_content(content, output_file_name):
|
| f.write(content)
|
|
|
|
|
| +def filter_partial_interface(idl_filenames, interfaces_info, cache_directory):
|
| + reader = IdlReader(interfaces_info, cache_directory)
|
| +
|
| + patched_idl_filenames = []
|
| + for idl_filename in idl_filenames:
|
| + interface_name = idl_filename_to_interface_name(idl_filename)
|
| + component = idl_filename_to_component(idl_filename)
|
| + definitions = reader.read_idl_definitions(idl_filename)
|
| + if len(definitions.keys()) == 1 and definitions[component]:
|
| + continue
|
| +
|
| + patched_idl_filenames.append(idl_filename)
|
| +
|
| + return patched_idl_filenames
|
| +
|
| +
|
| def main(args):
|
| - if len(args) <= 4:
|
| - raise Exception('Expected at least 5 arguments.')
|
| - component_dir = args[1]
|
| - input_file_name = args[2]
|
| - in_out_break_index = args.index('--')
|
| - output_file_names = args[in_out_break_index + 1:]
|
| -
|
| - idl_file_names = read_idl_files_list_from_file(input_file_name)
|
| + options, output_file_names = parse_options()
|
| +
|
| + idl_file_names = read_idl_files_list_from_file(options.idl_files_list)
|
| + if options.partial:
|
| + with open(options.interfaces_info) as interfaces_info_file:
|
| + interfaces_info = pickle.load(interfaces_info_file)
|
| + idl_file_names = filter_partial_interface(idl_file_names, interfaces_info, options.cache_directory)
|
| +
|
| files_meta_data = extract_meta_data(idl_file_names)
|
| total_partitions = len(output_file_names)
|
| for partition, file_name in enumerate(output_file_names):
|
| files_meta_data_this_partition = [
|
| meta_data for meta_data in files_meta_data
|
| if hash(meta_data['name']) % total_partitions == partition]
|
| - file_contents = generate_content(component_dir,
|
| + file_contents = generate_content(options.component_dir,
|
| + options.partial,
|
| files_meta_data_this_partition)
|
| write_content(file_contents, file_name)
|
|
|
|
|