15f9996aaSopenharmony_ci#!/usr/bin/env python3 25f9996aaSopenharmony_ci# -*- coding: utf-8 -*- 35f9996aaSopenharmony_ci""" 45f9996aaSopenharmony_ciCopyright (c) 2021 Huawei Device Co., Ltd. 55f9996aaSopenharmony_ciLicensed under the Apache License, Version 2.0 (the "License"); 65f9996aaSopenharmony_ciyou may not use this file except in compliance with the License. 75f9996aaSopenharmony_ciYou may obtain a copy of the License at 85f9996aaSopenharmony_ci 95f9996aaSopenharmony_ci http://www.apache.org/licenses/LICENSE-2.0 105f9996aaSopenharmony_ci 115f9996aaSopenharmony_ciUnless required by applicable law or agreed to in writing, software 125f9996aaSopenharmony_cidistributed under the License is distributed on an "AS IS" BASIS, 135f9996aaSopenharmony_ciWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145f9996aaSopenharmony_ciSee the License for the specific language governing permissions and 155f9996aaSopenharmony_cilimitations under the License. 165f9996aaSopenharmony_ci 175f9996aaSopenharmony_ci""" 185f9996aaSopenharmony_ciimport os 195f9996aaSopenharmony_ciimport json 205f9996aaSopenharmony_ciimport argparse 215f9996aaSopenharmony_cifrom hb.resources.config import Config 225f9996aaSopenharmony_ci 235f9996aaSopenharmony_ci""" 245f9996aaSopenharmony_ci@Desc: 255f9996aaSopenharmony_ci This script is used to generate full components 265f9996aaSopenharmony_ci example for creating new products 275f9996aaSopenharmony_ci 285f9996aaSopenharmony_ci@GUID: 295f9996aaSopenharmony_cibasic: 305f9996aaSopenharmony_ci cmd1: cd ${repo_root} 315f9996aaSopenharmony_ci cmd2: python3 ./build/tools/component_tools/full_components_generator.py 325f9996aaSopenharmony_ci base_product.json will be created in ./productdefine/common/base 335f9996aaSopenharmony_ci 345f9996aaSopenharmony_ciadvanced: 355f9996aaSopenharmony_ci cmd: python3 full_components_generator.py -h 365f9996aaSopenharmony_ci Get more information 375f9996aaSopenharmony_ci 385f9996aaSopenharmony_ci@Date 2022/01/14 395f9996aaSopenharmony_ci""" 405f9996aaSopenharmony_ci 415f9996aaSopenharmony_ci 425f9996aaSopenharmony_cidef find_files(path: str, name: str): 435f9996aaSopenharmony_ci ret, files, folders = [], [], [path] 445f9996aaSopenharmony_ci for folder in folders: 455f9996aaSopenharmony_ci for file in os.listdir(folder): 465f9996aaSopenharmony_ci abs_file = os.path.join(folder, file) 475f9996aaSopenharmony_ci if str(file) == name: 485f9996aaSopenharmony_ci files.append(abs_file) 495f9996aaSopenharmony_ci if os.path.isdir(abs_file): 505f9996aaSopenharmony_ci folders.append(abs_file) 515f9996aaSopenharmony_ci 525f9996aaSopenharmony_ci for file in files: 535f9996aaSopenharmony_ci if len(file) > 0 and os.path.exists(file): 545f9996aaSopenharmony_ci ret.append(file) 555f9996aaSopenharmony_ci return ret 565f9996aaSopenharmony_ci 575f9996aaSopenharmony_ci 585f9996aaSopenharmony_cidef read_component_from_ohos_build(file: str): 595f9996aaSopenharmony_ci ret = {"subsystem": "", "components": []} 605f9996aaSopenharmony_ci with open(file, "rb") as f: 615f9996aaSopenharmony_ci data = json.load(f) 625f9996aaSopenharmony_ci ret["subsystem"] = data.get("subsystem") 635f9996aaSopenharmony_ci for k, _ in data.get("parts").items(): 645f9996aaSopenharmony_ci ret.get("components").append(k) 655f9996aaSopenharmony_ci return ret 665f9996aaSopenharmony_ci 675f9996aaSopenharmony_ci 685f9996aaSopenharmony_cidef read_component_from_bundle_json(file: str): 695f9996aaSopenharmony_ci ret = {"subsystem": "", "components": []} 705f9996aaSopenharmony_ci with open(file, "rb") as f: 715f9996aaSopenharmony_ci data = json.load(f) 725f9996aaSopenharmony_ci ret["subsystem"] = data.get("component").get("subsystem") 735f9996aaSopenharmony_ci ret.get("components").append(data.get("component").get("name")) 745f9996aaSopenharmony_ci return ret 755f9996aaSopenharmony_ci 765f9996aaSopenharmony_ci 775f9996aaSopenharmony_cidef find_component_in_path(subsys: str, path: str): 785f9996aaSopenharmony_ci ret = set() 795f9996aaSopenharmony_ci if not os.path.exists(path): 805f9996aaSopenharmony_ci return [] 815f9996aaSopenharmony_ci files_ohos_build = find_files(path, "ohos.build") 825f9996aaSopenharmony_ci files_bundle_json = find_files(path, "bundle.json") 835f9996aaSopenharmony_ci for ohos_build in files_ohos_build: 845f9996aaSopenharmony_ci data = read_component_from_ohos_build(ohos_build) 855f9996aaSopenharmony_ci if data.get("subsystem") == subsys: 865f9996aaSopenharmony_ci ret = ret.union(set(data.get("components"))) 875f9996aaSopenharmony_ci 885f9996aaSopenharmony_ci for bundle_json in files_bundle_json: 895f9996aaSopenharmony_ci data = read_component_from_bundle_json(bundle_json) 905f9996aaSopenharmony_ci if data.get("subsystem") == subsys: 915f9996aaSopenharmony_ci ret = ret.union(set(data.get("components"))) 925f9996aaSopenharmony_ci return ret 935f9996aaSopenharmony_ci 945f9996aaSopenharmony_ci 955f9996aaSopenharmony_cidef update_components(subsys_file: str): 965f9996aaSopenharmony_ci ret = {"subsystems": []} 975f9996aaSopenharmony_ci with open(subsys_file, "rb") as f: 985f9996aaSopenharmony_ci data = json.load(f) 995f9996aaSopenharmony_ci for subsys, v in data.items(): 1005f9996aaSopenharmony_ci components_path = v.get("path") 1015f9996aaSopenharmony_ci parts = find_component_in_path(subsys, components_path) 1025f9996aaSopenharmony_ci components = [] 1035f9996aaSopenharmony_ci for part in parts: 1045f9996aaSopenharmony_ci components.append({"component": part, "features": []}) 1055f9996aaSopenharmony_ci ret.get("subsystems").append( 1065f9996aaSopenharmony_ci {"subsystem": subsys, "components": components}) 1075f9996aaSopenharmony_ci return ret 1085f9996aaSopenharmony_ci 1095f9996aaSopenharmony_ci 1105f9996aaSopenharmony_cidef main(): 1115f9996aaSopenharmony_ci conf = Config() 1125f9996aaSopenharmony_ci subsystem_json_overlay_path = os.path.join(conf.product_path, 'subsystem_config_overlay.json') 1135f9996aaSopenharmony_ci parser = argparse.ArgumentParser() 1145f9996aaSopenharmony_ci parser.add_argument('--subsys', type=str, default="./build/subsystem_config.json", 1155f9996aaSopenharmony_ci help='subsystem config file location, default=//build/subsystem_config.json') 1165f9996aaSopenharmony_ci parser.add_argument('--subsys_overlay', type=str, default=subsystem_json_overlay_path, 1175f9996aaSopenharmony_ci help='subsystem config overlay file location, default={}'.format(subsystem_json_overlay_path)) 1185f9996aaSopenharmony_ci parser.add_argument('--out', type=str, default="./productdefine/common/base/base_product.json", 1195f9996aaSopenharmony_ci help='base_config output path default //productdefine/common/base') 1205f9996aaSopenharmony_ci args = parser.parse_args() 1215f9996aaSopenharmony_ci # Only for version 3.0 config 1225f9996aaSopenharmony_ci # 'device_name' has been replaced by 'board' in 3.0 1235f9996aaSopenharmony_ci # device info has been merged into product in 3.0 1245f9996aaSopenharmony_ci # 'target cpu' need to be arm instead of arm64 due to adaption work has not been done 1255f9996aaSopenharmony_ci ret = { 1265f9996aaSopenharmony_ci "product_name": "ohos-arm64", 1275f9996aaSopenharmony_ci "version": "3.0", 1285f9996aaSopenharmony_ci "type": "standard", 1295f9996aaSopenharmony_ci "ohos_version": "OpenHarmony 3.x", 1305f9996aaSopenharmony_ci "board": "arm64", 1315f9996aaSopenharmony_ci "kernel_type": "", 1325f9996aaSopenharmony_ci "kernel_version": "", 1335f9996aaSopenharmony_ci "device_name": "arm64", 1345f9996aaSopenharmony_ci "device_company": "openharmony", 1355f9996aaSopenharmony_ci "target_os": "ohos", 1365f9996aaSopenharmony_ci "target_cpu": "arm", 1375f9996aaSopenharmony_ci "subsystems": [] 1385f9996aaSopenharmony_ci } 1395f9996aaSopenharmony_ci data = update_components(args.subsys) 1405f9996aaSopenharmony_ci ret["subsystems"] = data.get("subsystems") 1415f9996aaSopenharmony_ci if os.path.isfile(subsystem_json_overlay_path): 1425f9996aaSopenharmony_ci overlay_data = update_components(args.subsys_overlay) 1435f9996aaSopenharmony_ci ret["subsystems"].update(overlay_data.get("subsystems")) 1445f9996aaSopenharmony_ci with open(args.out, "w") as f: 1455f9996aaSopenharmony_ci f.write(json.dumps(ret, indent=2)) 1465f9996aaSopenharmony_ci print("file has generated in path: {}".format(args.out)) 1475f9996aaSopenharmony_ci 1485f9996aaSopenharmony_ci 1495f9996aaSopenharmony_ciif __name__ == '__main__': 1505f9996aaSopenharmony_ci main() 151