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