#!/usr/bin/env python # Copyright (C) 2017 LiveCode Ltd. # # This file is part of LiveCode. # # LiveCode is free software; you can redistribute it and/or modify it under # the terms of the GNU General Public License v3 as published by the Free # Software Foundation. # # LiveCode is distributed in the hope that it will be useful, but WITHOUT ANY # WARRANTY; without even the implied warranty of MERCHANTABILITY or # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License # for more details. # # You should have received a copy of the GNU General Public License # along with LiveCode. If not see . import sys import platform import os import subprocess import re def usage(exit_status): print( """Compile prebuilts needed to build LiveCode. Usage: build.py [--target-platform PLATFORM] [--target-arch ARCH] [--target-subplatform SUBPLATFORM] Options: -p, --target-platform TARGET Choose which target platform to build for -a, --target-arch ARCH Choose which target arch to build for -s, --target-subplatform SUBPLATFORM Choose which target subplatform to build for -h, --help Print this message """) for p in KNOWN_PLATFORMS: print(" " + p) sys.exit(exit_status) def error(message): print('ERROR: ' + message) sys.exit(1) def guess_target(): system = platform.system() arch = platform.machine() if system == 'Darwin': return ('mac', 'x86_64') if system == 'Linux': if re.match('^(x|i.?)86$', arch) is not None: return ('linux', 'x86') else: return ('linux', arch) if system == 'Windows': if arch == 'AMD64': return ('win32', 'x86_64') else: return ('win32', 'x86') # could not identify host platform + arch return (None, None) ################################################################ # Parse command-line options ################################################################ def process_default_options(opts): target = guess_target() opts['TARGET_PLATFORM'] = target[0] opts['TARGET_ARCH'] = target[1] opts['TARGET_SUBPLATFORM'] = None def process_env_options(opts): vars = ('TARGET_PLATFORM','TARGET_ARCH','TARGET_SUBPLATFORM') for v in vars: value = os.getenv(v) if value is not None: opts[v] = value def process_arg_options(opts, args): offset = 0 while offset < len(args): key = args[offset] if offset + 1 < len(args): value = args[offset + 1] else: value = None if key in ('-h', '--help'): usage(0) if key in ('-p', '--target-platform'): opts['TARGET_PLATFORM'] = value offset += 2 continue if key in ('-a', '--target-arch'): opts['TARGET_ARCH'] = value offset += 2 continue if key in ('-s', '--target-subplatform'): opts['TARGET_SUBPLATFORM'] = value offset += 2 continue # Unrecognised option error("Unrecognised option '{}'".format(key)) ################################################################ # Validate ################################################################ def validate_target(opts): if opts['TARGET_PLATFORM'] is None: error("Cannot guess target platform; specify '--target-platform '") if opts['TARGET_ARCH'] is None: error("Cannot guess target arch; specify '--target-arch '") # Subplatform may be unspecified if opts['TARGET_SUBPLATFORM'] is None: opts['TARGET_SUBPLATFORM'] = '' ################################################################ # Action ################################################################ def exec_build_libraries(build_platform, build_arch, build_subplatform): # set curdir to prebuilt folder os.chdir(os.path.dirname(__file__)) if platform.system() == 'Windows': args = ["build-all-libs.bat", build_platform, build_arch, build_subplatform] else: args = ["./build-libraries.sh", build_platform, build_arch, build_subplatform] print(' '.join(args)) status = subprocess.call(args) if status != 0: sys.exit(status) def build(args): opts = {} process_default_options(opts) process_env_options(opts) process_arg_options(opts, args) validate_target(opts) print('Building target platform prebuilts (' + opts['TARGET_PLATFORM'] + ',' + opts['TARGET_ARCH'] + ',' + opts['TARGET_SUBPLATFORM'] + ')') exec_build_libraries(opts['TARGET_PLATFORM'], opts['TARGET_ARCH'], opts['TARGET_SUBPLATFORM']) if __name__ == '__main__': build(sys.argv[1:])