#!/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(
"""Fetch prebuilts needed to build LiveCode.
Usage:
fetch.py [--target TARGET]
Options:
-p, --target TARGET
Choose which target triple 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-universal'
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'
################################################################
# Parse command-line options
################################################################
def process_env_options(opts):
vars = ('TARGET',)
for v in vars:
opts[v] = os.getenv(v)
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'):
opts['TARGET'] = value
offset += 2
continue
# Unrecognised option
error("Unrecognised option '{}'".format(key))
################################################################
# Validate
################################################################
def validate_target(opts):
target = opts['TARGET']
if target is None:
target = guess_target()
if target is None:
error("Cannot guess target; specify '--target -'")
opts['TARGET'] = target
################################################################
# Action
################################################################
def exec_fetch_libraries(build_platform, build_arch):
if platform.system() == 'Windows':
args = [".\util\invoke-unix.bat", "prebuilt/fetch-libraries.sh", build_platform, build_arch]
else:
args = ["./prebuilt/fetch-libraries.sh", build_platform, build_arch]
print(' '.join(args))
status = subprocess.call(args)
if status != 0:
sys.exit(status)
def get_fetch_arch(platform, arch):
if platform in ['mac', 'ios']:
return "Universal"
elif platform == 'linux' and arch == 'x86':
return "i386"
else:
return arch
def fetch(args):
opts = {}
process_env_options(opts)
process_arg_options(opts, args)
validate_target(opts)
host_components = guess_target().split('-')
target_components = opts['TARGET'].split('-')
# Get the host platform to pass to fetch-libraries
host_platform = host_components[0]
host_arch = get_fetch_arch(host_platform, host_components[1])
# Get the target platform to pass to fetch-libraries
target_platform = target_components[1]
target_arch = get_fetch_arch(target_platform, target_components[0])
print('Fetching host platform prebuilts (' + host_platform + ')')
exec_fetch_libraries(host_platform, host_arch)
print('Fetching target platform prebuilts (' + target_platform + ')')
exec_fetch_libraries(target_platform, target_arch)
if __name__ == '__main__':
fetch(sys.argv[1:])