2
0
mirror of https://frontier.innolan.net/github/amigaos-cross-toolchain6.git synced 2024-10-19 10:29:55 +00:00

Almost fully reworked bootstrap.sh script.

This commit is contained in:
Krystian Bacławski
2015-08-29 12:03:59 +02:00
parent 2ade97c186
commit 9f0cefc31a
2 changed files with 135 additions and 39 deletions

View File

@ -13,6 +13,7 @@ import sys
import tarfile
import urllib2
import zipfile
import tempfile
VARS = {}
@ -105,7 +106,10 @@ def find_executable(name):
@fill_in_args
def find(root, include=None, exclude=None):
def find(root, **kwargs):
only_files = kwargs.get('only_files', False)
include = kwargs.get('include', None)
exclude = kwargs.get('exclude', None)
lst = []
for name in sorted(os.listdir(root)):
if exclude and any(fnmatch(name, pat) for pat in exclude):
@ -113,9 +117,10 @@ def find(root, include=None, exclude=None):
if include and not any(fnmatch(name, pat) for pat in include):
continue
fullname = path.join(root, name)
lst.append(fullname)
if not (path.isdir(fullname) and only_files):
lst.append(fullname)
if path.isdir(fullname):
lst.extend(find(fullname, include, exclude))
lst.extend(find(fullname, **kwargs))
return lst
@ -127,6 +132,20 @@ def touch(name):
open(name, 'a').close()
@fill_in_args
def mkdtemp(**kwargs):
if 'dir' in kwargs and not path.isdir(kwargs['dir']):
mkdir(kwargs['dir'])
return tempfile.mkdtemp(**kwargs)
@fill_in_args
def mkstemp(**kwargs):
if 'dir' in kwargs and not path.isdir(kwargs['dir']):
mkdir(kwargs['dir'])
return tempfile.mkstemp(**kwargs)
@fill_in_args
def rmtree(*names):
for name in flatten(names):
@ -183,6 +202,12 @@ def symlink(src, name):
os.symlink(src, name)
@fill_in_args
def chmod(name, mode):
debug('change permissions on "%s" to "%o"', topdir(name), mode)
os.chmod(name, mode)
@fill_in_args
def execute(*cmd):
debug('execute "%s"', " ".join(cmd))
@ -192,6 +217,15 @@ def execute(*cmd):
panic('command "%s" failed with %d', " ".join(list(ex.cmd)), ex.returncode)
@fill_in_args
def textfile(*lines):
f, name = mkstemp(dir='{tmpdir}')
debug('creating text file script "%s"', topdir(name))
os.write(f, '\n'.join(lines) + '\n')
os.close(f)
return name
@fill_in_args
def download(url, name):
u = urllib2.urlopen(url)
@ -310,50 +344,39 @@ def fetch(name, url):
@check_stamp
def unpack(name, top_dir=None, in_dir=None):
def unpack(name, work_dir='{sources}', top_dir=None, dst_dir=None):
try:
src = glob(path.join('{archives}', name) + '*')[0]
except IndexError:
panic('Missing files for "%s".', src)
panic('Missing files for "%s".', name)
dst = path.join('{sources}', name)
rmtree(dst)
dst = path.join(work_dir, dst_dir or name)
info('preparing files for "%s"', name)
if in_dir is not None:
workdir = path.join('{sources}', in_dir)
if path.isdir(src):
if top_dir is not None:
src = path.join(src, top_dir)
copytree(src, dst, exclude=['*.svn'])
else:
workdir = '{sources}'
with cwd(workdir):
if path.isdir(src):
copytree(src, dst, exclude=['*.svn'])
else:
tmpdir = mkdtemp(dir='{tmpdir}')
with cwd(tmpdir):
unarc(src)
if top_dir is not None:
move(top_dir, name)
if path.dirname(top_dir):
rmtree(path.split(top_dir))
copytree(path.join(tmpdir, top_dir or name), dst)
rmtree(tmpdir)
@check_stamp
def patch(name):
with cwd('{sources}'):
found = []
for root, _, files in os.walk(path.join('{patches}', name), topdown=True):
for name in files:
if not fnmatch(name, '*~'):
found.append(path.join(root, name))
for name in sorted(found):
def patch(name, work_dir='{sources}'):
with cwd(work_dir):
for name in find(path.join('{patches}', name),
only_files=True, exclude=['*~']):
if fnmatch(name, '*.diff'):
execute('patch', '-t', '-p0', '-i', name)
else:
dst = path.relpath(name, '{patches}')
mkdir(path.dirname(dst))
copy(path.join(root, name), dst)
copy(name, dst)
@check_stamp
@ -393,7 +416,7 @@ def install(name, *targets, **makevars):
execute('make', *args)
__all__ = ['setvar', 'panic', 'cmpver', 'find_executable', 'execute',
__all__ = ['setvar', 'panic', 'cmpver', 'find_executable', 'chmod', 'execute',
'rmtree', 'mkdir', 'copy', 'copytree', 'unarc', 'fetch', 'cwd',
'symlink', 'remove', 'move', 'find', 'env', 'path', 'check_stamp',
'unpack', 'patch', 'configure', 'build', 'install']
'symlink', 'remove', 'move', 'find', 'textfile', 'env', 'path',
'check_stamp', 'unpack', 'patch', 'configure', 'build', 'install']

