config.py 11.6 KB
Newer Older
M
mamingshuai 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# Copyright (c) 2020 Huawei Device Co., Ltd.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os
G
gzyang 已提交
19
import platform
M
mamingshuai 已提交
20 21
from distutils.spawn import find_executable

22 23 24 25 26 27 28 29 30
from hb_internal import CONFIG_JSON
from hb_internal import CONFIG_STRUCT
from hb_internal import BUILD_TOOLS_CFG
from hb_internal.common.utils import read_json_file
from hb_internal.common.utils import dump_json_file
from hb_internal.common.utils import Singleton
from hb_internal.common.utils import OHOSException
from hb_internal.common.utils import download_tool
from hb_internal.common.utils import makedirs
M
mamingshuai 已提交
31 32 33 34 35 36 37 38 39 40 41 42 43


class Config(metaclass=Singleton):
    def __init__(self):
        self.config_json = CONFIG_JSON

        config_content = read_json_file(self.config_json)
        self._root_path = config_content.get('root_path', None)
        self._board = config_content.get('board', None)
        self._kernel = config_content.get('kernel', None)
        self._product = config_content.get('product', None)
        self._product_path = config_content.get('product_path', None)
        self._device_path = config_content.get('device_path', None)
44
        self._device_company = config_content.get('device_company', None)
45
        self._patch_cache = config_content.get('patch_cache', None)
46 47 48 49 50 51
        self._version = config_content.get('version', '3.0')
        self._os_level = config_content.get('os_level', 'small')
        self._product_json = config_content.get('product_json', None)
        self._target_cpu = config_content.get('target_cpu', None)
        self._target_os = config_content.get('target_os', None)
        self._out_path = config_content.get('out_path', None)
H
split  
hongguo 已提交
52
        self._component_type = config_content.get('component_type', None)
P
pilipala195 已提交
53
        self.fs_attr = set()
54
        self.platform = platform.system()
M
mamingshuai 已提交
55

H
split  
hongguo 已提交
56 57 58 59 60 61 62 63 64
    @property
    def component_type(self):
        return self._component_type

    @component_type.setter
    def component_type(self, value):
        self._component_type = value
        self.config_update('component_type', self._component_type)

65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
    @property
    def target_os(self):
        return self._target_os

    @target_os.setter
    def target_os(self, value):
        self._target_os = value
        self.config_update('target_os', self._target_os)

    @property
    def target_cpu(self):
        return self._target_cpu

    @target_cpu.setter
    def target_cpu(self, value):
        self._target_cpu = value
        self.config_update('target_cpu', self._target_cpu)

    @property
    def version(self):
        return self._version

    @version.setter
    def version(self, value):
        self._version = value
        self.config_update('version', self._version)

    @property
    def os_level(self):
        return self._os_level

    @os_level.setter
    def os_level(self, value):
        self._os_level = value
        self.config_update('os_level', self._os_level)

    @property
    def product_json(self):
        return self._product_json

    @product_json.setter
    def product_json(self, value):
        self._product_json = value
        self.config_update('product_json', self._product_json)

M
mamingshuai 已提交
110 111 112
    @property
    def root_path(self):
        if self._root_path is None:
113 114
            raise OHOSException('Failed to get root_path. '
                                'Please run command "hb set" to '
G
gzyang 已提交
115
                                'init OHOS development environment')
M
mamingshuai 已提交
116 117 118 119 120 121 122

        return self._root_path

    @root_path.setter
    def root_path(self, value):
        self._root_path = os.path.abspath(value)
        if not os.path.isdir(self._root_path):
G
gzyang 已提交
123
            raise OHOSException(f'{self._root_path} is not a valid path')
M
mamingshuai 已提交
124 125 126 127 128 129 130 131 132

        config_path = os.path.join(self._root_path, 'ohos_config.json')
        if not os.path.isfile(config_path):
            self.config_create(config_path)
        self.config_update('root_path', self._root_path)

    @property
    def board(self):
        if self._board is None:
133 134
            raise OHOSException('Failed to get board. '
                                'Please run command "hb set" to '
G
gzyang 已提交
135
                                'init OHOS development environment')
