15f9996aaSopenharmony_ci#!/usr/bin/env python3 25f9996aaSopenharmony_ci# -*- coding: utf-8 -*- 35f9996aaSopenharmony_ci 45f9996aaSopenharmony_ci# 55f9996aaSopenharmony_ci# Copyright (c) 2023 Huawei Device Co., Ltd. 65f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 75f9996aaSopenharmony_ci# you may not use this file except in compliance with the License. 85f9996aaSopenharmony_ci# You may obtain a copy of the License at 95f9996aaSopenharmony_ci# 105f9996aaSopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 115f9996aaSopenharmony_ci# 125f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software 135f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 145f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 155f9996aaSopenharmony_ci# See the License for the specific language governing permissions and 165f9996aaSopenharmony_ci# limitations under the License. 175f9996aaSopenharmony_ci# 185f9996aaSopenharmony_ci 195f9996aaSopenharmony_ciimport os 205f9996aaSopenharmony_ciimport sys 215f9996aaSopenharmony_ci 225f9996aaSopenharmony_cifrom exceptions.ohos_exception import OHOSException 235f9996aaSopenharmony_cifrom services.interface.build_executor_interface import BuildExecutorInterface 245f9996aaSopenharmony_cifrom resources.config import Config 255f9996aaSopenharmony_cifrom util.system_util import SystemUtil, ExecEnviron 265f9996aaSopenharmony_cifrom util.io_util import IoUtil 275f9996aaSopenharmony_cifrom util.log_util import LogUtil 285f9996aaSopenharmony_ci 295f9996aaSopenharmony_ci 305f9996aaSopenharmony_ciclass Ninja(BuildExecutorInterface): 315f9996aaSopenharmony_ci 325f9996aaSopenharmony_ci def __init__(self): 335f9996aaSopenharmony_ci super().__init__() 345f9996aaSopenharmony_ci self.config = Config() 355f9996aaSopenharmony_ci self._regist_ninja_path() 365f9996aaSopenharmony_ci 375f9996aaSopenharmony_ci def run(self): 385f9996aaSopenharmony_ci self._execute_ninja_cmd() 395f9996aaSopenharmony_ci 405f9996aaSopenharmony_ci def _execute_ninja_cmd(self): 415f9996aaSopenharmony_ci """execute ninja cmd using registed args 425f9996aaSopenharmony_ci :raise OHOSException: when ninja failed 435f9996aaSopenharmony_ci """ 445f9996aaSopenharmony_ci ninja_cmd = [self.exec, '-w', 'dupbuild=warn', 455f9996aaSopenharmony_ci '-C', self.config.out_path] + self._convert_args() 465f9996aaSopenharmony_ci LogUtil.write_log(self.config.log_path, 475f9996aaSopenharmony_ci 'Excuting ninja command: {}'.format(' '.join(ninja_cmd)), 'info') 485f9996aaSopenharmony_ci 495f9996aaSopenharmony_ci ninja_env = ExecEnviron() 505f9996aaSopenharmony_ci ninja_env_allowlist = IoUtil.read_json_file( 515f9996aaSopenharmony_ci os.path.join( 525f9996aaSopenharmony_ci self.config.root_path, 535f9996aaSopenharmony_ci "out/preloader", 545f9996aaSopenharmony_ci self.config.product, 555f9996aaSopenharmony_ci "compile_env_allowlist.json", 565f9996aaSopenharmony_ci ) 575f9996aaSopenharmony_ci ).get("ninja") 585f9996aaSopenharmony_ci 595f9996aaSopenharmony_ci if ninja_env_allowlist: 605f9996aaSopenharmony_ci ninja_env.initenv() 615f9996aaSopenharmony_ci ninja_env.allow(ninja_env_allowlist) 625f9996aaSopenharmony_ci LogUtil.write_log( 635f9996aaSopenharmony_ci self.config.log_path, 645f9996aaSopenharmony_ci f"run ninja with environ {ninja_env.allkeys}", 655f9996aaSopenharmony_ci "info", 665f9996aaSopenharmony_ci ) 675f9996aaSopenharmony_ci 685f9996aaSopenharmony_ci log_filter = os.getenv("LOG_FILTER", "True") == "True" 695f9996aaSopenharmony_ci SystemUtil.exec_command( 705f9996aaSopenharmony_ci ninja_cmd, 715f9996aaSopenharmony_ci self.config.log_path, 725f9996aaSopenharmony_ci exec_env=ninja_env.allenv, 735f9996aaSopenharmony_ci log_filter=log_filter, 745f9996aaSopenharmony_ci log_mode=self.config.log_mode 755f9996aaSopenharmony_ci ) 765f9996aaSopenharmony_ci 775f9996aaSopenharmony_ci def _convert_args(self) -> list: 785f9996aaSopenharmony_ci """convert all registed args into a list 795f9996aaSopenharmony_ci """ 805f9996aaSopenharmony_ci args_list = [] 815f9996aaSopenharmony_ci for key, value in self._args_dict.items(): 825f9996aaSopenharmony_ci if key == 'build_target' and isinstance(value, list): 835f9996aaSopenharmony_ci args_list += value 845f9996aaSopenharmony_ci elif key == 'ninja_args' and isinstance(value, list): 855f9996aaSopenharmony_ci args_list += value 865f9996aaSopenharmony_ci else: 875f9996aaSopenharmony_ci if value == '': 885f9996aaSopenharmony_ci args_list.insert(0, key) 895f9996aaSopenharmony_ci else: 905f9996aaSopenharmony_ci args_list.insert(0, ' {}{} '.format(key, value)) 915f9996aaSopenharmony_ci return args_list 925f9996aaSopenharmony_ci 935f9996aaSopenharmony_ci def _regist_ninja_path(self): 945f9996aaSopenharmony_ci """find ninja executable 955f9996aaSopenharmony_ci :raise OHOSException: when can't find the ninja excutable 965f9996aaSopenharmony_ci """ 975f9996aaSopenharmony_ci ninja_path = os.path.join(self.config.root_path, 'prebuilts/build-tools/{}-x86/bin/ninja' 985f9996aaSopenharmony_ci .format(sys.platform)) 995f9996aaSopenharmony_ci if os.path.exists(ninja_path): 1005f9996aaSopenharmony_ci self.exec = ninja_path 1015f9996aaSopenharmony_ci else: 1025f9996aaSopenharmony_ci raise OHOSException( 1035f9996aaSopenharmony_ci 'There is no gn executable file at {}'.format(ninja_path), '0001') 104