xref: /build/hb/modules/ohos_build_module.py (revision 5f9996aa)
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