M
mamingshuai 已提交
136 137 138 139 140 141 142
        return self._board

    @board.setter
    def board(self, value):
        self._board = value
        self.config_update('board', self._board)

143 144 145
    @property
    def device_company(self):
        if self._device_company is None:
146 147
            raise OHOSException('Failed to get device_company. '
                                'Please run command "hb set" to '
148 149 150 151 152 153 154 155
                                'init OHOS development environment')
        return self._device_company

    @device_company.setter
    def device_company(self, value):
        self._device_company = value
        self.config_update('device_company', self._device_company)

M
mamingshuai 已提交
156 157 158 159 160 161 162 163 164 165 166 167
    @property
    def kernel(self):
        return self._kernel

    @kernel.setter
    def kernel(self, value):
        self._kernel = value
        self.config_update('kernel', self._kernel)

    @property
    def product(self):
        if self._product is None:
168 169
            raise OHOSException('Failed to get product. '
                                'Please run command "hb set" to '
G
gzyang 已提交
170
                                'init OHOS development environment')
M
mamingshuai 已提交
171 172 173 174 175 176 177 178 179 180
        return self._product

    @product.setter
    def product(self, value):
        self._product = value
        self.config_update('product', self._product)

    @property
    def product_path(self):
        if self._product_path is None:
181 182
            raise OHOSException('Failed to get product_path. '
                                'Please run command "hb set" to '
G
gzyang 已提交
183
                                'init OHOS development environment')
M
mamingshuai 已提交
184 185 186 187 188 189 190 191 192 193 194 195 196 197
        return self._product_path

    @product_path.setter
    def product_path(self, value):
        self._product_path = value
        self.config_update('product_path', self._product_path)

    @property
    def gn_product_path(self):
        return self.product_path.replace(self.root_path, '/')

    @property
    def device_path(self):
        if self._device_path is None:
198 199
            raise OHOSException('Failed to get device_path. '
                                'Please run command "hb set" to '
G
gzyang 已提交
200
                                'init OHOS development environment')
M
mamingshuai 已提交
201 202 203 204 205 206 207 208 209 210 211 212 213
        return self._device_path

    @device_path.setter
    def device_path(self, value):
        self._device_path = value
        self.config_update('device_path', self._device_path)

    @property
    def gn_device_path(self):
        return self.device_path.replace(self.root_path, '/')

    @property
    def build_path(self):
P
pilipala195 已提交
214 215
        _build_path = os.path.join(self.root_path, 'build', 'lite')
        if not os.path.isdir(_build_path):
G
gzyang 已提交
216
            raise OHOSException(f'Invalid build path: {_build_path}')
P
pilipala195 已提交
217
        return _build_path
M
mamingshuai 已提交
218 219 220 221 222 223 224 225

    @property
    def out_path(self):
        return self._out_path

    @out_path.setter
    def out_path(self, value):
        self._out_path = value
226
        self.config_update('out_path', self._out_path)
M
mamingshuai 已提交
227 228 229

    @property
    def log_path(self):
230 231 232 233
        if self.out_path is not None:
            return os.path.join(self.out_path, 'build.log')
        else:
            raise OHOSException(f'Failed to get log_path')
M
mamingshuai 已提交
234 235 236

    @property
    def vendor_path(self):
P
pilipala195 已提交
237 238
        _vendor_path = os.path.join(self.root_path, 'vendor')
        if not os.path.isdir(_vendor_path):
G
gzyang 已提交
239
            raise OHOSException(f'Invalid vendor path: {_vendor_path}')
P
pilipala195 已提交
240
        return _vendor_path
M
mamingshuai 已提交
241

242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259
    @property
    def built_in_product_path(self):
        _built_in_product_path = os.path.join(self.root_path,
                                              'productdefine/common/products')
        if not os.path.isdir(_built_in_product_path):
            raise OHOSException(
                f'Invalid built-in product path: {_built_in_product_path}')
        return _built_in_product_path

    @property
    def built_in_device_path(self):
        _built_in_device_path = os.path.join(self.root_path,
                                             'productdefine/common/device')
        if not os.path.isdir(_built_in_device_path):
            raise OHOSException(
                f'Invalid built-in product path: {_built_in_device_path}')
        return _built_in_device_path

