1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3 4# 5# Copyright (c) 2023 Huawei Device Co., Ltd. 6# Licensed under the Apache License, Version 2.0 (the "License"); 7# you may not use this file except in compliance with the License. 8# You may obtain a copy of the License at 9# 10# http://www.apache.org/licenses/LICENSE-2.0 11# 12# Unless required by applicable law or agreed to in writing, software 13# distributed under the License is distributed on an "AS IS" BASIS, 14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15# See the License for the specific language governing permissions and 16# limitations under the License. 17# 18 19 20from modules.interface.build_module_interface import BuildModuleInterface 21from resolver.interface.args_resolver_interface import ArgsResolverInterface 22from services.interface.preload_interface import PreloadInterface 23from services.interface.load_interface import LoadInterface 24from services.interface.build_file_generator_interface import BuildFileGeneratorInterface 25from services.interface.build_executor_interface import BuildExecutorInterface 26from containers.arg import BuildPhase 27from exceptions.ohos_exception import OHOSException 28from util.system_util import SystemUtil 29from util.log_util import LogUtil 30from containers.status import throw_exception 31from util.monitor import Monitor 32 33 34class OHOSBuildModule(BuildModuleInterface): 35 36 _instance = None 37 38 def __init__(self, 39 args_dict: dict, 40 args_resolver: ArgsResolverInterface, 41 preloader: PreloadInterface, 42 loader: LoadInterface, 43 target_generator: BuildFileGeneratorInterface, 44 target_compiler: BuildExecutorInterface): 45 46 super().__init__(args_dict, args_resolver, preloader, 47 loader, target_generator, target_compiler) 48 OHOSBuildModule._instance = self 49 self._start_time = SystemUtil.get_current_time() 50 51 @property 52 def build_time(self): 53 return SystemUtil.get_current_time() - self._start_time 54 55 @staticmethod 56 def get_instance(): 57 if OHOSBuildModule._instance is not None: 58 return OHOSBuildModule._instance 59 else: 60 raise OHOSException( 61 'OHOSBuildModule has not been instantiated', '0000') 62 63 @throw_exception 64 def run(self): 65 monitor = Monitor() 66 try: 67 super().run() 68 except OHOSException as exception: 69 monitor.run() 70 raise exception 71 else: 72 monitor.run() 73 LogUtil.hb_info('{} build success'.format( 74 self.args_dict.get('product_name').arg_value)) 75 76 def _prebuild(self): 77 self._run_phase(BuildPhase.PRE_BUILD) 78 79 def _preload(self): 80 self._run_phase(BuildPhase.PRE_LOAD) 81 if self.args_dict.get('fast_rebuild', None) and not self.args_dict.get('fast_rebuild').arg_value: 82 self.preloader.run() 83 84 def _load(self): 85 self._run_phase(BuildPhase.LOAD) 86 if self.args_dict.get('fast_rebuild', None) and not self.args_dict.get('fast_rebuild').arg_value: 87 self.loader.run() 88 89 def _pre_target_generate(self): 90 self._run_phase(BuildPhase.PRE_TARGET_GENERATE) 91 92 def _target_generate(self): 93 self._run_phase(BuildPhase.TARGET_GENERATE) 94 if not self.args_dict.get("build_only_load").arg_value and not self.args_dict.get("fast_rebuild").arg_value: 95 self.target_generator.run() 96 97 def _post_target_generate(self): 98 self._run_phase(BuildPhase.POST_TARGET_GENERATE) 99 100 def _pre_target_compilation(self): 101 self._run_phase(BuildPhase.PRE_TARGET_COMPILATION) 102 103 def _target_compilation(self): 104 self._run_phase(BuildPhase.TARGET_COMPILATION) 105 if not self.args_dict.get("build_only_load").arg_value and not self.args_dict.get("build_only_gn").arg_value: 106 self.target_compiler.run() 107 108 def _post_target_compilation(self): 109 self._run_phase(BuildPhase.POST_TARGET_COMPILATION) 110 111 def _post_build(self): 112 self._run_phase(BuildPhase.POST_BUILD) 113 114 def _run_phase(self, phase: BuildPhase): 115 '''Description: Traverse all registered parameters in build process and 116 execute the resolver function of the corresponding phase 117 @parameter: [phase]: Build phase corresponding to parameter 118 @return :none 119 ''' 120 for phase_arg in [arg for arg in self.args_dict.values()if arg.arg_phase == phase]: 121 self.args_resolver.resolve_arg(phase_arg, self) 122