#!/usr/bin/env python # Copyright 2019 Google LLC. # 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='store', required=True) 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('--include-base', dest='include_base', action='store', required=True) parser.add_argument('--output-base-cc', dest='output_base_cc', action='store', required=True) parser.add_argument('--output-c-tables', dest='output_c_tables', action='store', required=True) args = parser.parse_args() assert os.path.exists(args.fidlc_bin) assert os.path.exists(args.fidlgen_bin) fidl_files_by_name = GetFIDLFilesByLibraryName(args.sdk_base, args.root) fidlc_command = [ args.fidlc_bin, '--tables', args.output_c_tables, '--json', args.json ] for _, fidl_files in fidl_files_by_name.iteritems(): 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) assert os.path.exists(args.json) fidlgen_command = [ args.fidlgen_bin, '-generators', 'cpp', '-include-base', args.include_base, '-json', args.json, '-output-base', args.output_base_cc ] subprocess.check_call(fidlgen_command) return 0 if __name__ == '__main__': sys.exit(main())