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