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