View File

@ -33,7 +33,8 @@ URLS = \
'http://sun.hasenbraten.de/vasm/release/vasm.tar.gz',
'http://sun.hasenbraten.de/vlink/release/vlink.tar.gz',
'http://www.ibaug.de/vbcc/vbcc.tar.gz',
'http://mail.pb-owl.de/~frank/vbcc/current/vbcc_target_m68k-amigaos.lha']
('http://mail.pb-owl.de/~frank/vbcc/current/vbcc_target_m68k-amigaos.lha',
'vclib.lha')]
from common import * # NOQA
@ -80,7 +81,64 @@ def install_ndk():
def install_libamiga():
info('installing libamiga')
copytree('{sources}/{libamiga}/lib', '{target}/lib')
copytree('{sources}/libamiga/lib', '{target}/lib')
@check_stamp
def build_vbcc():
copytree('{sources}/vbcc', '{build}/vbcc')
mkdir('{build}/vbcc/bin')
config = textfile(
'y', 'y', 'signed char',
'y', 'unsigned char',
'n', 'y', 'signed short',
'n', 'y', 'unsigned short',
'n', 'y', 'signed int',
'n', 'y', 'unsigned int',
'n', 'y', 'signed long',
'n', 'y', 'unsigned long',
'n', 'y', 'float',
'n', 'y', 'double')
build('vbcc', TARGET='m68k', ETCDIR='\\"{target}/etc\\"', CONFIG=config)
remove(config)
@check_stamp
def build_vlink():
mkdir('{build}/vlink/objects')
build('vlink')
@check_stamp
def install_vbcc_toolchain():
info('installing vasm')
copy('{build}/vasm/vasmm68k_mot', '{target}/bin')
copy('{build}/vasm/vobjdump', '{target}/bin')
vasm = textfile(
'#!/bin/sh',
'',
'vasmm68k_mot -I{target}/os-include "$@"')
chmod(vasm, 0755)
move(vasm, '{target}/bin/vasm')
info('installing vlink')
copy('{build}/vlink/vlink', '{target}/bin')
info('installing vbcc')
copy('{build}/vbcc/bin/vbccm68k', '{target}/bin')
copy('{build}/vbcc/bin/vc', '{target}/bin')
copy('{build}/vbcc/bin/vprof', '{target}/bin')
info('installing vbcc_target_m68k-amigaos')
copytree('{sources}/vclib/targets/m68k-amigaos/include',
'{target}/vbcc-include')
copytree('{sources}/vclib/targets/m68k-amigaos/lib',
'{target}/vbcc-lib')
copy('{sources}/vclib/config/aos68k', '{target}/etc/vc.config')
def make():
@ -172,6 +230,20 @@ def make():
prepare_target()
unpack('vasm', work_dir='{build}')
build('vasm', CPU='m68k', SYNTAX='mot')
unpack('vlink', work_dir='{build}')
build_vlink()
unpack('vbcc')
patch('vbcc')
build_vbcc()
unpack('vclib', top_dir='vbcc_target_m68k-amigaos')
install_vbcc_toolchain()
"""
Older gcc compilers (i.e. 2.95.3 and 3.4.6) and binutils have to be tricked
into thinking that they're being compiled on Linux IA-32 machine. Theirs
@ -190,8 +262,8 @@ def make():
unpack('{ixemul}', top_dir='ixemul')
patch('{ixemul}')
unpack('{gcc_core}')
unpack('{gcc_gpp}')
unpack('{gcc_core}', top_dir='{gcc}', dst_dir='{gcc}')
unpack('{gcc_gpp}', top_dir='{gcc}', dst_dir='{gcc}')
patch('{gcc}')
configure('{gcc}',
'--prefix={target}',
@ -213,7 +285,7 @@ def make():
patch('{NDK}')
install_ndk()
unpack('{libamiga}', in_dir='libamiga')
unpack('libamiga', top_dir='.')
install_libamiga()
unpack('{libnix}')
@ -264,6 +336,7 @@ def clean():
rmtree('{sources}')
rmtree('{host}')
rmtree('{build}')
rmtree('{tmpdir}')
if __name__ == "__main__":
@ -308,12 +381,12 @@ if __name__ == "__main__":
gcc_gpp='gcc-g++-{gcc_ver}',
gcc='gcc-{gcc_ver}',
gpp='g++-{gcc_ver}',
libamiga='libamiga',
patches=path.join('{top}', 'patches'),
stamps=path.join('{top}', '.build-m68k', 'stamps'),
build=path.join('{top}', '.build-m68k', 'build'),
sources=path.join('{top}', '.build-m68k', 'sources'),
host=path.join('{top}', '.build-m68k', 'host'),
tmpdir=path.join('{top}', '.build-m68k', 'tmp'),
target=path.join('{top}', 'm68k-amigaos'),
archives=path.join('{top}', '.build-m68k', 'archives'))