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