# Copyright 2019 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""
Runs the bindings code generator for the given tasks.
"""
import argparse
import sys
import web_idl
import bind_gen
def parse_output_reldirs(reldirs):
required = ['core', 'modules']
valid = required + ['extensions_chromeos', 'extensions_webview']
result = {}
for key_value_pair in reldirs:
key, value = key_value_pair.split('=', 1)
key = key.strip()
result[key] = value
for c in required:
assert c in result, 'missing required --output_reldir "{0}"'.format(c)
for c in result.keys():
assert c in valid, 'invalid --output_reldir "{0}"'.format(c)
return result
def parse_options(valid_tasks):
parser = argparse.ArgumentParser(
description='Generator for Blink bindings.')
parser.add_argument('--web_idl_database',
required=True,
type=str,
help='filepath of the input database')
parser.add_argument('--root_src_dir',
required=True,
type=str,
help='root directory of chromium project, i.e. "//"')
parser.add_argument('--root_gen_dir',
required=True,
type=str,
help='root directory of generated code files, i.e. '
'"//out/Default/gen"')
parser.add_argument(
'--output_reldir',
metavar='KEY=VALUE',
action='append',
help='output directory of KEY component relative to root_gen_dir.')
parser.add_argument(
'--format_generated_files',
action='store_true',
default=False,
help=('format the resulting generated files by applying clang-format, '
'etc.'))
parser.add_argument(
'--enable_code_generation_tracing',
action='store_true',
default=False,
help='output debug info in generated code to help track down which '
'line of Python code has generated which line of generated code.')
parser.add_argument(
'--single_process',
action='store_true',
default=False,
help=('run everything in a single process, which makes debugging '
'easier'))
parser.add_argument('tasks',
nargs='+',
choices=valid_tasks,
help='types to generate')
options = parser.parse_args()
return options
def main():
dispatch_table = {
'async_iterator': bind_gen.generate_async_iterators,
'callback_function': bind_gen.generate_callback_functions,
'callback_interface': bind_gen.generate_callback_interfaces,
'dictionary': bind_gen.generate_dictionaries,
'enumeration': bind_gen.generate_enumerations,
'interface': bind_gen.generate_interfaces,
'namespace': bind_gen.generate_namespaces,
'observable_array': bind_gen.generate_observable_arrays,
'sync_iterator': bind_gen.generate_sync_iterators,
'typedef': bind_gen.generate_typedefs,
'union': bind_gen.generate_unions,
}
options = parse_options(valid_tasks=dispatch_table.keys())
output_reldirs = parse_output_reldirs(options.output_reldir)
component_reldirs = {}
for component, reldir in output_reldirs.items():
component_reldirs[web_idl.Component(component)] = reldir
bind_gen.init(
web_idl_database_path=options.web_idl_database,
root_src_dir=options.root_src_dir,
root_gen_dir=options.root_gen_dir,
component_reldirs=component_reldirs,
enable_style_format=options.format_generated_files,
enable_code_generation_tracing=options.enable_code_generation_tracing)
task_queue = bind_gen.TaskQueue(single_process=options.single_process)
for task in options.tasks:
dispatch_table[task](task_queue)
def print_to_console(message):
out = sys.stdout
if not out.isatty():
return
out.write(message)
out.flush()
def report_progress(total, done):
percentage = (int(float(done) / float(total) *
100) if total != 0 else 100)
message = 'Blink-V8 bindings generation: {}% done\r'.format(percentage)
print_to_console(message)
task_queue.run(report_progress)
print_to_console('\n')
if __name__ == '__main__':
main()