#!/usr/bin/env python3 # # Copyright 2013 The Flutter Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """ Generate C/C++ headers and source files from the set of FIDL files specified in the meta.json manifest. """ import argparse import collections import json import os import subprocess import sys def GetFIDLFilesRecursive(libraries, sdk_base, path): with open(path) as json_file: parsed = json.load(json_file) result = [] deps = parsed['deps'] for dep in deps: dep_meta_json = os.path.abspath('%s/fidl/%s/meta.json' % (sdk_base, dep)) GetFIDLFilesRecursive(libraries, sdk_base, dep_meta_json) libraries[parsed['name']] = result + parsed['sources'] def GetFIDLFilesByLibraryName(sdk_base, root): libraries = collections.OrderedDict() GetFIDLFilesRecursive(libraries, sdk_base, root) return libraries def main(): parser = argparse.ArgumentParser() parser.add_argument('--fidlc-bin', dest='fidlc_bin', action='store', required=True) parser.add_argument('--fidlgen-bin', dest='fidlgen_bin', action='append', required=False) parser.add_argument('--sdk-base', dest='sdk_base', action='store', required=True) parser.add_argument('--root', dest='root', action='store', required=True) parser.add_argument('--json', dest='json', action='store', required=True) parser.add_argument('--fidlgen-output-root', dest='fidlgen_output_root', action='store', required=False) parser.add_argument('--output-c-tables', dest='output_c_tables', action='store', required=True) parser.add_argument('--target-api-level', dest='target_api_level', action='store', required=False) args = parser.parse_args() assert os.path.exists(args.fidlc_bin) fidl_files_by_name = GetFIDLFilesByLibraryName(args.sdk_base, args.root) fidlc_command = [ args.fidlc_bin, '--tables', args.output_c_tables, '--json', args.json ] if args.target_api_level: fidlc_command += [ '--available', 'fuchsia:{api_level}'.format(api_level=args.target_api_level), ] # Create an iterator that works on both python3 and python2 try: fidl_files_by_name_iter = list(fidl_files_by_name.items()) except AttributeError: fidl_files_by_name_iter = iter(fidl_files_by_name.items()) for _, fidl_files in fidl_files_by_name_iter: fidlc_command.append('--files') for fidl_file in fidl_files: fidl_abspath = os.path.abspath('%s/%s' % (args.sdk_base, fidl_file)) fidlc_command.append(fidl_abspath) subprocess.check_call(fidlc_command) if args.fidlgen_output_root: assert os.path.exists(args.json) for fidlgen_bin in args.fidlgen_bin: assert os.path.exists(fidlgen_bin) fidlgen_command = [ fidlgen_bin, '-json', args.json, '-root', args.fidlgen_output_root ] subprocess.check_call(fidlgen_command) else: # --fidlgen-bin and --fidlgen-output-root should be passed in together. assert not args.fidlgen_bin return 0 if __name__ == '__main__': sys.exit(main())