15f9996aaSopenharmony_ci#!/usr/bin/env python
25f9996aaSopenharmony_ci# -*- coding: utf-8 -*-
35f9996aaSopenharmony_ci# Copyright (c) 2021 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_ci
165f9996aaSopenharmony_ci
175f9996aaSopenharmony_ciimport os
185f9996aaSopenharmony_ciimport sys
195f9996aaSopenharmony_ciimport optparse
205f9996aaSopenharmony_ciimport subprocess
215f9996aaSopenharmony_ci
225f9996aaSopenharmony_ci
235f9996aaSopenharmony_cidef check_output(cmd: str, **kwargs):
245f9996aaSopenharmony_ci    process = subprocess.Popen(cmd,
255f9996aaSopenharmony_ci                               stdout=subprocess.PIPE,
265f9996aaSopenharmony_ci                               stderr=subprocess.STDOUT,
275f9996aaSopenharmony_ci                               universal_newlines=True,
285f9996aaSopenharmony_ci                               **kwargs)
295f9996aaSopenharmony_ci    for line in iter(process.stdout.readline, ''):
305f9996aaSopenharmony_ci        sys.stdout.write(line)
315f9996aaSopenharmony_ci        sys.stdout.flush()
325f9996aaSopenharmony_ci    process.wait()
335f9996aaSopenharmony_ci    return process.returncode
345f9996aaSopenharmony_ci
355f9996aaSopenharmony_ci
365f9996aaSopenharmony_cidef warning(msg: str):
375f9996aaSopenharmony_ci    print(f'\033[93m{msg}\033[0m')
385f9996aaSopenharmony_ci
395f9996aaSopenharmony_ci
405f9996aaSopenharmony_cidef do_build(args):
415f9996aaSopenharmony_ci    build_py = os.path.join(args.source_root_dir, 'build.py')
425f9996aaSopenharmony_ci    cmd = [
435f9996aaSopenharmony_ci        'python3',
445f9996aaSopenharmony_ci        build_py,
455f9996aaSopenharmony_ci        '-p',
465f9996aaSopenharmony_ci        args.product_name,
475f9996aaSopenharmony_ci    ]
485f9996aaSopenharmony_ci    build_targets = args.build_target
495f9996aaSopenharmony_ci    gn_args = args.gn_args
505f9996aaSopenharmony_ci
515f9996aaSopenharmony_ci    if args.target_cpu is not None:
525f9996aaSopenharmony_ci        cmd.extend(['--target-cpu', ''.join(args.target_cpu)])
535f9996aaSopenharmony_ci
545f9996aaSopenharmony_ci    if args.compile_config is not None:
555f9996aaSopenharmony_ci        cmd.extend(['--compile-config', ''.join(args.compile_config)])
565f9996aaSopenharmony_ci
575f9996aaSopenharmony_ci    if args.product_name == 'ohos-sdk':
585f9996aaSopenharmony_ci        gn_args.append('build_ohos_ndk=true')
595f9996aaSopenharmony_ci        gn_args.append('build_ohos_sdk=true')
605f9996aaSopenharmony_ci        build_targets.append('build_ohos_sdk')
615f9996aaSopenharmony_ci
625f9996aaSopenharmony_ci    if args.build_only_gn:
635f9996aaSopenharmony_ci        cmd.append('--build-only-gn')
645f9996aaSopenharmony_ci
655f9996aaSopenharmony_ci    if args.sparse_image:
665f9996aaSopenharmony_ci        gn_args.append('sparse_image=true')
675f9996aaSopenharmony_ci
685f9996aaSopenharmony_ci    for item in args.export_para:
695f9996aaSopenharmony_ci        key, value = item.split(':')
705f9996aaSopenharmony_ci        if key == 'PYCACHE_ENABLE' and value == 'true':
715f9996aaSopenharmony_ci            gn_args.append('pycache_enable=true')
725f9996aaSopenharmony_ci
735f9996aaSopenharmony_ci    if build_targets:
745f9996aaSopenharmony_ci        cmd.append('-T')
755f9996aaSopenharmony_ci        for target in build_targets:
765f9996aaSopenharmony_ci            cmd.append(target)
775f9996aaSopenharmony_ci
785f9996aaSopenharmony_ci    if gn_args:
795f9996aaSopenharmony_ci        cmd.extend(['--gn-args', ' '.join(gn_args)])
805f9996aaSopenharmony_ci    if args.ninja_args:
815f9996aaSopenharmony_ci        warning('--ninja-args is obsoleted, '
825f9996aaSopenharmony_ci                'please use --verbose or --keep-ninja-going instead')
835f9996aaSopenharmony_ci    if args.verbose:
845f9996aaSopenharmony_ci        cmd.append('-v')
855f9996aaSopenharmony_ci    if args.keep_ninja_going:
865f9996aaSopenharmony_ci        cmd.append('--keep-ninja-going')
875f9996aaSopenharmony_ci    if args.fast_rebuild:
885f9996aaSopenharmony_ci        cmd.append('--fast-rebuild')
895f9996aaSopenharmony_ci    if args.disable_package_image:
905f9996aaSopenharmony_ci        cmd.append('--disable-package-image')
915f9996aaSopenharmony_ci    if args.log_level == 'debug':
925f9996aaSopenharmony_ci        cmd.append('--log-level=debug')
935f9996aaSopenharmony_ci    if args.export_rust_project:
945f9996aaSopenharmony_ci        cmd.append('--export-rust-project')
955f9996aaSopenharmony_ci    if args.device_type:
965f9996aaSopenharmony_ci        cmd.append('--device-type=' + args.device_type)
975f9996aaSopenharmony_ci    if args.build_variant:
985f9996aaSopenharmony_ci        cmd.append('--build-variant=' + args.build_variant)
995f9996aaSopenharmony_ci    if args.share_ccache:
1005f9996aaSopenharmony_ci        cmd.append('--share-ccache=' + args.share_ccache)
1015f9996aaSopenharmony_ci    if args.disable_post_build:
1025f9996aaSopenharmony_ci        cmd.append('--disable-post-build')
1035f9996aaSopenharmony_ci    if args.disable_part_of_post_build:
1045f9996aaSopenharmony_ci        cmd.append('--disable-part-of-post-build')
1055f9996aaSopenharmony_ci        for option in args.disable_part_of_post_build:
1065f9996aaSopenharmony_ci            cmd.append(option)
1075f9996aaSopenharmony_ci    try:
1085f9996aaSopenharmony_ci        return check_output(cmd)
1095f9996aaSopenharmony_ci    except KeyboardInterrupt:
1105f9996aaSopenharmony_ci        print('User abort')
1115f9996aaSopenharmony_ci        return -1
1125f9996aaSopenharmony_ci
1135f9996aaSopenharmony_ci
1145f9996aaSopenharmony_cidef main():
1155f9996aaSopenharmony_ci    parser = optparse.OptionParser()
1165f9996aaSopenharmony_ci    parser.add_option('--source-root-dir')
1175f9996aaSopenharmony_ci    parser.add_option('--product-name')
1185f9996aaSopenharmony_ci    parser.add_option('--device-name')
1195f9996aaSopenharmony_ci    parser.add_option('--target-cpu')
1205f9996aaSopenharmony_ci    parser.add_option('--target-os')
1215f9996aaSopenharmony_ci    parser.add_option('--compile-config')
1225f9996aaSopenharmony_ci    parser.add_option('-T', '--build-target', action='append', default=[])
1235f9996aaSopenharmony_ci    parser.add_option('--gn-args', action='append', default=[])
1245f9996aaSopenharmony_ci    parser.add_option('--ninja-args', action='append', default=[])
1255f9996aaSopenharmony_ci    parser.add_option('-v', '--verbose', action='store_true')
1265f9996aaSopenharmony_ci    parser.add_option('--keep-ninja-going', action='store_true')
1275f9996aaSopenharmony_ci    parser.add_option('--sparse-image', action='store_true')
1285f9996aaSopenharmony_ci    parser.add_option('--jobs')
1295f9996aaSopenharmony_ci    parser.add_option('--export-para', action='append', default=[])
1305f9996aaSopenharmony_ci    parser.add_option('--export-rust-project', action='store_true')
1315f9996aaSopenharmony_ci    parser.add_option('--build-only-gn', action='store_true')
1325f9996aaSopenharmony_ci    parser.add_option('--ccache', action='store_true')
1335f9996aaSopenharmony_ci    parser.add_option('--fast-rebuild', action='store_true')
1345f9996aaSopenharmony_ci    parser.add_option('--disable-package-image', action='store_true')
1355f9996aaSopenharmony_ci    parser.add_option('--disable-post-build', action='store_true')
1365f9996aaSopenharmony_ci    parser.add_option('--disable-part-of-post-build', action='append', default=[])
1375f9996aaSopenharmony_ci    parser.add_option('--log-level', default='info')
1385f9996aaSopenharmony_ci    parser.add_option('--device-type', default='default')
1395f9996aaSopenharmony_ci    parser.add_option('--build-variant', default='root')
1405f9996aaSopenharmony_ci    parser.add_option('--share-ccache')
1415f9996aaSopenharmony_ci    args, _ = parser.parse_args()
1425f9996aaSopenharmony_ci
1435f9996aaSopenharmony_ci    if args.source_root_dir is None:
1445f9996aaSopenharmony_ci        print('Error: source_root_dir must be provided to entry.py')
1455f9996aaSopenharmony_ci        return -1
1465f9996aaSopenharmony_ci    if args.product_name is None:
1475f9996aaSopenharmony_ci        print('Error: product_name must be provided to entry.py')
1485f9996aaSopenharmony_ci        return -1
1495f9996aaSopenharmony_ci
1505f9996aaSopenharmony_ci    return do_build(args)
1515f9996aaSopenharmony_ci
1525f9996aaSopenharmony_ci
1535f9996aaSopenharmony_ciif __name__ == '__main__':
1545f9996aaSopenharmony_ci    sys.exit(main())
155