[Clfs-support] Need help building the cross toolchain

Jon Dufresne jon.dufresne at gmail.com
Fri Nov 7 11:16:01 PST 2008


> If I'm successful tomorrow I'll post a new (hopefully) working script.

I was able to successfully build the toolchain. For anyone that is
following this, has similar problems, or needs inspiration for their
system, please feel free to learn from my script below. Thanks for all
the help.

#!/bin/bash

unset CFLAGS
unset CXXFLAGS

LINUX_ARCH=i386
HOST=i686-cross-linux-gnu
TARGET=i686-pc-linux-gnu

PRJROOT=`pwd`
PACKAGES=${PRJROOT}/packages
BUILD=${PRJROOT}/build
TOOLS=${PRJROOT}/tools
ROOTFS=${PRJROOT}/rootfs

LINUX_VERSION=2.6.27.4
BINUTILS_VERSION=2.19
GCC_VERSION=4.3.2
GLIBC_VERSION=2.8

PATH=${TOOLS}/bin:${PATH}
export PATH

download_packages()
{
	if [ ! -f ${PACKAGES}/linux-${LINUX_VERSION}.tar.bz2 ]; then
		wget --directory-prefix=${PACKAGES} \
			http://kernel.org/pub/linux/kernel/v2.6/linux-${LINUX_VERSION}.tar.bz2
	fi

	if [ ! -f ${PACKAGES}/binutils-${BINUTILS_VERSION}.tar.bz2 ]; then
		wget --directory-prefix=${PACKAGES} \
			http://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VERSION}.tar.bz2
	fi

	if [ ! -f ${PACKAGES}/gcc-${GCC_VERSION}.tar.bz2 ]; then
		wget --directory-prefix=${PACKAGES} \
			http://gcc-ca.internet.bs/releases/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.bz2
	fi

	if [ ! -f ${PACKAGES}/glibc-${GLIBC_VERSION}.tar.bz2 ]; then
		wget --directory-prefix=${PACKAGES} \
			http://ftp.gnu.org/gnu/glibc/glibc-${GLIBC_VERSION}.tar.bz2
	fi
}

build_linux_headers()
{
	echo "Building linux-${LINUX_VERSION} headers"

	tar -xjf ${PACKAGES}/linux-${LINUX_VERSION}.tar.bz2 -C ${BUILD}

	cd ${BUILD}/linux-${LINUX_VERSION}
	make ARCH=${LINUX_ARCH} headers_check || exit
	make ARCH=${LINUX_ARCH} INSTALL_HDR_PATH=${ROOTFS}/usr headers_install || exit
	cd ${PRJROOT}
}

build_binutils()
{
	echo "Building binutils-${BINUTILS_VERSION} HOST=${HOST} TARGET=${TARGET}"

	tar -xjf ${PACKAGES}/binutils-${BINUTILS_VERSION}.tar.bz2 -C ${BUILD}

	mkdir -p ${BUILD}/binutils-build
	cd ${BUILD}/binutils-build

	${BUILD}/binutils-${BINUTILS_VERSION}/configure \
		--prefix=${TOOLS} \
		--build=${HOST} \
		--host=${HOST} \
		--target=${TARGET} \
		--with-sysroot=${ROOTFS} \
		--disable-multilib \
		--disable-nls \
		--enable-shared \
		|| exit

	make configure-host || exit
	make || exit
	make install || exit

	cd ${PRJROOT}
}

build_glibc_headers()
{
	echo "Building glibc-${GLIBC_VERSION} headers"

	tar xjf ${PACKAGES}/glibc-${GLIBC_VERSION}.tar.bz2 -C ${BUILD}

	mkdir -p ${BUILD}/glibc-headers-build
	cd ${BUILD}/glibc-headers-build

	echo "libc_cv_forced_unwind=yes" > config.cache
	echo "libc_cv_c_cleanup=yes" >> config.cache

	CC=gcc \
	${BUILD}/glibc-${GLIBC_VERSION}/configure \
		--prefix=/usr \
		--build=${HOST} \
		--host=${TARGET} \
		--with-headers=${ROOTFS}/usr/include \
		|| exit

	make install_root=${ROOTFS} install-headers || exit

	#TODO: change cp to install
	cp bits/stdio_lim.h ${ROOTFS}/usr/include/bits
	touch ${ROOTFS}/usr/include/gnu/stubs.h
	cp ../glibc-2.6.1/nptl/sysdeps/unix/sysv/linux/i386/bits/pthreadtypes.h \
		${ROOTFS}/usr/include/bits

	cd ${PRJROOT}
}

build_gcc_static()
{
	echo "Building gcc-${GCC_VERSION} static"

	tar xjf ${PACKAGES}/gcc-${GCC_VERSION}.tar.bz2 -C ${BUILD}

	mkdir -p ${BUILD}/gcc-static-build
	cd ${BUILD}/gcc-static-build

	${BUILD}/gcc-${GCC_VERSION}/configure \
		--prefix=${TOOLS} \
		--build=${HOST} \
		--host=${HOST} \
		--target=${TARGET} \
		--with-sysroot=${ROOTFS} \
		--disable-multilib \
		--disable-nls \
		--disable-shared \
		--enable-languages=c \
		|| exit

	make all-gcc|| exit
	make install-gcc || exit
	make all-target-libgcc || exit
	make install-target-libgcc || exit

	ln -s libgcc.a ${TOOLS}/lib/gcc/${TARGET}/${GCC_VERSION}/libgcc_eh.a

	cd ${PRJROOT}
}

build_glibc()
{
	echo "Building glibc-${GLIBC_VERSION}"

	mkdir -p ${BUILD}/glibc-build
	cd ${BUILD}/glibc-build

	echo "libc_cv_forced_unwind=yes" > config.cache
	echo "libc_cv_c_cleanup=yes" >> config.cache

	BUILD_CC=gcc \
	CC=${TARGET}-gcc \
	AR=${TARGET}-ar \
	RANLIB=${TARGET}-ranlib \
	CFLAGS="-march=$(cut -d- -f1 <<< ${TARGET}) -mtune=generic -g -O2" \
	${BUILD}/glibc-${GLIBC_VERSION}/configure \
		--prefix=/usr \
		--build=${HOST} \
		--host=${TARGET} \
		--disable-profile \
		--enable-add-ons \
		--with-tls \
		--enable-kernel=2.6.0 \
		--with-__thread \
		--with-binutils=${TOOLS}/bin \
		--with-headers=${ROOTFS}/usr/include \
		--cache-file=config.cache \
		|| exit

	make || exit
	make install_root=${ROOTFS} install || exit

	cd ${PRJROOT}
}

build_gcc()
{
	echo "Building gcc-${GCC_VERSION}"

	mkdir -p ${BUILD}/gcc-build
	cd ${BUILD}/gcc-build

	${BUILD}/gcc-${GCC_VERSION}/configure \
		--prefix=${TOOLS} \
		--build=${HOST} \
		--host=${HOST} \
		--target=${TARGET} \
		--with-sysroot=${ROOTFS} \
		--disable-multilib \
		--disable-nls \
		--enable-shared \
		--enable-languages=c,c++ \
		|| exit

	make || exit
	make install || exit

	cd ${PRJROOT}
}

rm -rf ${BUILD} ${TOOLS} ${ROOTFS}
if [ ! -d ${PACKAGES} ]; then
	mkdir -p ${PACKAGES}
fi
mkdir -p ${BUILD}
download_packages
build_linux_headers
build_binutils
build_glibc_headers
build_gcc_static
build_glibc
build_gcc



More information about the Clfs-support mailing list