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 argparse
195f9996aaSopenharmony_ciimport json
205f9996aaSopenharmony_ciimport os
215f9996aaSopenharmony_ci
225f9996aaSopenharmony_ciKCONFIG_STR = 'config {}\n\
235f9996aaSopenharmony_ci    bool "{}"\n\
245f9996aaSopenharmony_ci    default n\n'
255f9996aaSopenharmony_ciPROPERTIES_STR = 'config {}\n\
265f9996aaSopenharmony_ci        string "{}"\n\
275f9996aaSopenharmony_ci        default ""\n'
285f9996aaSopenharmony_ciKMENU_STR = 'menu "{}"\n'
295f9996aaSopenharmony_ci
305f9996aaSopenharmony_ciFEATURE_STR = 'config feature$$%s\n\
315f9996aaSopenharmony_ci        string "feature"\n\
325f9996aaSopenharmony_ci        default ""\n\
335f9996aaSopenharmony_ci        depends on %s\n'
345f9996aaSopenharmony_ci
355f9996aaSopenharmony_ci
365f9996aaSopenharmony_cidef create_config(name: str, comment: str):
375f9996aaSopenharmony_ci    return KCONFIG_STR.format(name, comment)
385f9996aaSopenharmony_ci
395f9996aaSopenharmony_ci
405f9996aaSopenharmony_cidef create_property(name: str, comment: str):
415f9996aaSopenharmony_ci    return PROPERTIES_STR.format(name, comment)
425f9996aaSopenharmony_ci
435f9996aaSopenharmony_ci
445f9996aaSopenharmony_cidef create_menu(name: str):
455f9996aaSopenharmony_ci    return KMENU_STR.format(name)
465f9996aaSopenharmony_ci
475f9996aaSopenharmony_ci
485f9996aaSopenharmony_cidef end_menu():
495f9996aaSopenharmony_ci    return "endmenu\n"
505f9996aaSopenharmony_ci
515f9996aaSopenharmony_ci
525f9996aaSopenharmony_cidef create_feature(name: str):
535f9996aaSopenharmony_ci    return FEATURE_STR % (name, name)
545f9996aaSopenharmony_ci
555f9996aaSopenharmony_ci
565f9996aaSopenharmony_cidef read_json(file: str):
575f9996aaSopenharmony_ci    data = {}
585f9996aaSopenharmony_ci    with open(file, "rb") as f:
595f9996aaSopenharmony_ci        data = json.load(f)
605f9996aaSopenharmony_ci    return data
615f9996aaSopenharmony_ci
625f9996aaSopenharmony_ci
635f9996aaSopenharmony_cidef write_kconfig(result: str, outdir: str):
645f9996aaSopenharmony_ci    outpath = os.path.join(outdir, "kconfig")
655f9996aaSopenharmony_ci    with open(outpath, "w") as f:
665f9996aaSopenharmony_ci        f.writelines(result)
675f9996aaSopenharmony_ci    print("output file in: ", os.path.abspath(outpath))
685f9996aaSopenharmony_ci
695f9996aaSopenharmony_ci
705f9996aaSopenharmony_cidef gen_kconfig(config_path: str, outdir: str):
715f9996aaSopenharmony_ci    data = read_json(config_path)
725f9996aaSopenharmony_ci    subsystems = data.get("subsystems")
735f9996aaSopenharmony_ci    result = 'mainmenu "Subsystem Component Kconfig Configuration"\n'
745f9996aaSopenharmony_ci    for prop, _ in data.items():
755f9996aaSopenharmony_ci        if prop == "subsystems":
765f9996aaSopenharmony_ci            continue
775f9996aaSopenharmony_ci        result += create_property("property$${}".format(prop), prop)
785f9996aaSopenharmony_ci
795f9996aaSopenharmony_ci    for subsys_dict in subsystems:
805f9996aaSopenharmony_ci        subsys_name = subsys_dict.get("subsystem")
815f9996aaSopenharmony_ci        result += create_menu(subsys_name)
825f9996aaSopenharmony_ci        for component_dict in subsys_dict.get("components"):
835f9996aaSopenharmony_ci            component_name = component_dict.get("component")
845f9996aaSopenharmony_ci            result += create_config("{}$${}".format(subsys_name, component_name), component_name)
855f9996aaSopenharmony_ci            result += create_feature("{}$${}".format(subsys_name, component_name))
865f9996aaSopenharmony_ci        result += end_menu()
875f9996aaSopenharmony_ci    write_kconfig(result, outdir)
885f9996aaSopenharmony_ci
895f9996aaSopenharmony_ci
905f9996aaSopenharmony_ciif __name__ == "__main__":
915f9996aaSopenharmony_ci    INTRO = 'Genenrate newly kconfig input file.\n\
925f9996aaSopenharmony_ci        For example: python3 generate_kconfig.py\n\
935f9996aaSopenharmony_ci        or           python3 generate_kconfig.py --base_product={$repo}/productdefine/common/base/base_product.json --outdir=./'
945f9996aaSopenharmony_ci    parser = argparse.ArgumentParser(
955f9996aaSopenharmony_ci        formatter_class=argparse.RawDescriptionHelpFormatter,
965f9996aaSopenharmony_ci        description=INTRO
975f9996aaSopenharmony_ci    )
985f9996aaSopenharmony_ci    parser.add_argument('--base_product', type=str, default="./../../../productdefine/common/base/base_product.json",
995f9996aaSopenharmony_ci                        help='Basic config path in repo prodcutdefine,\
1005f9996aaSopenharmony_ci                                default={$repo}/productdefine/common/base/base_product.json')
1015f9996aaSopenharmony_ci    parser.add_argument('--outdir', type=str, default="./",
1025f9996aaSopenharmony_ci                        help="define output file path dir, default={$current_dir}")
1035f9996aaSopenharmony_ci    args = parser.parse_args()
1045f9996aaSopenharmony_ci    print("read base_product file: ", os.path.abspath(args.base_product))
1055f9996aaSopenharmony_ci    gen_kconfig(args.base_product, args.outdir)
106