Index: bindings/scripts/idl_compiler.py |
diff --git a/bindings/scripts/idl_compiler.py b/bindings/scripts/idl_compiler.py |
index 3721e12129c7f232c30e03e2bfb0102eb21a95ac..7734def8dbe3df7da02694259070a90b45dc4468 100755 |
--- a/bindings/scripts/idl_compiler.py |
+++ b/bindings/scripts/idl_compiler.py |
@@ -38,20 +38,26 @@ import os |
import cPickle as pickle |
import sys |
-from code_generator_v8 import CodeGeneratorDictionaryImpl, CodeGeneratorV8 |
+from code_generator_v8 import CodeGeneratorDictionaryImpl, CodeGeneratorV8, CodeGeneratorUnionType |
from idl_reader import IdlReader |
-from utilities import read_idl_files_list_from_file, write_file, idl_filename_to_component |
+from utilities import create_component_info_provider, read_idl_files_list_from_file, write_file, idl_filename_to_component |
def parse_options(): |
parser = OptionParser() |
parser.add_option('--cache-directory', |
help='cache directory, defaults to output directory') |
- parser.add_option('--generate-dictionary-impl', |
+ parser.add_option('--generate-impl', |
action="store_true", default=False) |
parser.add_option('--output-directory') |
- parser.add_option('--interfaces-info-file') |
+ parser.add_option('--impl-output-directory') |
+ parser.add_option('--info-dir') |
parser.add_option('--write-file-only-if-changed', type='int') |
+ # FIXME: We should always explicitly specify --target-component and |
+ # remove the default behavior. |
+ parser.add_option('--target-component', |
+ help='target component to generate code, defaults to ' |
+ 'component of input idl file') |
# ensure output comes last, so command line easy to parse via regexes |
parser.disable_interspersed_args() |
@@ -81,33 +87,34 @@ class IdlCompiler(object): |
""" |
__metaclass__ = abc.ABCMeta |
- def __init__(self, output_directory, cache_directory='', |
- code_generator=None, interfaces_info=None, |
- interfaces_info_filename='', only_if_changed=False): |
+ def __init__(self, output_directory, cache_directory=None, |
+ code_generator=None, info_provider=None, |
+ only_if_changed=False, target_component=None): |
""" |
Args: |
- interfaces_info: |
- interfaces_info dict |
- (avoids auxiliary file in run-bindings-tests) |
- interfaces_info_file: filename of pickled interfaces_info |
+ output_directory: directory to put output files. |
+ cache_directory: directory which contains PLY caches. |
+ code_generator: code generator to be used. |
+ info_provider: component-specific information provider. |
+ only_if_changed: True when the compiler should only write output files |
+ when the contents are changed. |
+ target_component: component to be processed. |
""" |
- cache_directory = cache_directory or output_directory |
self.cache_directory = cache_directory |
self.code_generator = code_generator |
- if interfaces_info_filename: |
- with open(interfaces_info_filename) as interfaces_info_file: |
- interfaces_info = pickle.load(interfaces_info_file) |
- self.interfaces_info = interfaces_info |
+ self.info_provider = info_provider |
self.only_if_changed = only_if_changed |
self.output_directory = output_directory |
- self.reader = IdlReader(interfaces_info, cache_directory) |
+ self.target_component = target_component |
+ self.reader = IdlReader(info_provider.interfaces_info, cache_directory) |
def compile_and_write(self, idl_filename): |
interface_name = idl_filename_to_interface_name(idl_filename) |
- component = idl_filename_to_component(idl_filename) |
definitions = self.reader.read_idl_definitions(idl_filename) |
+ target_component = self.target_component or idl_filename_to_component(idl_filename) |
+ target_definitions = definitions[target_component] |
output_code_list = self.code_generator.generate_code( |
- definitions[component], interface_name) |
+ target_definitions, interface_name) |
for output_path, output_code in output_code_list: |
write_file(output_code, output_path, self.only_if_changed) |
@@ -119,7 +126,7 @@ class IdlCompiler(object): |
class IdlCompilerV8(IdlCompiler): |
def __init__(self, *args, **kwargs): |
IdlCompiler.__init__(self, *args, **kwargs) |
- self.code_generator = CodeGeneratorV8(self.interfaces_info, |
+ self.code_generator = CodeGeneratorV8(self.info_provider, |
self.cache_directory, |
self.output_directory) |
@@ -131,26 +138,31 @@ class IdlCompilerDictionaryImpl(IdlCompiler): |
def __init__(self, *args, **kwargs): |
IdlCompiler.__init__(self, *args, **kwargs) |
self.code_generator = CodeGeneratorDictionaryImpl( |
- self.interfaces_info, self.cache_directory, self.output_directory) |
+ self.info_provider, self.cache_directory, self.output_directory) |
def compile_file(self, idl_filename): |
self.compile_and_write(idl_filename) |
def generate_bindings(options, input_filename): |
+ info_provider = create_component_info_provider( |
+ options.info_dir, options.target_component) |
idl_compiler = IdlCompilerV8( |
options.output_directory, |
cache_directory=options.cache_directory, |
- interfaces_info_filename=options.interfaces_info_file, |
- only_if_changed=options.write_file_only_if_changed) |
+ info_provider=info_provider, |
+ only_if_changed=options.write_file_only_if_changed, |
+ target_component=options.target_component) |
idl_compiler.compile_file(input_filename) |
def generate_dictionary_impl(options, input_filename): |
+ info_provider = create_component_info_provider( |
+ options.info_dir, options.target_component) |
idl_compiler = IdlCompilerDictionaryImpl( |
- options.output_directory, |
+ options.impl_output_directory, |
cache_directory=options.cache_directory, |
- interfaces_info_filename=options.interfaces_info_file, |
+ info_provider=info_provider, |
only_if_changed=options.write_file_only_if_changed) |
idl_filenames = read_idl_files_list_from_file(input_filename) |
@@ -158,12 +170,29 @@ def generate_dictionary_impl(options, input_filename): |
idl_compiler.compile_file(idl_filename) |
+def generate_union_type_containers(options): |
+ info_provider = create_component_info_provider( |
+ options.info_dir, options.target_component) |
+ if not info_provider.interfaces_info: |
+ raise Exception('Interfaces info is required to generate ' |
+ 'union types containers') |
+ generator = CodeGeneratorUnionType( |
+ info_provider, |
+ options.cache_directory, |
+ options.output_directory, |
+ options.target_component) |
+ output_code_list = generator.generate_code() |
+ for output_path, output_code in output_code_list: |
+ write_file(output_code, output_path, options.write_file_only_if_changed) |
+ |
+ |
def main(): |
options, input_filename = parse_options() |
- if options.generate_dictionary_impl: |
+ if options.generate_impl: |
# |input_filename| should be a file which contains a list of IDL |
# dictionary paths. |
generate_dictionary_impl(options, input_filename) |
+ generate_union_type_containers(options) |
else: |
# |input_filename| should be a path of an IDL file. |
generate_bindings(options, input_filename) |