4593762 [rkeene@sledge /home/rkeene/projects/build]$ cat arm-toolchain.txt
# SHORT DESC:
# LONG DESC:

# Determine software versions from our version string
# which is in the format of:
#    SUM.gccmaj.gccmin.gccrev.glibcmaj.glibcmin.glibcrev.binutilsmaj.binutilsmin.binutilsrev
BINUTILS_VERS=`echo ${pkgver} | cut -d . -f 8-10`
GCC_VERS=`echo ${pkgver} | cut -d . -f 2-4`
GLIBC_VERS=`echo ${pkgver} | cut -d . -f 5-7`
KERNEL_VERS=2.4.32
KERNEL_VERS_SHORT=2.4

# Binutils version umbers do not always have three parts
BINUTILS_VERS=`echo ${BINUTILS_VERS} | sed 's@\.0$@@'`

if [ ( ${GCC_VERS} = "3.4.5" -a ${GLIBC_VERS} = "2.3.2" ) \
	-o ( ${BINUTILS_VERS} = "2.16.1" -a ${GCC_VERS} = "3.3.6" -a ${GLIBC_VERS} = "2.3.2" ) ]; then
	echo 'Known-bad build configuration rejected.' >&2
	exit 1
fi

# Determine URLS and local names
if [ -z "${cachedir}" ]; then
	cachedir="."
fi

BINUTILS_URL=http://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VERS}.tar.bz2
GCC_URL=http://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERS}/gcc-${GCC_VERS}.tar.bz2
GLIBC_URL=http://ftp.gnu.org/gnu/glibc/glibc-${GLIBC_VERS}.tar.bz2
KERNEL_URL=http://www.kernel.org/pub/linux/kernel/v${KERNEL_VERS_SHORT}/linux-${KERNEL_VERS}.tar.bz2
BINUTILS_FILE=${cachedir}/binutils-${BINUTILS_VERS}.tar.bz2
GCC_FILE=${cachedir}/gcc-core-${GCC_VERS}.tar.bz2
GLIBC_FILE=${cachedir}/glibc-${GLIBC_VERS}.tar.bz2
KERNEL_FILE=${cachedir}/linux-${KERNEL_VERS}.tar.bz2

# Assume what directory will be created for each package
BINUTILS_DIR=binutils-${BINUTILS_VERS}
GCC_DIR=gcc-${GCC_VERS}
GLIBC_DIR=glibc-${GLIBC_VERS}
KERNEL_DIR=linux-${KERNEL_VERS}

# Fetch source
if [ ! -e ${BINUTILS_FILE} ]; then
	wget -O ${BINUTILS_FILE} ${BINUTILS_URL} || rm -f ${BINUTILS_FILE}
fi
if [ ! -e ${GCC_FILE} ]; then
	wget -O ${GCC_FILE} ${GCC_URL} || rm -f ${GCC_FILE}
fi
if [ ! -e ${GLIBC_FILE} ]; then
	wget -O ${GLIBC_FILE} ${GLIBC_URL} || rm -f ${GLIBC_FILE}
fi
if [ ! -e ${KERNEL_FILE} ]; then
	wget -O ${KERNEL_FILE} ${KERNEL_URL} || rm -f ${KERNEL_FILE}
fi

# Step 1:  Build binutils
tar -jxf ${BINUTILS_FILE} || exit 1
(
	cd ${BINUTILS_DIR} || exit 1
	./configure --prefix=/usr --with-gnu-ld --with-gnu-as --target=arm-unknown-linux-gnu i486-slackware-linux && \
	make && \
	make install || exit 1
) || exit 1
rm -rf ${BINUTILS_DIR}

# Step 2: Install kernel headers
tar -jxf ${KERNEL_FILE} || exit 1
(
	cd ${KERNEL_DIR} || exit 1

	yes '' | make oldconfig ARCH=arm || exit 1

	make dep

	mkdir /usr/arm-unknown-linux-gnu/include
	cp -a include/linux /usr/arm-unknown-linux-gnu/include/ || exit 1
	cp -a include/asm-arm /usr/arm-unknown-linux-gnu/include/asm || exit 1

	ln -s include /usr/arm-unknown-linux-gnu/sys-linux
) || exit 1
rm -rf ${KERNEL_DIR}

