1cb93a386Sopenharmony_ci#!/usr/bin/env python 2cb93a386Sopenharmony_ci 3cb93a386Sopenharmony_ci# Copyright 2019 Google LLC. 4cb93a386Sopenharmony_ci# Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci# found in the LICENSE file. 6cb93a386Sopenharmony_ci 7cb93a386Sopenharmony_ci""" 8cb93a386Sopenharmony_ci Generate C/C++ headers and source files from the set of FIDL files 9cb93a386Sopenharmony_ci specified in the meta.json manifest. 10cb93a386Sopenharmony_ci""" 11cb93a386Sopenharmony_ci 12cb93a386Sopenharmony_ciimport argparse 13cb93a386Sopenharmony_ciimport collections 14cb93a386Sopenharmony_ciimport json 15cb93a386Sopenharmony_ciimport os 16cb93a386Sopenharmony_ciimport subprocess 17cb93a386Sopenharmony_ciimport sys 18cb93a386Sopenharmony_ci 19cb93a386Sopenharmony_cidef GetFIDLFilesRecursive(libraries, sdk_base, path): 20cb93a386Sopenharmony_ci with open(path) as json_file: 21cb93a386Sopenharmony_ci parsed = json.load(json_file) 22cb93a386Sopenharmony_ci result = [] 23cb93a386Sopenharmony_ci deps = parsed['deps'] 24cb93a386Sopenharmony_ci for dep in deps: 25cb93a386Sopenharmony_ci dep_meta_json = os.path.abspath('%s/fidl/%s/meta.json' % (sdk_base, dep)) 26cb93a386Sopenharmony_ci GetFIDLFilesRecursive(libraries, sdk_base, dep_meta_json) 27cb93a386Sopenharmony_ci libraries[parsed['name']] = result + parsed['sources'] 28cb93a386Sopenharmony_ci 29cb93a386Sopenharmony_cidef GetFIDLFilesByLibraryName(sdk_base, root): 30cb93a386Sopenharmony_ci libraries = collections.OrderedDict() 31cb93a386Sopenharmony_ci GetFIDLFilesRecursive(libraries, sdk_base, root) 32cb93a386Sopenharmony_ci return libraries 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_cidef main(): 35cb93a386Sopenharmony_ci parser = argparse.ArgumentParser() 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_ci parser.add_argument('--fidlc-bin', dest='fidlc_bin', action='store', required=True) 38cb93a386Sopenharmony_ci parser.add_argument('--fidlgen-bin', dest='fidlgen_bin', action='store', required=True) 39cb93a386Sopenharmony_ci 40cb93a386Sopenharmony_ci parser.add_argument('--sdk-base', dest='sdk_base', action='store', required=True) 41cb93a386Sopenharmony_ci parser.add_argument('--root', dest='root', action='store', required=True) 42cb93a386Sopenharmony_ci parser.add_argument('--json', dest='json', action='store', required=True) 43cb93a386Sopenharmony_ci parser.add_argument('--include-base', dest='include_base', action='store', required=True) 44cb93a386Sopenharmony_ci parser.add_argument('--output-base-cc', dest='output_base_cc', action='store', required=True) 45cb93a386Sopenharmony_ci parser.add_argument('--output-c-tables', dest='output_c_tables', action='store', required=True) 46cb93a386Sopenharmony_ci 47cb93a386Sopenharmony_ci args = parser.parse_args() 48cb93a386Sopenharmony_ci 49cb93a386Sopenharmony_ci assert os.path.exists(args.fidlc_bin) 50cb93a386Sopenharmony_ci assert os.path.exists(args.fidlgen_bin) 51cb93a386Sopenharmony_ci 52cb93a386Sopenharmony_ci fidl_files_by_name = GetFIDLFilesByLibraryName(args.sdk_base, args.root) 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci fidlc_command = [ 55cb93a386Sopenharmony_ci args.fidlc_bin, 56cb93a386Sopenharmony_ci '--tables', 57cb93a386Sopenharmony_ci args.output_c_tables, 58cb93a386Sopenharmony_ci '--json', 59cb93a386Sopenharmony_ci args.json 60cb93a386Sopenharmony_ci ] 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ci for _, fidl_files in fidl_files_by_name.iteritems(): 63cb93a386Sopenharmony_ci fidlc_command.append('--files') 64cb93a386Sopenharmony_ci for fidl_file in fidl_files: 65cb93a386Sopenharmony_ci fidl_abspath = os.path.abspath('%s/%s' % (args.sdk_base, fidl_file)) 66cb93a386Sopenharmony_ci fidlc_command.append(fidl_abspath) 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci subprocess.check_call(fidlc_command) 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ci assert os.path.exists(args.json) 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ci fidlgen_command = [ 73cb93a386Sopenharmony_ci args.fidlgen_bin, 74cb93a386Sopenharmony_ci '-generators', 75cb93a386Sopenharmony_ci 'cpp', 76cb93a386Sopenharmony_ci '-include-base', 77cb93a386Sopenharmony_ci args.include_base, 78cb93a386Sopenharmony_ci '-json', 79cb93a386Sopenharmony_ci args.json, 80cb93a386Sopenharmony_ci '-output-base', 81cb93a386Sopenharmony_ci args.output_base_cc 82cb93a386Sopenharmony_ci ] 83cb93a386Sopenharmony_ci 84cb93a386Sopenharmony_ci subprocess.check_call(fidlgen_command) 85cb93a386Sopenharmony_ci 86cb93a386Sopenharmony_ci return 0 87cb93a386Sopenharmony_ci 88cb93a386Sopenharmony_ciif __name__ == '__main__': 89cb93a386Sopenharmony_ci sys.exit(main()) 90