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 read_json_file, write_json_file # noqa: E402 24 25 26def get_toolchain(current_variant, external_part_variants, platform_toolchain, current_toolchain): 27 if current_variant == 'phone': 28 toolchain = platform_toolchain.get(current_variant) 29 required_include_dir = False 30 else: 31 if current_variant in external_part_variants: 32 toolchain = platform_toolchain.get(current_variant) 33 required_include_dir = False 34 else: 35 # not ohos platform toolchain, use current_toolchain 36 toolchain = current_toolchain 37 required_include_dir = True 38 return toolchain, required_include_dir 39 40 41def _get_external_module_info(parts_inner_kits_info, external_part_name, 42 external_module_name, adapted_part_name): 43 _inner_kits_info_dict = parts_inner_kits_info.get(external_part_name) 44 if _inner_kits_info_dict is None: 45 raise Exception( 46 "external dep part '{}' doesn't exist.".format(external_part_name)) 47 if external_module_name in _inner_kits_info_dict: 48 external_module_desc_info = _inner_kits_info_dict.get( 49 external_module_name) 50 elif adapted_part_name: 51 _new_kits_info_dict = parts_inner_kits_info.get(adapted_part_name) 52 if _new_kits_info_dict is None: 53 raise Exception( 54 "part '{}' doesn't exist.".format(adapted_part_name)) 55 external_module_desc_info = _new_kits_info_dict.get( 56 external_module_name) 57 if external_module_desc_info is None: 58 raise Exception( 59 "external dep module '{}' doesn't exist in part '{}'.".format( 60 external_module_name, adapted_part_name)) 61 else: 62 raise Exception( 63 "external dep module '{}' doesn't exist in part '{}'.".format( 64 external_module_name, external_part_name)) 65 return external_module_desc_info 66 67 68def _get_external_module_from_sdk(sdk_base_dir, external_part_name, 69 external_module_name, adapted_part_name): 70 _sdk_info_file = os.path.join(sdk_base_dir, external_part_name, 71 "sdk_info.json") 72 subsystem_sdk_info = read_json_file(_sdk_info_file) 73 if subsystem_sdk_info is None: 74 raise Exception("part '{}' doesn't exist in sdk modules.".format( 75 external_part_name)) 76 77 _adapted = False 78 if external_module_name in subsystem_sdk_info: 79 sdk_module_info = subsystem_sdk_info.get(external_module_name) 80 elif adapted_part_name: 81 _new_sdk_info_file = os.path.join(sdk_base_dir, adapted_part_name, 82 "sdk_info.json") 83 _new_subsystem_sdk_info = read_json_file(_new_sdk_info_file) 84 if _new_subsystem_sdk_info is None: 85 raise Exception("part '{}' doesn't exist sdk modules.".format( 86 adapted_part_name)) 87 sdk_module_info = _new_subsystem_sdk_info.get(external_module_name) 88 if sdk_module_info is None: 89 raise Exception( 90 "external dep module '{}' doesn't exist in part '{}'.".format( 91 external_module_name, adapted_part_name)) 92 _adapted = True 93 else: 94 raise Exception( 95 "external dep module '{}' doesn't exist in part '{}'.".format( 96 external_module_name, external_part_name)) 97 return sdk_module_info, _adapted 98 99 100def _get_inner_kits_adapter_info(innerkits_adapter_info_file): 101 _parts_compatibility = {} 102 if os.path.exists(innerkits_adapter_info_file): 103 inner_kits_adapter_info = read_json_file(innerkits_adapter_info_file) 104 if inner_kits_adapter_info is None: 105 raise Exception("read inner_kits_adapter info failed.") 106 _parts_compatibility.update(inner_kits_adapter_info) 107 return _parts_compatibility 108 109 110def main(): 111 parser = argparse.ArgumentParser() 112 parser.add_argument('--external-deps', nargs='*', required=True) 113 parser.add_argument('--parts-src-flag-file', required=True) 114 parser.add_argument('--sdk-base-dir', required=True) 115 parser.add_argument('--sdk-dir-name', required=True) 116 parser.add_argument('--external-deps-temp-file', required=True) 117 parser.add_argument('--use-sdk', dest='use_sdk', action='store_true') 118 parser.set_defaults(use_sdk=False) 119 parser.add_argument('--current-toolchain', required=False, default='') 120 parser.add_argument('--component-override-map', default='', required=False) 121 parser.add_argument( 122 '--innerkits-adapter-info-file', 123 default='../../build/ohos/inner_kits_adapter.json') 124 args = parser.parse_args() 125 126 if len(args.external_deps) == 0: 127 result = {} 128 write_json_file(args.external_deps_temp_file, result) 129 return 0 130 131 # parts info 132 parts_src_flag = read_json_file(args.parts_src_flag_file) 133 # external deps list 134 external_deps = args.external_deps 135 # sdk base dir 136 sdk_base_dir = args.sdk_base_dir 137 sdk_dir_name = args.sdk_dir_name 138 use_sdk = args.use_sdk 139 140 deps = [] 141 libs = [] 142 include_dirs = [] 143 144 # load inner kits info file 145 inner_kits_info_file = 'build_configs/parts_info/inner_kits_info.json' 146 all_kits_info_dict = read_json_file(inner_kits_info_file) 147 if all_kits_info_dict is None: 148 raise Exception("read pre_build inner_kits_info failed.") 149 150 # load parts variants 151 parts_variants_info_file = 'build_configs/parts_info/parts_variants.json' 152 all_parts_variants_info = read_json_file(parts_variants_info_file) 153 if all_parts_variants_info is None: 154 raise Exception("read pre_build parts_variants failed.") 155 156 # load toolchains info 157 toolchain_variant_info_file = os.path.join('build_configs', 158 'platforms_info', 159 'toolchain_to_variant.json') 160 toolchain_variant_info = read_json_file(toolchain_variant_info_file) 161 162 # load auto install info 163 auto_install_part_file = "build_configs/auto_install_parts.json" 164 auto_install_parts = read_json_file(auto_install_part_file) 165 166 if toolchain_variant_info is None: 167 raise Exception("read pre_build parts_variants failed.") 168 toolchain_platform = toolchain_variant_info.get('toolchain_platform') 169 current_variant = toolchain_platform.get(args.current_toolchain) 170 platform_toolchain = toolchain_variant_info.get('platform_toolchain') 171 172 # compatibility interim 173 _parts_compatibility = _get_inner_kits_adapter_info( 174 args.innerkits_adapter_info_file) 175 176 for external_lib in external_deps: 177 deps_desc = external_lib.split(':') 178 external_part_name = deps_desc[0] 179 180 # If a part was assigned to override, replace the part 181 # Component_override_map is a map for origin part and new part. 182 if args.component_override_map: 183 component_override_map = read_json_file( 184 args.component_override_map) 185 for key, value in component_override_map.items(): 186 if external_part_name == key: 187 external_part_name = value 188 189 external_module_name = deps_desc[1] 190 191 # Usually the value is None 192 _adapted_part_name = _parts_compatibility.get(external_part_name) 193 194 # Check if the subsystem has source code 195 # hdf and third_party's external deps always valid because they need auto install 196 is_external_part_valid = external_part_name in parts_src_flag \ 197 or external_part_name in auto_install_parts 198 199 if not use_sdk and is_external_part_valid: 200 external_module_desc_info = _get_external_module_info( 201 all_kits_info_dict, external_part_name, external_module_name, 202 _adapted_part_name) 203 dep_label = external_module_desc_info['label'] 204 205 part_variants_info = all_parts_variants_info.get(external_part_name) 206 if part_variants_info is None: 207 raise Exception( 208 "external deps part '{}' variants info is None.".format( 209 external_part_name)) 210 toolchain, required_include_dir = get_toolchain( 211 current_variant, part_variants_info.keys(), platform_toolchain, args.current_toolchain) 212 dep_label_with_tc = "{}({})".format(dep_label, toolchain) 213 deps += [dep_label_with_tc] 214 215 if required_include_dir is True and external_module_desc_info.get( 216 'type') == 'so': 217 include_dir = external_module_desc_info.get('header_base') 218 if include_dir: 219 include_dirs.append(include_dir) 220 221 # sdk prebuilt 222 if external_module_desc_info['prebuilt_enable']: 223 libs += [external_module_desc_info['prebuilt_source']] 224 else: 225 sdk_module_info, adapted_ok = _get_external_module_from_sdk( 226 sdk_base_dir, external_part_name, external_module_name, 227 _adapted_part_name) 228 229 if adapted_ok is True: 230 _external_part_name = _adapted_part_name 231 else: 232 _external_part_name = external_part_name 233 deps += [ 234 "//{}/{}:{}".format(sdk_dir_name, _external_part_name, 235 external_module_name) 236 ] 237 # java sdk module does not need to add libs 238 if not (sdk_module_info.get('type') 239 and sdk_module_info.get('type') == 'jar'): 240 external_lib_source = sdk_module_info.get('source') 241 libs += [ 242 "//{}/{}/{}".format(sdk_dir_name, _external_part_name, 243 external_lib_source) 244 ] 245 246 result = {} 247 if deps: 248 result['deps'] = deps 249 if libs: 250 result['libs'] = libs 251 if include_dirs: 252 result['include_dirs'] = include_dirs 253 254 write_json_file(args.external_deps_temp_file, result) 255 return 0 256 257 258if __name__ == '__main__': 259 sys.exit(main()) 260