123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #
- # Copyright (c) Contributors to the Open 3D Engine Project.
- # For complete copyright and license terms please see the LICENSE at the root of this distribution.
- #
- # SPDX-License-Identifier: Apache-2.0 OR MIT
- #
- #
- import argparse
- import json
- import os
- import sys
- import subprocess
- def parse_args():
- cur_dir = os.path.dirname(os.path.abspath(__file__))
- parser = argparse.ArgumentParser()
- parser.add_argument('-p', '--platform', dest="build_platform", help="Platform to build")
- parser.add_argument('-t', '--type', dest="build_type", help="Target config type to build")
- parser.add_argument('-c', '--config', dest="build_config_filename",
- default="build_config.json",
- help="JSON filename in Platform/<platform> that defines build configurations for the platform")
- args = parser.parse_args()
- # Input validation
- if args.build_platform is None:
- print('[ci_build] No platform specified')
- sys.exit(-1)
- if args.build_type is None:
- print('[ci_build] No type specified')
- sys.exit(-1)
- return args
- def build(build_config_filename, build_platform, build_type):
- # Read build_config and locate build_type
- cwd_dir = os.getcwd()
- script_dir = os.path.dirname(os.path.abspath(__file__))
- engine_dir = os.path.abspath(os.path.join(script_dir, '../..'))
- config_dir = os.path.abspath(os.path.join(script_dir, 'Platform', build_platform))
- build_config_abspath = os.path.join(config_dir, build_config_filename)
- if not os.path.exists(build_config_abspath):
- config_dir = os.path.abspath(os.path.join(engine_dir, 'restricted', build_platform, os.path.relpath(script_dir, engine_dir)))
- build_config_abspath = os.path.join(config_dir, build_config_filename)
- if not os.path.exists(build_config_abspath):
- print('[ci_build] File: {} not found'.format(build_config_abspath))
- return -1
- with open(build_config_abspath) as f:
- build_config_json = json.load(f)
- build_type_config = build_config_json[build_type]
- if build_type_config is None:
- print('[ci_build] Build type {} was not found in {}'.format(build_type, build_config_abspath))
- # Load the command to execute
- build_cmd = build_type_config['COMMAND']
- if build_cmd is None:
- print('[ci_build] Build type {} in {} is missing required COMMAND entry'.format(build_type, build_config_abspath))
- return -1
- build_params = build_type_config['PARAMETERS']
- # Parameters are optional, so we could have none
- # build_cmd is relative to the folder where this file is
- build_cmd_path = os.path.join(script_dir, 'Platform/{}/{}'.format(build_platform, build_cmd))
- if not os.path.exists(build_cmd_path):
- config_dir = os.path.abspath(os.path.join(engine_dir, 'restricted', build_platform, os.path.relpath(script_dir, engine_dir)))
- build_cmd_path = os.path.join(config_dir, build_cmd)
- if not os.path.exists(build_cmd_path):
- print('[ci_build] File: {} not found'.format(build_cmd_path))
- return -1
- print('[ci_build] Executing \"{}\"'.format(build_cmd_path))
- print(' cwd = {}'.format(cwd_dir))
- print(' engine_dir = {}'.format(engine_dir))
- print(' parameters:')
- env_params = os.environ.copy()
- env_params['ENGINE_DIR'] = engine_dir
- for v in build_params:
- if v[:6] == "FORCE:":
- env_params[v[6:]] = build_params[v]
- print(' {} = {} (forced)'.format(v[6:], env_params[v[6:]]))
- else:
- existing_param = env_params.get(v)
- if not existing_param:
- env_params[v] = build_params[v]
- print(' {} = {} {}'.format(v, env_params[v], '(environment override)' if existing_param else ''))
- print('--------------------------------------------------------------------------------', flush=True)
- process_return = subprocess.run([build_cmd_path], cwd=cwd_dir, env=env_params, shell=True)
- print('--------------------------------------------------------------------------------')
- if process_return.returncode != 0:
- print('[ci_build] FAIL: Command {} returned {}'.format(build_cmd_path, process_return.returncode), flush=True)
- return process_return.returncode
- else:
- print('[ci_build] OK', flush=True)
- return 0
- if __name__ == "__main__":
- args = parse_args()
- ret = build(args.build_config_filename, args.build_platform, args.build_type)
- sys.exit(ret)
|