1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3# Copyright (c) 2022 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 16# This file is a configuration for scaning the BUILD.gn to collection compile 17# products. 18 19 20import os 21import sys 22import argparse 23import json 24import logging 25from typing import * 26 27import preprocess 28from pkgs.simple_yaml_tool import SimpleYamlTool 29from pkgs.basic_tool import do_nothing, BasicTool 30from get_subsystem_component import SC 31from misc import * 32from template_processor import * 33""" 34只给rom_analysis.py使用 35""" 36 37 38def parse_args(): 39 parser = argparse.ArgumentParser( 40 description="analysis rom size of L0 and L1 product") 41 parser.add_argument("-p", "--product_name", type=str, 42 help="product name. eg: -p ipcamera_hispark_taurus") 43 parser.add_argument("-o", "--oh_path", type=str, 44 default=".", help="root path of openharmony") 45 parser.add_argument("-g", "--recollect_gn", 46 action="store_false", help="recollect gn info or not") 47 parser.add_argument("-s", "--recollect_sc", action="store_false", 48 help="recollect subsystem_component info or not") 49 args = parser.parse_args() 50 return args 51 52 53logging.basicConfig(level=logging.INFO) 54_args = parse_args() 55 56# # global variables 57configs = SimpleYamlTool.read_yaml("config.yaml") 58result_dict: Dict[str, Any] = dict() 59 60project_path = BasicTool.abspath(_args.oh_path) 61product_name = _args.product_name 62recollect_gn = _args.recollect_gn 63_recollect_sc = _args.recollect_sc 64_sc_json: Dict[Text, Text] = configs.get("subsystem_component") 65_sc_save = _sc_json.get("save") 66_target_type = configs["target_type"] 67_sc_output_path = _sc_json.get("filename") 68if _recollect_sc: 69 logging.info( 70 "satrt scanning subsystem_name and component via get_subsystem_comonent.py") 71 sub_com_dict: Dict = SC.run(project_path, _sc_output_path, _sc_save) 72else: 73 with open(_sc_output_path, 'r', encoding='utf-8') as f: 74 sub_com_dict = json.load(f) 75 76collector_config: Tuple[BaseProcessor] = ( 77 DefaultProcessor(project_path=project_path, # 项目根路径 78 result_dict=result_dict, # 保存结果的字典 79 # targte的类型名称,即xxx("yyy")中的xxx 80 target_type=_target_type[0], 81 # 用以进行匹配的模式串,包括匹配段落时作为前缀 82 match_pattern=fr"^( *){_target_type[0]}\(.*?\)", 83 sub_com_dict=sub_com_dict, # 从bundle.json中收集的subsystem_name和component_name信息 84 target_name_parser=TargetNameParser.single_parser, # 进行target_name解析的parser 85 other_info_handlers={ 86 "extension": extension_handler, 87 }, # 解析其他信息的parser,{"字段名":该字段的parser} 88 unit_post_handler=SOPostHandler() # 对即将进行存储的unit字典的handler,会返回一个str作为存储时的key 89 ), 90 DefaultProcessor(project_path=project_path, 91 result_dict=result_dict, 92 target_type=_target_type[1], 93 match_pattern=fr"^( *){_target_type[1]}\(.*?\)", 94 sub_com_dict=sub_com_dict, 95 target_name_parser=TargetNameParser.single_parser, 96 other_info_handlers={ 97 "extension": extension_handler, 98 }, 99 unit_post_handler=SOPostHandler(), 100 ), 101 DefaultProcessor(project_path=project_path, 102 result_dict=result_dict, 103 target_type=_target_type[2], 104 match_pattern=fr"^( *){_target_type[2]}\(.*?\)", 105 sub_com_dict=sub_com_dict, 106 target_name_parser=TargetNameParser.single_parser, 107 other_info_handlers={ 108 "extension": extension_handler, 109 }, 110 unit_post_handler=APostHandler(), 111 ), 112 DefaultProcessor(project_path=project_path, 113 result_dict=result_dict, 114 target_type=_target_type[3], 115 match_pattern=fr"^( *){_target_type[3]}\(.*?\)", 116 sub_com_dict=sub_com_dict, 117 target_name_parser=TargetNameParser.single_parser, 118 other_info_handlers={ 119 "extension": extension_handler, 120 }, 121 unit_post_handler=APostHandler(), 122 ), 123 DefaultProcessor(project_path=project_path, 124 result_dict=result_dict, 125 target_type=_target_type[4], 126 match_pattern=fr"^( *){_target_type[4]}\(.*?\)", 127 sub_com_dict=sub_com_dict, 128 target_name_parser=TargetNameParser.single_parser, 129 other_info_handlers={ 130 "extension": extension_handler, 131 }, 132 unit_post_handler=DefaultPostHandler(), 133 ), 134 DefaultProcessor(project_path=project_path, 135 result_dict=result_dict, 136 target_type=_target_type[5], 137 match_pattern=fr"^( *){_target_type[5]}\(.*?\)", 138 sub_com_dict=sub_com_dict, 139 target_name_parser=TargetNameParser.single_parser, 140 other_info_handlers={ 141 "extension": extension_handler, 142 }, 143 unit_post_handler=DefaultPostHandler(), 144 ), 145 DefaultProcessor(project_path=project_path, 146 result_dict=result_dict, 147 target_type=_target_type[6], 148 match_pattern=fr"^( *){_target_type[6]}\(.*?\)", 149 sub_com_dict=sub_com_dict, 150 target_name_parser=TargetNameParser.single_parser, 151 other_info_handlers={ 152 "real_target_type": target_type_handler, 153 "extension": extension_handler, 154 }, 155 unit_post_handler=LiteLibPostHandler(), 156 ud_post_handler=LiteLibS2MPostHandler, 157 ), 158 DefaultProcessor(project_path=project_path, # hap有个hap_name 159 result_dict=result_dict, 160 target_type=_target_type[7], 161 match_pattern=fr"^( *){_target_type[7]}\(.*?\)", 162 sub_com_dict=sub_com_dict, 163 target_name_parser=TargetNameParser.single_parser, 164 other_info_handlers={ 165 "hap_name": hap_name_handler, 166 "extension": extension_handler, 167 }, 168 unit_post_handler=HAPPostHandler(), 169 ), 170 StrResourceProcessor(project_path=project_path, 171 result_dict=result_dict, 172 target_type=_target_type[8], 173 match_pattern=fr"^( *){_target_type[8]}\(.*?\)", 174 sub_com_dict=sub_com_dict, 175 target_name_parser=TargetNameParser.single_parser, 176 other_info_handlers={ 177 "extension": extension_handler, 178 }, 179 unit_post_handler=DefaultPostHandler(), 180 resource_field="source" 181 ), 182 StrResourceProcessor(project_path=project_path, 183 result_dict=result_dict, 184 target_type=_target_type[9], 185 match_pattern=fr"^( *){_target_type[9]}\(.*?\)", 186 sub_com_dict=sub_com_dict, 187 target_name_parser=TargetNameParser.single_parser, 188 other_info_handlers={ 189 "extension": extension_handler, 190 }, 191 unit_post_handler=DefaultPostHandler(), 192 resource_field="source" 193 ), 194 ListResourceProcessor(project_path=project_path, 195 result_dict=result_dict, 196 target_type=_target_type[10], 197 match_pattern=fr"^( *){_target_type[10]}\(.*?\)", 198 sub_com_dict=sub_com_dict, 199 target_name_parser=TargetNameParser.single_parser, 200 other_info_handlers={ 201 "extension": extension_handler, 202 }, 203 unit_post_handler=DefaultPostHandler(), 204 resource_field="sources" 205 ), 206 StrResourceProcessor(project_path=project_path, 207 result_dict=result_dict, 208 target_type=_target_type[11], 209 match_pattern=fr"^( *){_target_type[11]}\(.*?\)", 210 sub_com_dict=sub_com_dict, 211 target_name_parser=TargetNameParser.single_parser, 212 other_info_handlers={ 213 # "extension": extension_handler, 214 }, 215 unit_post_handler=DefaultPostHandler(), 216 resource_field="source" 217 ), 218 DefaultProcessor(project_path=project_path, 219 result_dict=result_dict, 220 target_type=_target_type[12], 221 match_pattern=fr"^( *){_target_type[12]}\(.*?\)", 222 sub_com_dict=sub_com_dict, 223 target_name_parser=TargetNameParser.single_parser, 224 other_info_handlers={ 225 "real_target_type": target_type_handler, 226 # "extension": extension_handler, 227 }, 228 unit_post_handler=LiteComponentPostHandler(), 229 ), 230 DefaultProcessor(project_path=project_path, 231 result_dict=result_dict, 232 target_type=_target_type[13], 233 match_pattern=fr"^( *){_target_type[13]}\(.*?\, .*?\)", 234 sub_com_dict=sub_com_dict, 235 target_name_parser=TargetNameParser.second_parser, 236 other_info_handlers={ 237 }, 238 unit_post_handler=DefaultPostHandler(), 239 ud_post_handler=TargetS2MPostHandler 240 ) 241) 242 243__all__ = ["configs", "result_dict", "collector_config", "sub_com_dict"] 244 245if __name__ == '__main__': 246 for c in collector_config: 247 c.run() 248 with open("demo.json", 'w', encoding='utf-8') as f: 249 json.dump(result_dict, f) 250