2
0
mirror of https://frontier.innolan.net/github/amigaos-cross-toolchain6.git synced 2024-10-19 10:29:55 +00:00
Files
amigaos-cross-toolchain6/build-ppc.py
2015-08-22 15:11:17 +02:00

241 lines
6.8 KiB
Python
Executable File

#!/usr/bin/python -B
# Build cross toolchain for AmigaOS 4.x / PowerPC target.
from glob import glob
from logging import info
from os import environ
import argparse
import logging
import platform
URLS = \
['ftp://ftp.gnu.org/gnu/gmp/gmp-5.1.3.tar.bz2',
'ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz',
'ftp://ftp.gnu.org/gnu/mpfr/mpfr-3.1.3.tar.bz2',
'ftp://ftp.gnu.org/gnu/texinfo/texinfo-4.12.tar.gz',
'http://isl.gforge.inria.fr/isl-0.12.2.tar.bz2',
'http://www.bastoul.net/cloog/pages/download/cloog-0.18.4.tar.gz',
'http://soulsphere.org/projects/lhasa/lhasa-0.3.0.tar.gz',
('http://hyperion-entertainment.biz/index.php/downloads' +
'?view=download&format=raw&file=69', 'SDK_53.24.lha'),
('svn://svn.code.sf.net/p/adtools/code/trunk/binutils', 'binutils-2.18'),
('svn://svn.code.sf.net/p/adtools/code/trunk/gcc', 'gcc-4.2.4'),
('svn://svn.code.sf.net/p/adtools/code/branches/binutils/2.23.2',
'binutils-2.23.2'),
('svn://svn.code.sf.net/p/adtools/code/branches/gcc/4.9.x', 'gcc-4.9.1')]
from common import * # NOQA
@check_stamp
def prepare_sdk():
info('preparing SDK')
base = ''
clib2 = ''
newlib = ''
with cwd('{sources}'):
for arc in ['base.lha', 'clib2-*.lha', 'newlib-*.lha']:
info('extracting "%s"' % arc)
execute('lha', '-xifq', path.join('{archives}', 'SDK_53.24.lha'),
path.join('SDK_Install', arc))
base = path.join('{sources}', glob('base*.lha')[0])
clib2 = path.join('{sources}', glob('clib2*.lha')[0])
newlib = path.join('{sources}', glob('newlib*.lha')[0])
with cwd(path.join('{target}', 'ppc-amigaos/SDK')):
execute('lha', '-xf', clib2, 'clib2/*')
execute('lha', '-xf', newlib, 'newlib/*')
execute('lha', '-xf', base, 'Include/*')
rename('Include', 'include')
def doit():
for var in environ.keys():
if var not in ['_', 'LOGNAME', 'HOME', 'SHELL', 'TMPDIR', 'PWD']:
del environ[var]
environ['PATH'] = '/usr/bin:/bin'
environ['LANG'] = 'C'
environ['TERM'] = 'xterm'
if platform.system() == 'Darwin':
cc, cxx = 'clang', 'clang++'
else:
cc, cxx = 'gcc', 'g++'
environ['CC'] = find_executable(cc)
environ['CXX'] = find_executable(cxx)
find_executable('bison')
find_executable('flex')
find_executable('make')
find_executable('svn')
environ['PATH'] = ":".join([path.join('{target}', 'bin'),
path.join('{host}', 'bin'),
environ['PATH']])
with cwd('{archives}'):
for url in URLS:
if type(url) == tuple:
url, name = url[0], url[1]
else:
name = path.basename(url)
fetch(name, url)
source('{lha}', copy=path.join('{build}', '{lha}'))
configure('{lha}',
'--disable-shared',
'--prefix={host}')
build('{lha}')
install('{lha}')
source('{texinfo}')
configure('{texinfo}',
'--prefix={host}')
build('{texinfo}')
install('{texinfo}')
source('{gmp}')
configure('{gmp}',
'--disable-shared',
'--prefix={host}')
build('{gmp}')
install('{gmp}')
source('{mpfr}')
configure('{mpfr}',
'--disable-shared',
'--prefix={host}',
'--with-gmp={host}')
build('{mpfr}')
install('{mpfr}')
source('{mpc}')
configure('{mpc}',
'--disable-shared',
'--prefix={host}',
'--with-gmp={host}',
'--with-mpfr={host}')
build('{mpc}')
install('{mpc}')
source('{isl}')
configure('{isl}',
'--disable-shared',
'--prefix={host}',
'--with-gmp-prefix={host}')
build('{isl}')
install('{isl}')
source('{cloog}')
configure('{cloog}',
'--disable-shared',
'--prefix={host}',
'--with-isl=system',
'--with-gmp-prefix={host}',
'--with-isl-prefix={host}')
build('{cloog}')
install('{cloog}')
binutils_env = {}
if cmpver('eq', '{binutils_ver}', '2.18'):
binutils_env.update(CFLAGS='-Wno-error')
elif cmpver('eq', '{binutils_ver}', '2.23.2'):
binutils_env.update(CFLAGS='-Wno-error')
source('{binutils}')
with env(**binutils_env):
configure('{binutils}',
'--prefix={target}',
'--target=ppc-amigaos')
build('{binutils}')
install('{binutils}')
prepare_sdk()
gcc_env = {}
if cmpver('eq', '{gcc_ver}', '4.2.4'):
cflags = ['-std=gnu89']
if platform.machine() == 'x86_64':
cflags.append('-m32')
gcc_env.update(CFLAGS=' '.join(cflags))
source('{gcc}')
with env(**gcc_env):
configure('{gcc}',
'--with-bugurl="http://sf.net/p/adtools"',
'--target=ppc-amigaos',
'--with-gmp={host}',
'--with-mpfr={host}',
'--with-cloog={host}',
'--prefix={target}',
'--enable-languages=c,c++',
'--enable-haifa',
'--enable-sjlj-exceptions'
'--disable-libstdcxx-pch'
'--disable-tls')
build('{gcc}')
install('{gcc}')
def clean():
rmtree('{stamps}')
rmtree('{sources}')
rmtree('{host}')
rmtree('{build}')
if __name__ == "__main__":
logging.basicConfig(level=logging.DEBUG, format='%(levelname)s: %(message)s')
parser = argparse.ArgumentParser(description='Build cross toolchain.')
parser.add_argument('action', choices=['doit', 'clean'], default='doit',
help='perform action')
parser.add_argument('--binutils', choices=['2.18', '2.23.2'], default='2.18',
help='desired binutils version')
parser.add_argument('--gcc', choices=['4.2.4', '4.9.1'], default='4.2.4',
help='desired gcc version')
parser.add_argument('--prefix', type=str, default=None,
help='installation directory')
args = parser.parse_args()
if platform.system() not in ['Darwin', 'Linux', 'Windows']:
panic('Build on %s not supported!', platform.system())
if platform.machine() not in ['i386', 'i686', 'x86_64']:
panic('Build on %s architecture not supported!', platform.machine())
setvar(top=path.abspath('.'),
binutils_ver=args.binutils,
gcc_ver=args.gcc)
setvar(lha='lhasa-0.3.0',
gmp='gmp-5.1.3',
mpfr='mpfr-3.1.3',
mpc='mpc-1.0.3',
isl='isl-0.12.2',
cloog='cloog-0.18.4',
texinfo='texinfo-4.12',
binutils='binutils-{binutils_ver}',
gcc='gcc-{gcc_ver}',
patches=path.join('{top}', 'patches'),
stamps=path.join('{top}', 'stamps'),
build=path.join('{top}', 'build'),
sources=path.join('{top}', 'sources'),
host=path.join('{top}', 'host'),
target=path.join('{top}', 'target'),
archives=path.join('{top}', 'archives', 'ppc'))
if args.prefix is not None:
setvar(target=args.prefix)
if not path.exists('{target}'):
mkdir('{target}')
eval(args.action + "()")