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
19from abc import abstractmethod
20from exceptions.ohos_exception import OHOSException
21from modules.interface.module_interface import ModuleInterface
22from services.interface.preload_interface import PreloadInterface
23from services.interface.load_interface import LoadInterface
24from services.interface.build_executor_interface import BuildExecutorInterface
25from services.interface.build_file_generator_interface import BuildFileGeneratorInterface
26from resolver.interface.args_resolver_interface import ArgsResolverInterface
27
28from util.timer_util import TimerUtil
29
30
31class BuildModuleInterface(ModuleInterface):
32
33    def __init__(self,
34                 args_dict: dict,
35                 args_resolver: ArgsResolverInterface,
36                 preloader: PreloadInterface,
37                 loader: LoadInterface,
38                 target_generator: BuildFileGeneratorInterface,
39                 target_compiler: BuildExecutorInterface):
40
41        super().__init__(args_dict, args_resolver)
42        self._loader = loader
43        self._preloader = preloader
44        self._target_generator = target_generator
45        self._target_compiler = target_compiler
46
47    @property
48    def preloader(self):
49        return self._preloader
50
51    @property
52    def loader(self):
53        return self._loader
54
55    @property
56    def target_generator(self):
57        return self._target_generator
58
59    @property
60    def target_compiler(self):
61        return self._target_compiler
62
63    def run(self):
64        try:
65            self._prebuild_and_preload()
66            self._load()
67            self._gn()
68            self._ninja()
69        except OHOSException as exception:
70            raise exception
71        else:
72            self._post_target_compilation()
73        finally:
74            self._post_build()
75
76    @abstractmethod
77    def _prebuild(self):
78        pass
79
80    @abstractmethod
81    def _preload(self):
82        pass
83
84    @TimerUtil.cost_time
85    @abstractmethod
86    def _prebuild_and_preload(self):
87        self._prebuild()
88        self._preload()
89
90    @abstractmethod
91    def _load(self):
92        pass
93
94    @abstractmethod
95    def _pre_target_generate(self):
96        pass
97
98    @abstractmethod
99    def _target_generate(self):
100        pass
101
102    @abstractmethod
103    def _post_target_generate(self):
104        pass
105
106    @TimerUtil.cost_time
107    @abstractmethod
108    def _gn(self):
109        self._pre_target_generate()
110        self._target_generate()
111        self._post_target_generate()
112
113    @abstractmethod
114    def _pre_target_compilation(self):
115        pass
116
117    @abstractmethod
118    def _target_compilation(self):
119        pass
120
121    @TimerUtil.cost_time
122    @abstractmethod
123    def _ninja(self):
124        self._pre_target_compilation()
125        self._target_compilation()
126
127    @abstractmethod
128    def _post_target_compilation(self):
129        pass
130
131    @abstractmethod
132    def _post_build(self):
133        pass
134