15f9996aaSopenharmony_ci#!/usr/bin/env python 25f9996aaSopenharmony_ci# -*- coding: utf-8 -*- 35f9996aaSopenharmony_ci# Copyright (c) 2024 Huawei Device Co., Ltd. 45f9996aaSopenharmony_ci# Licensed under the Apache License, Version 2.0 (the "License"); 55f9996aaSopenharmony_ci# you may not use this file except in compliance with the License. 65f9996aaSopenharmony_ci# You may obtain a copy of the License at 75f9996aaSopenharmony_ci# 85f9996aaSopenharmony_ci# http://www.apache.org/licenses/LICENSE-2.0 95f9996aaSopenharmony_ci# 105f9996aaSopenharmony_ci# Unless required by applicable law or agreed to in writing, software 115f9996aaSopenharmony_ci# distributed under the License is distributed on an "AS IS" BASIS, 125f9996aaSopenharmony_ci# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135f9996aaSopenharmony_ci# See the License for the specific language governing permissions and 145f9996aaSopenharmony_ci# limitations under the License. 155f9996aaSopenharmony_ciimport subprocess 165f9996aaSopenharmony_ciimport sys 175f9996aaSopenharmony_ciimport argparse 185f9996aaSopenharmony_ciimport os 195f9996aaSopenharmony_cifrom utils import get_json 205f9996aaSopenharmony_ci 215f9996aaSopenharmony_cisys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 225f9996aaSopenharmony_ci 235f9996aaSopenharmony_ci 245f9996aaSopenharmony_cidef _run_cmd(cmd: list): 255f9996aaSopenharmony_ci process = subprocess.Popen(cmd, 265f9996aaSopenharmony_ci stdout=subprocess.PIPE, 275f9996aaSopenharmony_ci stderr=subprocess.STDOUT, 285f9996aaSopenharmony_ci encoding='utf-8') 295f9996aaSopenharmony_ci for line in iter(process.stdout.readline, ''): 305f9996aaSopenharmony_ci print(line, end='') 315f9996aaSopenharmony_ci process_status = process.poll() 325f9996aaSopenharmony_ci if process_status: 335f9996aaSopenharmony_ci sys.exit(process_status) 345f9996aaSopenharmony_ci 355f9996aaSopenharmony_ci 365f9996aaSopenharmony_cidef _get_args(): 375f9996aaSopenharmony_ci parser = argparse.ArgumentParser(add_help=True) 385f9996aaSopenharmony_ci parser.add_argument("-v", "--variants", default=r".", type=str, help="variants of build target") 395f9996aaSopenharmony_ci parser.add_argument("-rp", "--root_path", default=r".", type=str, help="Path of root") 405f9996aaSopenharmony_ci args = parser.parse_args() 415f9996aaSopenharmony_ci return args 425f9996aaSopenharmony_ci 435f9996aaSopenharmony_ci 445f9996aaSopenharmony_cidef _get_all_features_info(root_path, variants) -> list: 455f9996aaSopenharmony_ci _features_info_path = os.path.join(root_path, 'out', 'preloader', variants, 'features.json') 465f9996aaSopenharmony_ci args_list = [] 475f9996aaSopenharmony_ci try: 485f9996aaSopenharmony_ci _features_json = get_json(_features_info_path) 495f9996aaSopenharmony_ci for key, value in _features_json.get('features').items(): 505f9996aaSopenharmony_ci if isinstance(value, bool): 515f9996aaSopenharmony_ci args_list.append('{}={}'.format(key, str(value).lower())) 525f9996aaSopenharmony_ci 535f9996aaSopenharmony_ci elif isinstance(value, str): 545f9996aaSopenharmony_ci args_list.append('{}="{}"'.format(key, value)) 555f9996aaSopenharmony_ci 565f9996aaSopenharmony_ci elif isinstance(value, int): 575f9996aaSopenharmony_ci args_list.append('{}={}'.format(key, value)) 585f9996aaSopenharmony_ci 595f9996aaSopenharmony_ci elif isinstance(value, list): 605f9996aaSopenharmony_ci args_list.append('{}="{}"'.format(key, "&&".join(value))) 615f9996aaSopenharmony_ci 625f9996aaSopenharmony_ci except Exception as e: 635f9996aaSopenharmony_ci print('--_get_all_features_info json error--') 645f9996aaSopenharmony_ci 655f9996aaSopenharmony_ci return args_list 665f9996aaSopenharmony_ci 675f9996aaSopenharmony_ci 685f9996aaSopenharmony_cidef _gn_cmd(root_path, variants): 695f9996aaSopenharmony_ci _features_info = _get_all_features_info(root_path, variants) 705f9996aaSopenharmony_ci _args_list = [f"ohos_indep_compiler_enable=true", f"product_name=\"{variants}\""] 715f9996aaSopenharmony_ci _args_list.extend(_features_info) 725f9996aaSopenharmony_ci 735f9996aaSopenharmony_ci _cmd_list = [f'{root_path}/prebuilts/build-tools/linux-x86/bin/gn', 'gen', 745f9996aaSopenharmony_ci '--args={}'.format(' '.join(_args_list)), 755f9996aaSopenharmony_ci '-C', f'out/{variants}'] 765f9996aaSopenharmony_ci 775f9996aaSopenharmony_ci print('Excuting gn command: {} {} --args="{}" {}'.format( 785f9996aaSopenharmony_ci f'{root_path}/prebuilts/build-tools/linux-x86/bin/gn', 'gen', 795f9996aaSopenharmony_ci ' '.join(_args_list).replace('"', "\\\""), 805f9996aaSopenharmony_ci ' '.join(_cmd_list[3:])), 815f9996aaSopenharmony_ci 'info') 825f9996aaSopenharmony_ci return _cmd_list 835f9996aaSopenharmony_ci 845f9996aaSopenharmony_ci 855f9996aaSopenharmony_cidef _ninja_cmd(root_path, variants): 865f9996aaSopenharmony_ci _cmd_list = [f'{root_path}/prebuilts/build-tools/linux-x86/bin/ninja', '-w', 'dupbuild=warn', '-C', 875f9996aaSopenharmony_ci f'out/{variants}'] 885f9996aaSopenharmony_ci return _cmd_list 895f9996aaSopenharmony_ci 905f9996aaSopenharmony_ci 915f9996aaSopenharmony_cidef _exec_cmd(root_path, variants): 925f9996aaSopenharmony_ci gn_cmd = _gn_cmd(root_path, variants) 935f9996aaSopenharmony_ci _run_cmd(gn_cmd) 945f9996aaSopenharmony_ci ninja_cmd = _ninja_cmd(root_path, variants) 955f9996aaSopenharmony_ci _run_cmd(ninja_cmd) 965f9996aaSopenharmony_ci 975f9996aaSopenharmony_ci 985f9996aaSopenharmony_cidef main(): 995f9996aaSopenharmony_ci args = _get_args() 1005f9996aaSopenharmony_ci variants = args.variants 1015f9996aaSopenharmony_ci root_path = args.root_path 1025f9996aaSopenharmony_ci _exec_cmd(root_path, variants) 1035f9996aaSopenharmony_ci 1045f9996aaSopenharmony_ci return 0 1055f9996aaSopenharmony_ci 1065f9996aaSopenharmony_ci 1075f9996aaSopenharmony_ciif __name__ == '__main__': 1085f9996aaSopenharmony_ci sys.exit(main()) 109