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)