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