290 lines
9.0 KiB
Python
Executable File
290 lines
9.0 KiB
Python
Executable File
#!/usr/bin/python2.7 -B
|
|
|
|
# Build cross toolchain for AmigaOS 4.x / PowerPC target.
|
|
|
|
from fnmatch import fnmatch
|
|
from logging import info, getLogger
|
|
from os import environ
|
|
import argparse
|
|
import logging
|
|
import platform
|
|
import sys
|
|
|
|
URLS = \
|
|
['https://ftp.gnu.org/gnu/gmp/gmp-5.1.3.tar.bz2',
|
|
'https://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz',
|
|
'https://ftp.gnu.org/gnu/mpfr/mpfr-3.1.3.tar.bz2',
|
|
'https://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',
|
|
'https://ftp.gnu.org/gnu/automake/automake-1.15.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
|
|
|
|
|
|
def update_autotools(dst):
|
|
remove(path.join(dst, 'config.guess'), path.join(dst, 'config.sub'))
|
|
copy('{sources}/{automake}/lib/config.guess', path.join(dst, 'config.guess'))
|
|
copy('{sources}/{automake}/lib/config.sub', path.join(dst, 'config.sub'))
|
|
|
|
|
|
@recipe('{sdk}-prepare')
|
|
def prepare_sdk():
|
|
info('preparing AmigaOS 4.x SDK')
|
|
|
|
target = path.join('{prefix}', 'ppc-amigaos/SDK')
|
|
|
|
unpack('{sdk}', work_dir='{archives}', top_dir='SDK_Install', dst_dir='SDK')
|
|
unpack('SDK/base', top_dir='Include', dst_dir=path.join(target, 'include'))
|
|
unpack('SDK/clib2', top_dir='clib2', dst_dir=path.join(target, 'clib2'))
|
|
unpack('SDK/newlib', top_dir='newlib', dst_dir=path.join(target, 'newlib'))
|
|
|
|
|
|
def download():
|
|
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)
|
|
|
|
|
|
def build():
|
|
for var in environ.keys():
|
|
if var not in ['_', 'LOGNAME', 'HOME', 'SHELL', 'TMPDIR', 'PWD']:
|
|
del environ[var]
|
|
|
|
PATH = ['/usr/bin', '/bin']
|
|
|
|
environ['PATH'] = ":".join(PATH)
|
|
environ['LANG'] = 'C'
|
|
environ['TERM'] = 'xterm'
|
|
|
|
add_site_dir('{prefix}')
|
|
|
|
"""
|
|
Make sure we always choose known compiler (from the distro) and not one in
|
|
user's path that could shadow the original one.
|
|
"""
|
|
if platform.system() == 'Darwin':
|
|
CC, CXX = 'clang', 'clang++'
|
|
else:
|
|
CC, CXX = 'gcc', 'g++'
|
|
|
|
CC = find_executable(CC)
|
|
CXX = find_executable(CXX)
|
|
FLAGS = '-g -O2'
|
|
|
|
if getLogger().isEnabledFor(logging.DEBUG):
|
|
FLAGS += ' -Wall'
|
|
else:
|
|
FLAGS += ' -w'
|
|
environ['MAKEFLAGS'] = '--silent'
|
|
|
|
environ['CC'] = CC
|
|
environ['CXX'] = CXX
|
|
environ['PATH'] = ':'.join([path.join('{prefix}', 'bin'),
|
|
path.join('{host}', 'bin'),
|
|
environ['PATH']])
|
|
|
|
setvar(cc=environ['CC'], cxx=environ['CXX'])
|
|
|
|
"""
|
|
When we have a working compiler in our path, we shoule also check if the
|
|
required programs, headers and libraries are present.
|
|
"""
|
|
find_executable('patch')
|
|
find_executable('bison')
|
|
find_executable('flex')
|
|
find_executable('make')
|
|
find_executable('svn')
|
|
|
|
py_ver = 'python%d.%d' % (sys.version_info.major, sys.version_info.minor)
|
|
require_header([path.join(py_ver, 'Python.h')],
|
|
lang='c', errmsg='python-dev package missing')
|
|
|
|
execute('git', 'submodule', 'init', 'submodules/python-lhafile');
|
|
execute('git', 'submodule', 'update', 'submodules/python-lhafile');
|
|
unpack('python-lha', work_dir='{build}')
|
|
pysetup('python-lha')
|
|
|
|
download()
|
|
|
|
unpack('{automake}')
|
|
|
|
unpack('{texinfo}')
|
|
update_autotools('{sources}/{texinfo}/build-aux')
|
|
configure('{texinfo}', '--prefix={host}')
|
|
make('{texinfo}', parallel=True)
|
|
make('{texinfo}', 'install')
|
|
|
|
unpack('{gmp}')
|
|
update_autotools('{sources}/{gmp}')
|
|
configure('{gmp}',
|
|
'--disable-shared',
|
|
'--prefix={host}')
|
|
make('{gmp}', parallel=True)
|
|
make('{gmp}', 'install')
|
|
|
|
unpack('{mpfr}')
|
|
update_autotools('{sources}/{mpfr}')
|
|
configure('{mpfr}',
|
|
'--disable-shared',
|
|
'--prefix={host}',
|
|
'--with-gmp={host}')
|
|
make('{mpfr}', parallel=True)
|
|
make('{mpfr}', 'install')
|
|
|
|
unpack('{mpc}')
|
|
update_autotools('{sources}/{mpc}')
|
|
configure('{mpc}',
|
|
'--disable-shared',
|
|
'--prefix={host}',
|
|
'--with-gmp={host}',
|
|
'--with-mpfr={host}')
|
|
make('{mpc}', parallel=True)
|
|
make('{mpc}', 'install')
|
|
|
|
unpack('{isl}')
|
|
update_autotools('{sources}/{isl}')
|
|
configure('{isl}',
|
|
'--disable-shared',
|
|
'--prefix={host}',
|
|
'--with-gmp-prefix={host}')
|
|
make('{isl}', parallel=True)
|
|
make('{isl}', 'install')
|
|
|
|
unpack('{cloog}')
|
|
update_autotools('{sources}/{cloog}')
|
|
configure('{cloog}',
|
|
'--disable-shared',
|
|
'--prefix={host}',
|
|
'--with-isl=system',
|
|
'--with-gmp-prefix={host}',
|
|
'--with-isl-prefix={host}')
|
|
make('{cloog}', parallel=True)
|
|
make('{cloog}', 'install')
|
|
|
|
with env(CFLAGS='-Wno-error'):
|
|
update_autotools('{archives}/{binutils}')
|
|
configure('{binutils}',
|
|
'--prefix={prefix}',
|
|
'--target={target}',
|
|
from_dir='{archives}/{binutils}')
|
|
make('{binutils}', parallel=True)
|
|
make('{binutils}', 'install')
|
|
|
|
prepare_sdk()
|
|
|
|
gcc_env = {}
|
|
if cmpver('eq', '{gcc_ver}', '4.2.4'):
|
|
gcc_env.update(CFLAGS='-std=gnu89',
|
|
CC=find_executable(CC) + ' -m32',
|
|
CXX=find_executable(CXX) + ' -m32')
|
|
|
|
update_autotools('{archives}/{gcc}')
|
|
with env(**gcc_env):
|
|
configure('{gcc}',
|
|
'--prefix={prefix}',
|
|
'--target={target}',
|
|
'--with-bugurl="http://sf.net/p/adtools"',
|
|
'--with-gmp={host}',
|
|
'--with-mpfr={host}',
|
|
'--with-isl={host}',
|
|
'--with-cloog={host}',
|
|
'--enable-languages=c,c++',
|
|
'--enable-haifa',
|
|
'--enable-sjlj-exceptions',
|
|
'--disable-libstdcxx-pch',
|
|
'--disable-tls',
|
|
from_dir='{archives}/{gcc}')
|
|
make('{gcc}')
|
|
make('{gcc}', 'install')
|
|
|
|
|
|
def clean():
|
|
rmtree('{stamps}')
|
|
rmtree('{sources}')
|
|
rmtree('{host}')
|
|
rmtree('{build}')
|
|
rmtree('{tmpdir}')
|
|
|
|
|
|
if __name__ == "__main__":
|
|
logging.basicConfig(level=logging.DEBUG, format='%(levelname)s: %(message)s')
|
|
|
|
if not sys.version_info[:2] == (2, 7):
|
|
panic('I need Python 2.7 to run!')
|
|
|
|
if not any(fnmatch(platform.system(), pat)
|
|
for pat in ['Darwin', 'Linux', 'CYGWIN_NT*', 'MSYS_NT*']):
|
|
panic('Build on %s not supported!', platform.system())
|
|
|
|
if platform.machine() not in ['i686', 'x86_64']:
|
|
panic('Build on %s architecture not supported!', platform.machine())
|
|
|
|
parser = argparse.ArgumentParser(description='Build cross toolchain.')
|
|
parser.add_argument('action',
|
|
choices=['build', 'clean', 'download'],
|
|
default='build', help='perform action')
|
|
parser.add_argument('args', metavar='ARGS', type=str, nargs='*',
|
|
help='action arguments')
|
|
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('-q', '--quiet', action='store_true')
|
|
parser.add_argument('--prefix', type=str, default=None,
|
|
help='installation directory')
|
|
args = parser.parse_args()
|
|
|
|
setvar(top=path.abspath(path.dirname(sys.argv[0])),
|
|
binutils_ver=args.binutils,
|
|
gcc_ver=args.gcc,
|
|
py_ver='python%d.%d' % (sys.version_info.major, sys.version_info.minor))
|
|
|
|
setvar(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',
|
|
automake='automake-1.15',
|
|
binutils='binutils-{binutils_ver}',
|
|
sdk='SDK_53.24',
|
|
gcc='gcc-{gcc_ver}',
|
|
gpp='g++-{gcc_ver}',
|
|
target='ppc-amigaos',
|
|
python=sys.executable,
|
|
sitedir=path.join('lib', '{py_ver}', 'site-packages'),
|
|
patches=path.join('{top}', 'patches'),
|
|
stamps=path.join('{top}', '.build-ppc', 'stamps'),
|
|
build=path.join('{top}', '.build-ppc', 'build'),
|
|
sources=path.join('{top}', '.build-ppc', 'sources'),
|
|
host=path.join('{top}', '.build-ppc', 'host'),
|
|
tmpdir=path.join('{top}', '.build-ppc', 'tmp'),
|
|
prefix=path.join('{top}', 'ppc-amigaos'),
|
|
archives=path.join('{top}', '.build-ppc', 'archives'),
|
|
submodules=path.join('{top}', 'submodules'))
|
|
|
|
if args.quiet:
|
|
getLogger().setLevel(logging.INFO)
|
|
|
|
if args.prefix is not None:
|
|
setvar(prefix=args.prefix)
|
|
|
|
if not path.exists('{prefix}'):
|
|
mkdir('{prefix}')
|
|
|
|
action = args.action.replace('-', '_')
|
|
globals()[action].__call__(*args.args)
|