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 20__all__ = ["configs", "result_dict", "collector_config", "sub_com_dict"] 21 22import os 23import sys 24import argparse 25import json 26import logging 27from typing import Any, Tuple, Dict, Text 28 29import preprocess 30from pkgs.simple_yaml_tool import SimpleYamlTool 31from pkgs.basic_tool import do_nothing, BasicTool 32from get_subsystem_component import SC 33from misc import TargetNameParser, SOPostHandler, APostHandler, DefaultPostHandler, LiteLibPostHandler, \ 34 LiteComponentPostHandler, UnittestPostHandler, HAPPostHandler, HapPackPostHandler, lite_lib_s2m_post_handler, \ 35 target_s2m_post_handler, extension_handler, target_type_handler, hap_name_handler, mod_handler 36from template_processor import BaseProcessor, DefaultProcessor, StrResourceProcessor, ListResourceProcessor 37 38 39def parse_args(): 40 parser = argparse.ArgumentParser( 41 description="analysis rom size of L0 and L1 product") 42 parser.add_argument("-p", "--product_name", type=str, 43 help="product name. eg: -p ipcamera_hispark_taurus") 44 parser.add_argument("-o", "--oh_path", type=str, 45 default=".", help="root path of openharmony") 46 parser.add_argument("-g", "--recollect_gn", 47 action="store_false", help="recollect gn info or not(-g)") 48 parser.add_argument("-s", "--recollect_sc", action="store_false", 49 help="recollect subsystem_component info or not(-s)") 50 parser.add_argument("-b", "--baseline", action="store_true", 51 help="add baseline of component to the result(-b) or not.") 52 parser.add_argument("-u", "--unit_adaptive", 53 action="store_true", help="unit adaptive") 54 parser.add_argument("-f", "--output_file", type=str, default="rom_analysis_result", 55 help="basename of output file, default: rom_analysis_result. eg: rom_analysis_result") 56 args = parser.parse_args() 57 return args 58 59 60logging.basicConfig(level=logging.NOTSET) 61_args = parse_args() 62 63# # global variables 64configs = SimpleYamlTool.read_yaml("config.yaml") 65result_dict: Dict[str, Any] = dict() 66product_name = _args.product_name 67if product_name not in configs.keys(): 68 print(f"error: product_name '{product_name}' illegal") 69 exit(-1) 70project_path = BasicTool.abspath(_args.oh_path) 71recollect_gn = _args.recollect_gn 72baseline = _args.baseline 73unit_adapt = _args.unit_adaptive 74output_file = _args.output_file 75_recollect_sc = _args.recollect_sc 76_sc_json: Dict[Text, Text] = configs.get("subsystem_component") 77_sc_save = _sc_json.get("save") 78_target_type = configs["target_type"] 79_sc_output_path = _sc_json.get("filename") 80if _recollect_sc: 81 logging.info( 82 "satrt scanning subsystem_name and component via get_subsystem_comonent.py") 83 sub_com_dict: Dict = SC.run(project_path, _sc_output_path, _sc_save) 84else: 85 with open(_sc_output_path, 'r', encoding='utf-8') as f: 86 sub_com_dict = json.load(f) 87 88collector_config: Tuple[BaseProcessor] = ( 89 DefaultProcessor(project_path=project_path, # 项目根路径 90 result_dict=result_dict, # 保存结果的字典 91 # targte的类型名称,即xxx("yyy")中的xxx 92 target_type=_target_type[0], 93 # 用以进行匹配的模式串,包括匹配段落时作为前缀 94 match_pattern=fr"^( *){_target_type[0]}\(.*?\)", 95 sub_com_dict=sub_com_dict, # 从bundle.json中收集的subsystem_name和component_name信息 96 target_name_parser=TargetNameParser.single_parser, # 进行target_name解析的parser 97 other_info_handlers={ 98 "extension": extension_handler, 99 }, # 解析其他信息的parser,{"字段名":该字段的parser} 100 unit_post_handler=SOPostHandler() # 对即将进行存储的unit字典的handler,会返回一个str作为存储时的key 101 ), 102 DefaultProcessor(project_path=project_path, 103 result_dict=result_dict, 104 target_type=_target_type[1], 105 match_pattern=fr"^( *){_target_type[1]}\(.*?\)", 106 sub_com_dict=sub_com_dict, 107 target_name_parser=TargetNameParser.single_parser, 108 other_info_handlers={ 109 "extension": extension_handler, 110 }, 111 unit_post_handler=SOPostHandler(), 112 ), 113 DefaultProcessor(project_path=project_path, 114 result_dict=result_dict, 115 target_type=_target_type[2], 116 match_pattern=fr"^( *){_target_type[2]}\(.*?\)", 117 sub_com_dict=sub_com_dict, 118 target_name_parser=TargetNameParser.single_parser, 119 other_info_handlers={ 120 "extension": extension_handler, 121 }, 122 unit_post_handler=APostHandler(), 123 ), 124 DefaultProcessor(project_path=project_path, 125 result_dict=result_dict, 126 target_type=_target_type[3], 127 match_pattern=fr"^( *){_target_type[3]}\(.*?\)", 128 sub_com_dict=sub_com_dict, 129 target_name_parser=TargetNameParser.single_parser, 130 other_info_handlers={ 131 "extension": extension_handler, 132 }, 133 unit_post_handler=APostHandler(), 134 ), 135 DefaultProcessor(project_path=project_path, 136 result_dict=result_dict, 137 target_type=_target_type[4], 138 match_pattern=fr"^( *){_target_type[4]}\(.*?\)", 139 sub_com_dict=sub_com_dict, 140 target_name_parser=TargetNameParser.single_parser, 141 other_info_handlers={ 142 "extension": extension_handler, 143 }, 144 unit_post_handler=DefaultPostHandler(), 145 ), 146 DefaultProcessor(project_path=project_path, 147 result_dict=result_dict, 148 target_type=_target_type[5], 149 match_pattern=fr"^( *){_target_type[5]}\(.*?\)", 150 sub_com_dict=sub_com_dict, 151 target_name_parser=TargetNameParser.single_parser, 152 other_info_handlers={ 153 "extension": extension_handler, 154 }, 155 unit_post_handler=DefaultPostHandler(), 156 ), 157 DefaultProcessor(project_path=project_path, 158 result_dict=result_dict, 159 target_type=_target_type[6], 160 match_pattern=fr"^( *){_target_type[6]}\(.*?\)", 161 sub_com_dict=sub_com_dict, 162 target_name_parser=TargetNameParser.single_parser, 163 other_info_handlers={ 164 "real_target_type": target_type_handler, 165 "extension": extension_handler, 166 }, 167 unit_post_handler=LiteLibPostHandler(), 168 ud_post_handler=lite_lib_s2m_post_handler, 169 ), 170 DefaultProcessor(project_path=project_path, # hap有个hap_name 171 result_dict=result_dict, 172 target_type=_target_type[7], 173 match_pattern=fr"^( *){_target_type[7]}\(.*?\)", 174 sub_com_dict=sub_com_dict, 175 target_name_parser=TargetNameParser.single_parser, 176 other_info_handlers={ 177 "hap_name": hap_name_handler, 178 "extension": extension_handler, 179 }, 180 unit_post_handler=HAPPostHandler(), 181 ), 182 StrResourceProcessor(project_path=project_path, 183 result_dict=result_dict, 184 target_type=_target_type[8], 185 match_pattern=fr"^( *){_target_type[8]}\(.*?\)", 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 StrResourceProcessor(project_path=project_path, 195 result_dict=result_dict, 196 target_type=_target_type[9], 197 match_pattern=fr"^( *){_target_type[9]}\(.*?\)", 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="source" 205 ), 206 ListResourceProcessor(project_path=project_path, 207 result_dict=result_dict, 208 target_type=_target_type[10], 209 match_pattern=fr"^( *){_target_type[10]}\(.*?\)", 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="sources" 217 ), 218 StrResourceProcessor(project_path=project_path, 219 result_dict=result_dict, 220 target_type=_target_type[11], 221 match_pattern=fr"^( *){_target_type[11]}\(.*?\)", 222 sub_com_dict=sub_com_dict, 223 target_name_parser=TargetNameParser.single_parser, 224 other_info_handlers={ 225 # "extension": extension_handler, 226 }, 227 unit_post_handler=DefaultPostHandler(), 228 resource_field="source" 229 ), 230 DefaultProcessor(project_path=project_path, 231 result_dict=result_dict, 232 target_type=_target_type[12], 233 match_pattern=fr"^( *){_target_type[12]}\(.*?\)", 234 sub_com_dict=sub_com_dict, 235 target_name_parser=TargetNameParser.single_parser, 236 other_info_handlers={ 237 "real_target_type": target_type_handler, 238 # "extension": extension_handler, 239 }, 240 unit_post_handler=LiteComponentPostHandler(), 241 ), 242 DefaultProcessor(project_path=project_path, 243 result_dict=result_dict, 244 target_type=_target_type[13], 245 match_pattern=fr"^( *){_target_type[13]}\(.*?\, .*?\)", 246 sub_com_dict=sub_com_dict, 247 target_name_parser=TargetNameParser.second_parser, 248 other_info_handlers={ 249 }, 250 unit_post_handler=DefaultPostHandler(), 251 ud_post_handler=target_s2m_post_handler 252 ), 253 DefaultProcessor(project_path=project_path, 254 result_dict=result_dict, 255 target_type=_target_type[14], 256 match_pattern=fr"^( *){_target_type[14]}\(.*?\)", 257 sub_com_dict=sub_com_dict, 258 target_name_parser=TargetNameParser.single_parser, 259 other_info_handlers={ 260 "output_extension":extension_handler 261 }, 262 unit_post_handler=UnittestPostHandler(), 263 ), 264 DefaultProcessor(project_path=project_path, 265 result_dict=result_dict, 266 target_type=_target_type[15], 267 match_pattern=fr"^( *){_target_type[15]}\(.*?\)", 268 sub_com_dict=sub_com_dict, 269 target_name_parser=TargetNameParser.single_parser, 270 other_info_handlers={ 271 "hap_name": hap_name_handler, 272 "mode": mod_handler, 273 }, 274 unit_post_handler=HapPackPostHandler(), 275 ), 276 ListResourceProcessor(project_path=project_path, 277 result_dict=result_dict, 278 target_type=_target_type[16], 279 match_pattern=fr"^( *){_target_type[16]}\(.*?\)", 280 sub_com_dict=sub_com_dict, 281 target_name_parser=TargetNameParser.single_parser, 282 other_info_handlers={ 283 }, 284 unit_post_handler=DefaultPostHandler(), 285 resource_field="sources" 286 ), 287)