1#!/usr/bin/env python 2# -*- coding: utf-8 -*- 3# Copyright (c) 2021 Huawei Device Co., Ltd. 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15 16import sys 17import argparse 18import os 19 20sys.path.append( 21 os.path.dirname(os.path.dirname(os.path.dirname( 22 os.path.abspath(__file__))))) 23from scripts.util.file_utils import write_json_file # noqa: E402 24 25 26def get_source_name(module_type, name, prefix_override, suffix, 27 alternative_suffix): 28 """Generate source file name by type.""" 29 if (module_type == 'lib' 30 or module_type == 'lib64') and not prefix_override: 31 if not name.startswith('lib'): 32 name = 'lib' + name 33 alias = '' 34 if module_type == 'java_library' and alternative_suffix: 35 alias = '%s%s' % (name, alternative_suffix) 36 if suffix: 37 name = '%s%s' % (name, suffix) 38 if module_type == 'none': 39 name = '' 40 return name, alias 41 42 43def get_type_dir(module_type): 44 """Get the install directory by type.""" 45 return module_type 46 47 48def _gen_install_dest(base_dir, module_install_dir, relative_install_dir, 49 module_type): 50 """Generate module install dir by user config.""" 51 if module_install_dir != '': 52 _install_dir = os.path.join(base_dir, module_install_dir) 53 elif relative_install_dir != '': 54 _install_dir = os.path.join(base_dir, get_type_dir(module_type), 55 relative_install_dir) 56 else: 57 _install_dir = os.path.join(base_dir, get_type_dir(module_type)) 58 return _install_dir 59 60 61def gen_install_dests(system_base_dir, ramdisk_base_dir, vendor_base_dir, 62 updater_base_dir, source_file_name, install_images, 63 module_install_dir, relative_install_dir, module_type): 64 """Generate module install dir by user config.""" 65 dests = [] 66 if module_type == "none": 67 return dests 68 dest = '' 69 for image in install_images: 70 if image == 'system': 71 dest = _gen_install_dest(system_base_dir, module_install_dir, 72 relative_install_dir, module_type) 73 elif image == 'ramdisk': 74 dest = _gen_install_dest(ramdisk_base_dir, module_install_dir, 75 relative_install_dir, module_type) 76 elif image == 'vendor': 77 dest = _gen_install_dest(vendor_base_dir, module_install_dir, 78 relative_install_dir, module_type) 79 elif image == 'updater': 80 dest = _gen_install_dest(updater_base_dir, module_install_dir, 81 relative_install_dir, module_type) 82 dests.append(os.path.join(dest, source_file_name)) 83 return dests 84 85 86def gen_module_info(module_type, module_label, module_name, source_dir, 87 module_source, module_alt_source, install_dests, 88 symlink_target, install_enable, collect, notice): 89 """Generate module install info.""" 90 source = os.path.join(source_dir, module_source) 91 data = { 92 'type': module_type, 93 'label': module_label, 94 'label_name': module_name, 95 'source': source, 96 'dest': install_dests, 97 'collect': collect, 98 'install_enable': install_enable 99 } 100 if notice: 101 data['notice'] = notice 102 if module_type == 'java_library': 103 data['alternative_source'] = os.path.join(source_dir, 104 module_alt_source) 105 if symlink_target: 106 data['symlink'] = symlink_target 107 return data 108 109 110def main(): 111 parser = argparse.ArgumentParser() 112 parser.add_argument('--system-base-dir', required=True) 113 parser.add_argument('--ramdisk-base-dir', required=True) 114 parser.add_argument('--vendor-base-dir', required=True) 115 parser.add_argument('--updater-base-dir', required=True) 116 parser.add_argument('--label-name', help='module name', required=True) 117 parser.add_argument('--target-label', help='target label', required=True) 118 parser.add_argument('--type', help='module type', required=True) 119 parser.add_argument('--source-dir', help='', required=True) 120 parser.add_argument('--install-images', nargs='+', help='') 121 parser.add_argument('--install-name', help='', required=False) 122 parser.add_argument('--suffix', help='', required=False) 123 parser.add_argument('--alternative-suffix', 124 help='alternative extension for java library targets', 125 required=False) 126 parser.add_argument('--symlink-target', nargs='+', help='', required=False) 127 parser.add_argument('--output-file', help='', required=True) 128 parser.add_argument('--prebuilt', dest='prebuilt', action='store_true') 129 parser.add_argument('--no-prebuilt', dest='prebuilt', action='store_false') 130 parser.set_defaults(prebuilt=False) 131 parser.add_argument('--module-source', help='', required=False) 132 parser.add_argument('--install-enable', 133 dest='install_enable', 134 action='store_false') 135 parser.set_defaults(install_enable=True) 136 parser.add_argument('--collect', dest='collect', action='store_true') 137 parser.add_argument('--notice', help='path to notice') 138 parser.set_defaults(collect=False) 139 parser.add_argument('--module-install-dir', help='', required=False) 140 parser.add_argument('--relative-install-dir', help='', required=False) 141 parser.add_argument('--prefix-override', 142 dest='prefix_override', 143 action='store_true') 144 parser.add_argument('--no-prefix-override', 145 dest='prefix_override', 146 action='store_false') 147 parser.set_defaults(prefix_override=False) 148 args = parser.parse_args() 149 150 module_source = '' 151 module_alt_source = '' 152 source_file_name = '' 153 if args.prebuilt: 154 source_file_name = os.path.basename(args.module_source) 155 module_source = args.module_source 156 if module_source.startswith("//"): 157 module_source = module_source[2:] 158 else: 159 source_file_name, alt_source_file_name = get_source_name( 160 args.type, args.install_name, args.prefix_override, args.suffix, 161 args.alternative_suffix) 162 module_source = source_file_name 163 module_alt_source = alt_source_file_name 164 165 install_dests = [] 166 if args.install_images: 167 install_dests = gen_install_dests( 168 args.system_base_dir, args.ramdisk_base_dir, args.vendor_base_dir, 169 args.updater_base_dir, source_file_name, args.install_images, 170 args.module_install_dir, args.relative_install_dir, args.type) 171 172 module_info_data = gen_module_info(args.type, args.target_label, 173 args.label_name, args.source_dir, 174 module_source, module_alt_source, 175 install_dests, args.symlink_target, 176 args.install_enable, args.collect, 177 args.notice) 178 179 # write module info file 180 write_json_file(args.output_file, module_info_data) 181 return 0 182 183 184if __name__ == '__main__': 185 sys.exit(main()) 186