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 argparse 17import os 18import sys 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 24from scripts.util.build_utils import write_depfile # noqa: E402 25 26 27def get_source_name(module_type, name, prefix_override, suffix, 28 alternative_suffix): 29 """Generate source file name by type.""" 30 if (module_type == 'lib' 31 or module_type == 'lib64') and not prefix_override: 32 if not name.startswith('lib'): 33 name = 'lib' + name 34 alias = '' 35 if module_type == 'java_library' and alternative_suffix: 36 alias = '%s%s' % (name, alternative_suffix) 37 if suffix: 38 name = '%s%s' % (name, suffix) 39 if module_type == 'none': 40 name = '' 41 return name, alias 42 43 44def get_type_dir(module_type): 45 """Get the install directory by type.""" 46 return module_type 47 48 49def _gen_install_dest(base_dir, module_install_dir, relative_install_dir, 50 module_type): 51 """Generate module install dir by user config.""" 52 if module_install_dir != '': 53 _install_dir = os.path.join(base_dir, module_install_dir) 54 elif relative_install_dir != '': 55 _install_dir = os.path.join(base_dir, get_type_dir(module_type), 56 relative_install_dir) 57 else: 58 _install_dir = os.path.join(base_dir, get_type_dir(module_type)) 59 return _install_dir 60 61 62def gen_install_dests(system_base_dir, ramdisk_base_dir, vendor_base_dir, updater_base_dir, 63 updater_vendor_base_dir, sys_prod_base_dir, chip_prod_base_dir, 64 eng_system_base_dir, eng_chipset_base_dir, cloud_rom_base_dir, source_file_name, 65 install_images, module_install_dir, relative_install_dir, module_type): 66 """Generate module install dir by user config.""" 67 dests = [] 68 if module_type == "none": 69 return dests 70 dest = '' 71 for image in install_images: 72 if image == 'system': 73 dest = _gen_install_dest(system_base_dir, module_install_dir, 74 relative_install_dir, module_type) 75 elif image == 'ramdisk': 76 dest = _gen_install_dest(ramdisk_base_dir, module_install_dir, 77 relative_install_dir, module_type) 78 elif image == 'vendor': 79 dest = _gen_install_dest(vendor_base_dir, module_install_dir, 80 relative_install_dir, module_type) 81 elif image == 'updater': 82 dest = _gen_install_dest(updater_base_dir, module_install_dir, 83 relative_install_dir, module_type) 84 elif image == 'updater_vendor': 85 dest = _gen_install_dest(updater_vendor_base_dir, module_install_dir, 86 relative_install_dir, module_type) 87 elif image == 'sys_prod': 88 dest = _gen_install_dest(sys_prod_base_dir, module_install_dir, 89 relative_install_dir, module_type) 90 elif image == 'chip_prod': 91 dest = _gen_install_dest(chip_prod_base_dir, module_install_dir, 92 relative_install_dir, module_type) 93 elif image == 'eng_system': 94 dest = _gen_install_dest(eng_system_base_dir, module_install_dir, 95 relative_install_dir, module_type) 96 elif image == 'eng_chipset': 97 dest = _gen_install_dest(eng_chipset_base_dir, module_install_dir, 98 relative_install_dir, module_type) 99 elif image == 'cloud_rom': 100 dest = _gen_install_dest(cloud_rom_base_dir, module_install_dir, 101 relative_install_dir, module_type) 102 dests.append(os.path.join(dest, source_file_name)) 103 return dests 104 105 106def gen_module_info_data(args): 107 module_source = '' 108 module_alt_source = '' 109 source_file_name = '' 110 if args.prebuilt: 111 source_file_name = os.path.basename(args.module_source) 112 module_source = args.module_source 113 if module_source.startswith("//"): 114 module_source = module_source[2:] 115 # when the app is compiled by hvigor, that means module_type == "app" and suffix == "". 116 elif args.type == "app" and not args.suffix: 117 source_file_name = "" 118 alt_source_file_name = "" 119 module_source = args.install_name 120 module_alt_source = alt_source_file_name 121 else: 122 source_file_name, alt_source_file_name = get_source_name( 123 args.type, args.install_name, args.prefix_override, args.suffix, 124 args.alternative_suffix) 125 module_source = source_file_name 126 module_alt_source = alt_source_file_name 127 128 install_dests = [] 129 if args.install_images: 130 install_dests = gen_install_dests( 131 args.system_base_dir, args.ramdisk_base_dir, args.vendor_base_dir, args.updater_base_dir, 132 args.updater_vendor_base_dir, args.sys_prod_base_dir, args.chip_prod_base_dir, 133 args.eng_system_base_dir, args.eng_chipset_base_dir, args.cloud_rom_base_dir, source_file_name, 134 args.install_images, args.module_install_dir, args.relative_install_dir, args.type) 135 136 module_info_data = gen_module_info(args.type, args.target_label, 137 args.label_name, args.source_dir, 138 module_source, module_alt_source, 139 install_dests, args.symlink_target, 140 args.install_enable, args.collect, 141 args.notice, args) 142 return module_info_data 143 144 145def gen_module_info(module_type, module_label, module_name, source_dir, 146 module_source, module_alt_source, install_dests, 147 symlink_target, install_enable, collect, notice, args): 148 """Generate module install info.""" 149 source = os.path.join(source_dir, module_source) 150 data = { 151 'type': module_type, 152 'label': module_label, 153 'label_name': module_name, 154 'source': source, 155 'dest': install_dests, 156 'collect': collect, 157 'install_enable': install_enable 158 } 159 if notice: 160 data['notice'] = notice 161 if args.part_name: 162 data['part_name'] = args.part_name 163 if args.subsystem_name: 164 data['subsystem_name'] = args.subsystem_name 165 if args.shlib_type: 166 data['shlib_type'] = args.shlib_type 167 if args.innerapi_tags: 168 data['innerapi_tags'] = args.innerapi_tags 169 if args.version_script: 170 data['version_script'] = args.version_script 171 if module_type == 'java_library': 172 data['alternative_source'] = os.path.join(source_dir, 173 module_alt_source) 174 if args.symlink_ext: 175 data['symlink_ext'] = args.symlink_ext 176 if args.symlink_path: 177 data['symlink_path'] = args.symlink_path 178 if symlink_target: 179 data['symlink'] = symlink_target 180 if args.softlink_create_path: 181 data['softlink_create_path'] = args.softlink_create_path 182 return data 183 184 185def create_module_info_parser(): 186 parser = argparse.ArgumentParser() 187 parser.add_argument('--system-base-dir', required=True) 188 parser.add_argument('--ramdisk-base-dir', required=True) 189 parser.add_argument('--vendor-base-dir', required=True) 190 parser.add_argument('--updater-base-dir', required=True) 191 parser.add_argument('--updater_vendor-base-dir', required=True) 192 parser.add_argument('--eng_system-base-dir', required=True) 193 parser.add_argument('--eng_chipset-base-dir', required=True) 194 parser.add_argument('--sys_prod-base-dir', required=True) 195 parser.add_argument('--chip_prod-base-dir', required=True) 196 parser.add_argument('--cloud_rom-base-dir', required=True) 197 parser.add_argument('--label-name', help='module name', required=True) 198 parser.add_argument('--target-label', help='target label', required=True) 199 parser.add_argument('--type', help='module type', required=True) 200 parser.add_argument('--source-dir', help='', required=True) 201 parser.add_argument('--install-images', nargs='+', help='') 202 parser.add_argument('--install-name', help='', required=False, default='') 203 parser.add_argument('--suffix', help='', required=False) 204 parser.add_argument('--alternative-suffix', 205 help='alternative extension for java library targets', 206 required=False) 207 parser.add_argument('--symlink-target', nargs='+', help='', required=False) 208 parser.add_argument('--output-file', help='', required=True) 209 parser.add_argument('--prebuilt', dest='prebuilt', action='store_true') 210 parser.add_argument('--no-prebuilt', dest='prebuilt', action='store_false') 211 parser.set_defaults(prebuilt=False) 212 parser.add_argument('--module-source', help='', required=False) 213 parser.add_argument('--install-enable', dest='install_enable', action='store_false') 214 parser.set_defaults(install_enable=True) 215 parser.add_argument('--collect', dest='collect', action='store_true') 216 parser.add_argument('--notice', help='path to notice') 217 parser.set_defaults(collect=False) 218 parser.add_argument('--module-install-dir', help='', required=False, default='') 219 parser.add_argument('--relative-install-dir', help='', required=False, default='') 220 parser.add_argument('--part-name', help='', required=False, default='') 221 parser.add_argument('--subsystem-name', help='', required=False, default='') 222 parser.add_argument('--shlib-type', help='', required=False, default='') 223 parser.add_argument('--innerapi-tags', nargs='+', help='', required=False, default='') 224 parser.add_argument('--symlink-ext', nargs='+', help='', required=False, default='') 225 parser.add_argument('--symlink-path', help='', required=False, default='') 226 parser.add_argument('--softlink-create-path', help='', required=False, default='') 227 parser.add_argument('--version_script', help='', required=False, default='') 228 parser.add_argument('--prefix-override', dest='prefix_override', action='store_true') 229 parser.add_argument('--no-prefix-override', dest='prefix_override', action='store_false') 230 parser.set_defaults(prefix_override=False) 231 parser.add_argument('--depfile', required=False) 232 return parser 233 234 235def main(): 236 args = create_module_info_parser().parse_args() 237 238 # write module info file 239 write_json_file(args.output_file, gen_module_info_data(args)) 240 241 if args.depfile: 242 _dep_files = [] 243 write_depfile(args.depfile, args.output_file, _dep_files, add_pydeps=False) 244 return 0 245 246 247if __name__ == '__main__': 248 sys.exit(main()) 249