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:
89
common.py
89
common.py
@ -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']
|
||||
|
||||
@ -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'))
|
||||
|
||||
|
||||
Reference in New Issue
Block a user