# Step 3: Build the GCC cross-compiler
tar -jxf ${GCC_FILE} || exit 1
(
	cd ${GCC_DIR} || exit 1

	mkdir arm-unknown-linux-gnu
	cd arm-unknown-linux-gnu

	../configure --prefix=/usr --disable-threads --with-gnu-ld --with-gnu-as --target=arm-unknown-linux-gnu --enable-languages=c i486-slackware-linux || exit 1
	make || (
		if [ ! -e gcc/crti.o ]; then
			arm-unknown-linux-gnu-as ../gcc/config/arm/crti.asm -o gcc/crti.o || exit 1
		fi
		if [ ! -e gcc/crtn.o ]; then
			arm-unknown-linux-gnu-as ../gcc/config/arm/crtn.asm -o gcc/crtn.o || exit 1
		fi

		make || exit 1
	) || (
		# Hope nobody cares we create a libc.so that contains no
		# exported symbols...
		cd gcc/
		echo 'static void *__empty = &__empty;' > libc.c
		./xgcc libc.c -shared -nostdlib -o libc.so || exit 1
		cd ../

		make || exit 1
	) || exit 1

	make install || exit 1
) || exit 1
rm -rf ${GCC_DIR}

# Step 4: Build glibc (this does not need to produce a usable glibc, just
# provide all the headers and libraries)
tar -jxf ${GLIBC_FILE} || exit 1
(
	cd ${GLIBC_DIR} || exit 1

	mkdir arm-unknown-linux-gnu
	cd arm-unknown-linux-gnu

	mv ../nptl .nptl_gone

	echo '#include <linux/input.h>' > ../sysdeps/unix/sysv/linux/arm/ioperm.c.1
	cat ../sysdeps/unix/sysv/linux/arm/ioperm.c >> ../sysdeps/unix/sysv/linux/arm/ioperm.c.1
	cat ../sysdeps/unix/sysv/linux/arm/ioperm.c.1 > ../sysdeps/unix/sysv/linux/arm/ioperm.c
	rm -f ../sysdeps/unix/sysv/linux/arm/ioperm.c.1

	echo '#include <sys/uio.h>' > ../sysdeps/unix/sysv/linux/libc_fatal.c.1
	cat ../sysdeps/unix/sysv/linux/libc_fatal.c >> ../sysdeps/unix/sysv/linux/libc_fatal.c.1
	cat ../sysdeps/unix/sysv/linux/libc_fatal.c.1 > ../sysdeps/unix/sysv/linux/libc_fatal.c
	rm -f ../sysdeps/unix/sysv/linux/libc_fatal.c.1

	../configure --prefix=/usr/arm-unknown-linux-gnu --with-gnu-ld --with-gnu-as --target=arm-unknown-linux-gnu --build=i486-slackware-linux --host=arm-unknown-linux-gnu --disable-sanity-checks || exit 1

	make || (
		echo '#define FATAL_PREPARE /**/' > ../sysdeps/unix/sysv/linux/fatal-prepare.h

		make || exit 1
	) || (
		sed 's@_IO_lock_t *\*@void *@g' ../libio/libio.h > ../libio/libio.h.1
		cat ../libio/libio.h.1 > ../libio/libio.h
		rm -f ../libio/libio.h.1

		grep -v '^ *#error' ../sysdeps/generic/bits/stdio-lock.h > ../sysdeps/generic/bits/stdio-lock.h.1
		cat ../sysdeps/generic/bits/stdio-lock.h.1 > ../sysdeps/generic/bits/stdio-lock.h
		rm -f ../sysdeps/generic/bits/stdio-lock.h.1

		make || exit 1
	) || (
		rm -f ../sysdeps/unix/sysv/linux/if_index.c
		touch ../sysdeps/unix/sysv/linux/if_index.c

		make || exit 1
	) || (
		echo 'int *__errno_location(void) { return(0); }' > ../elf/rtld.c.1
		echo 'int errno;' >> ../elf/rtld.c.1
		cat ../elf/rtld.c >> ../elf/rtld.c.1
		cat ../elf/rtld.c.1 > ../elf/rtld.c
		rm -f ../elf/rtld.c.1

		cat <<\__EOF > ../libio/fileno.c.1
void *_IO_acquire_lock(void) { return(0); }
void *_IO_release_lock(void) { return(0); }
void *__GI_if_indextoname(void) { return(0); }
void *__GI_if_nametoindex(void) { return(0); }
__EOF
		cat ../libio/fileno.c >> ../libio/fileno.c.1
		cat ../libio/fileno.c.1 > ../libio/fileno.c
		rm -f ../libio/fileno.c.1

		sed 's@__attribute__ *((nocommon))@@g' ../sysdeps/generic/errno.c | grep -v -e '^ *compat_symbol' -e '^ *strong_alias' > ../sysdeps/generic/errno.c.1
		cat ../sysdeps/generic/errno.c.1 > ../sysdeps/generic/errno.c
		rm -f ../sysdeps/generic/errno.c.1

		sed 's@__attribute__ *((.*))@@g' ../inet/herrno.c | grep -v -e '^ *compat_symbol' -e '^ *weak_alias' > ../inet/herrno.c.1
		cat ../inet/herrno.c.1 > ../inet/herrno.c
		rm -f ../inet/herrno.c.1

		sed 's@struct  *__res_state  *_res  *__attribute__ *((.*)).*@struct __res_state _res;@' ../resolv/res_libc.c | grep -v -e '^ *compat_symbol.*_res,' > ../resolv/res_libc.c.1
		cat ../resolv/res_libc.c.1 > ../resolv/res_libc.c
		rm -f ../resolv/res_libc.c.1

		make || exit 1
	) || (
		# GCC doesn't handle math stuff very well.. we provide simple (but wrong) replacements

		cat <<\__EOF > ../sysdeps/generic/s_fmax.c
#include <math.h>
double __fmax (double x, double y) { return (0); }
double fmax (double x, double y) { return (0); }
#ifdef NO_LONG_DOUBLE
double __fmaxl (double x, double y) { return (0); }
double fmaxl (double x, double y) { return (0); }
#endif
__EOF

		cat <<\__EOF > ../sysdeps/generic/s_fmin.c
#include <math.h>
double __fmin (double x, double y) { return (0); }
double fmin (double x, double y) { return (0); }
#ifdef NO_LONG_DOUBLE
double __fminl (double x, double y) { return (0); }
double fminl (double x, double y) { return (0); }
#endif
__EOF

		cat <<\__EOF > ../sysdeps/ieee754/dbl-64/e_exp2.c
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <stdlib.h>
#include <float.h>
#include <ieee754.h>
#include <math.h>
#include <fenv.h>
#include <inttypes.h>
#include <math_private.h>

#include "t_exp2.h"

static const volatile double TWO1023 = 8.988465674311579539e+307;
static const volatile double TWOM1000 = 9.3326361850321887899e-302;

double __ieee754_exp2 (double x) { return(0); }
__EOF

		cat <<\__EOF > ../sysdeps/ieee754/flt-32/e_expf.c
#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <float.h>
#include <ieee754.h>
#include <math.h>
#include <fenv.h>
#include <inttypes.h>
#include <math_private.h>

extern const float __exp_deltatable[178];
extern const double __exp_atable[355] /* __attribute__((mode(DF))) */;

static const volatile float TWOM100 = 7.88860905e-31;
static const volatile float TWO127 = 1.7014118346e+38;

float __ieee754_expf (float x) { return(0); }
__EOF

		cat <<\__EOF > ../sysdeps/generic/s_fmaxf.c
#include <math.h>
float __fmaxf (float x, float y) { return (0); }
float fmaxf (float x, float y) { return (0); }
__EOF

		cat <<\__EOF > ../sysdeps/generic/s_fminf.c
#include <math.h>
float __fminf (float x, float y) { return (0); }
float fminf (float x, float y) { return (0); }
__EOF

		cat <<\__EOF > ../sysdeps/ieee754/flt-32/e_exp2f.c
#ifndef _GNU_SOURCE
# define _GNU_SOURCE
#endif
#include <stdlib.h>
#include <float.h>
#include <ieee754.h>
#include <math.h>
#include <fenv.h>
#include <inttypes.h>
#include <math_private.h>

#include "t_exp2f.h"

static const volatile float TWOM100 = 7.88860905e-31;
static const volatile float TWO127 = 1.7014118346e+38;

float __ieee754_exp2f (float x) { return(0); }
__EOF

		make || exit 1
	) || exit 1

	make install || exit 1

	cat <<\__EOF > .nptl/sysdeps/pthread/pthread.h.1
#ifndef _PTHREAD_H_TYPEDEFS
#define _PTHREAD_H_TYPEDEFS 1
typedef unsigned long int pthread_t;
typedef unsigned long int pthread_attr_t;
typedef unsigned long int pthread_once_t;
typedef unsigned long int pthread_mutex_t;
typedef unsigned long int pthread_mutexattr_t;
typedef unsigned long int pthread_cond_t;
typedef unsigned long int pthread_condattr_t;
typedef unsigned long int pthread_key_t;
typedef unsigned long int pthread_rwlock_t;
typedef unsigned long int pthread_rwlockattr_t;
typedef unsigned long int pthread_spinlock_t;
typedef unsigned long int pthread_spinlockattr_t;
typedef unsigned long int pthread_barrier_t;
typedef unsigned long int pthread_barrierattr_t;
#endif
__EOF
	cat .nptl/sysdeps/pthread/pthread.h >> .nptl/sysdeps/pthread/pthread.h.1
	cat .nptl/sysdeps/pthread/pthread.h.1 > .nptl/sysdeps/pthread/pthread.h
	rm -f .nptl/sysdeps/pthread/pthread.h.1

	cp .nptl/sysdeps/pthread/*.h /usr/arm-unknown-linux-gnu/include/ || true
) || exit 1
rm -rf ${GLIBC_DIR}

# Step 5: Rebuild gcc
tar -jxf ${GCC_FILE} || exit 1
(
	cd ${GCC_DIR} || exit 1

	mkdir arm-unknown-linux-gnu
	cd arm-unknown-linux-gnu

	../configure --prefix=/usr --enable-c99 --enable-long-long --disable-nls --enable-shared --with-gnu-ld --with-gnu-as --target=arm-unknown-linux-gnu i486-slackware-linux || exit 1

	make || exit 1

	make install || exit 1
) || exit 1
rm -rf ${GCC_DIR}

# Step 6: Rebuild glibc
tar -jxf ${GLIBC_FILE} || exit 1
(
	cd ${GLIBC_DIR} || exit 1

	mkdir arm-unknown-linux-gnu
	cd arm-unknown-linux-gnu

	echo '#include <linux/input.h>' > ../sysdeps/unix/sysv/linux/arm/ioperm.c.1
	cat ../sysdeps/unix/sysv/linux/arm/ioperm.c >> ../sysdeps/unix/sysv/linux/arm/ioperm.c.1
	cat ../sysdeps/unix/sysv/linux/arm/ioperm.c.1 > ../sysdeps/unix/sysv/linux/arm/ioperm.c
	rm -f ../sysdeps/unix/sysv/linux/arm/ioperm.c.1

	echo '#include <sys/uio.h>' > ../sysdeps/unix/sysv/linux/libc_fatal.c.1
	cat ../sysdeps/unix/sysv/linux/libc_fatal.c >> ../sysdeps/unix/sysv/linux/libc_fatal.c.1
	cat ../sysdeps/unix/sysv/linux/libc_fatal.c.1 > ../sysdeps/unix/sysv/linux/libc_fatal.c
	rm -f ../sysdeps/unix/sysv/linux/libc_fatal.c.1

	../configure --prefix=/usr/arm-unknown-linux-gnu --with-gnu-ld --with-gnu-as --target=arm-unknown-linux-gnu --build=i486-slackware-linux --host=arm-unknown-linux-gnu --enable-add-ons || exit 1

	make || exit 1

	make instll || exit 1
) || exit 1
rm -rf ${GLIBC_DIR}
4593763 [rkeene@sledge /home/rkeene/projects/build]$

Click here to go back to the directory listing.
Click here to download this file.
last modified: 2012-05-07 00:52:05