G
gzyang 已提交
260 261
    @property
    def build_tools_path(self):
262 263 264 265 266
        try:
            tools_path = BUILD_TOOLS_CFG[self.platform]['build_tools_path']
            return os.path.join(self.root_path, tools_path)
        except KeyError:
            raise OHOSException(f'unidentified platform: {self.platform}')
G
gzyang 已提交
267

M
mamingshuai 已提交
268 269
    @property
    def gn_path(self):
G
gzyang 已提交
270
        repo_gn_path = os.path.join(self.build_tools_path, 'gn')
271
        # gn exist.
M
mamingshuai 已提交
272 273 274
        if os.path.isfile(repo_gn_path):
            return repo_gn_path

275
        # gn not install, download and extract it.
276 277 278 279 280 281
        makedirs(self.build_tools_path, exist_ok=True)

        gn_url = BUILD_TOOLS_CFG[self.platform].get('gn')
        gn_dst = os.path.join(self.build_tools_path, 'gn_pkg')
        download_tool(gn_url, gn_dst, tgt_dir=self.build_tools_path)

282
        return repo_gn_path
M
mamingshuai 已提交
283 284 285

    @property
    def ninja_path(self):
G
gzyang 已提交
286
        repo_ninja_path = os.path.join(self.build_tools_path, 'ninja')
287
        # ninja exist.
M
mamingshuai 已提交
288 289 290
        if os.path.isfile(repo_ninja_path):
            return repo_ninja_path

291
        # ninja not install, download and extract.
Y
yangming_ha 已提交
292 293
        makedirs(self.build_tools_path, exist_ok=True)

294 295 296 297
        ninja_url = BUILD_TOOLS_CFG[self.platform].get('ninja')
        ninja_dst = os.path.join(self.build_tools_path, 'ninja_pkg')
        download_tool(ninja_url, ninja_dst, tgt_dir=self.build_tools_path)

298
        return repo_ninja_path
M
mamingshuai 已提交
299 300 301

    @property
    def clang_path(self):
302 303
        repo_clang_path = os.path.join('prebuilts', 'clang', 'ohos',
                                       'linux-x86_64', 'llvm')
304
        # clang exist
M
mamingshuai 已提交
305 306
        if os.path.isdir(repo_clang_path):
            return f'//{repo_clang_path}'
307 308 309 310 311
        # clang installed manually or auto download
        else:
            # already installed manually
            env_clang_bin_path = find_executable('clang')
            if env_clang_bin_path is not None:
312 313
                env_clang_path = os.path.abspath(
                    os.path.join(env_clang_bin_path, os.pardir, os.pardir))
314 315 316 317 318

                if os.path.basename(env_clang_path) == 'llvm':
                    return env_clang_path

            # need auto download and extract clang.
319 320
            clang_path = os.path.abspath(
                os.path.join(repo_clang_path, os.pardir))
321 322 323 324 325
            makedirs(clang_path, exist_ok=True)

            clang_url = BUILD_TOOLS_CFG[self.platform].get('clang')
            clang_dst = os.path.join(clang_path, 'clang_pkg')
            download_tool(clang_url, clang_dst, tgt_dir=clang_path)
326
            return f'//{repo_clang_path}'
M
mamingshuai 已提交
327

328 329 330 331 332 333 334 335 336
    @property
    def patch_cache(self):
        return self._patch_cache

    @patch_cache.setter
    def patch_cache(self, value):
        self._patch_cache = value
        self.config_update('patch_cache', self._patch_cache)

M
mamingshuai 已提交
337 338 339 340 341 342 343 344
    def config_create(self, config_path):
        dump_json_file(config_path, CONFIG_STRUCT)
        self.config_json = config_path

    def config_update(self, key, value):
        config_content = read_json_file(self.config_json)
        config_content[key] = value
        dump_json_file(self.config_json, config_content)