Patchwork cross toolchain builder

login
register
about
Submitter Stefan Reinauer
Date 2009-09-26 16:05:44
Message ID <4ABE3BD8.1060407@coresystems.de>
Download mbox | patch
Permalink /patch/300/
State Accepted
Commit r4681
Headers show

Comments

Stefan Reinauer - 2009-09-26 16:05:44
Hi,

the attached patch adds crossgcc, our coreboot cross toolchain builder
to coreboot v2. It's a simple script to build xxx-elf toolchains that
are known-good for coreboot.

Best regards,
Stefan
ron minnich - 2009-09-26 16:30:00
Acked-by: Ronald G. Minnich <rminnich@gmail.com>

would it make sense to have a Kconfig option to "build with cross toolchain"?

ron
Peter Stuge - 2009-09-26 16:38:25
ron minnich wrote:
> would it make sense to have a Kconfig option to
> "build with cross toolchain"?

This is getting into buildrom territory. We had a discussion on IRC
and I think buildrom will converge with coreboot Kconfig at least
partly in the future.

I think having an option is a great idea, as long as it does not
imply build the toolchain first. Maybe just specify a directory to
where the desired toolchain has been installed?

It's more generic than cross-building, maybe just CONFIG_TOOLCHAIN
with a path to use to "Build with specific toolchain" ?


//Peter
ron minnich - 2009-09-26 16:40:20
On Sat, Sep 26, 2009 at 9:38 AM, Peter Stuge <peter@stuge.se> wrote:

> This is getting into buildrom territory. We had a discussion on IRC
> and I think buildrom will converge with coreboot Kconfig at least
> partly in the future.
>
> I think having an option is a great idea, as long as it does not
> imply build the toolchain first. Maybe just specify a directory to
> where the desired toolchain has been installed?

Yes, that makes sense. No, we don't want it turning into buildrom.


>
> It's more generic than cross-building, maybe just CONFIG_TOOLCHAIN
> with a path to use to "Build with specific toolchain" ?

yes.

ron
Stefan Reinauer - 2009-09-26 16:41:44
ron minnich wrote:
> Acked-by: Ronald G. Minnich <rminnich@gmail.com>
>
> would it make sense to have a Kconfig option to "build with cross toolchain"?
>
> ron
>
>   
Good question.... How do people feel about this? It takes quite a while
to build a tool chain, so we might want to check for it and ask people
to install it themselfes, at least..

At some point Patrick also had abuild and Kconfig automatically pick up
the chains built by the script, but I think that might require some
playing with the paths...
Stefan Reinauer - 2009-09-26 16:50:31
Peter Stuge wrote:
> ron minnich wrote:
>   
>> would it make sense to have a Kconfig option to
>> "build with cross toolchain"?
>>     
>
> This is getting into buildrom territory. We had a discussion on IRC
> and I think buildrom will converge with coreboot Kconfig at least
> partly in the future.
>   

We might want to look into seamless integration of several Kconfig based
projects..
I think "ptxdist" from Pengutronix does a pretty nice job there, did you
guys look at that?

> It's more generic than cross-building, maybe just CONFIG_TOOLCHAIN
> with a path to use to "Build with specific toolchain" ?
>   
Preferred

Stefan
Stefan Reinauer - 2009-09-26 16:51:42
ron minnich wrote:
> On Sat, Sep 26, 2009 at 9:38 AM, Peter Stuge <peter@stuge.se> wrote:
>
>   
>> This is getting into buildrom territory. We had a discussion on IRC
>> and I think buildrom will converge with coreboot Kconfig at least
>> partly in the future.
>>
>> I think having an option is a great idea, as long as it does not
>> imply build the toolchain first. Maybe just specify a directory to
>> where the desired toolchain has been installed?
>>     
>
> Yes, that makes sense. No, we don't want it turning into buildrom.
>   
Why not? I know buildrom is incredibly useful, but from a usability
standpoint, it's clearly one tool too many.

Stefan
Carl-Daniel Hailfinger - 2009-09-26 17:08:10
On 26.09.2009 18:41, Stefan Reinauer wrote:
> ron minnich wrote:
>   
>> Acked-by: Ronald G. Minnich <rminnich@gmail.com>
>>
>> would it make sense to have a Kconfig option to "build with cross toolchain"?
>>   
>>     
> Good question.... How do people feel about this? It takes quite a while
> to build a tool chain, so we might want to check for it and ask people
> to install it themselfes, at least..
>   

Maybe "Build with verified toolchain" and if that option is selected,
have make search for a (cross-)gcc which has "coreboot" somewhere in its
--version output and fail otherwise? That way we could make sure the
cross-toolchain is indeed sane (as opposed to a semi-broken cross
toolchain downloaded somewhere on the net).

> At some point Patrick also had abuild and Kconfig automatically pick up
> the chains built by the script, but I think that might require some
> playing with the paths...
>   

If that pickup could be made conditional on said Kconfig option, it
would be perfect.

I'm happy with anything that increases the likelihood of a working
build, so feel free to ignore what I said above.

Regards,
Carl-Daniel
ron minnich - 2009-09-26 17:32:12
On Sat, Sep 26, 2009 at 9:51 AM, Stefan Reinauer <stepan@coresystems.de> wrote:

> Why not? I know buildrom is incredibly useful, but from a usability
> standpoint, it's clearly one tool too many.

we've been dealing with buildrom here all summer, as well as
buildroot. They're wonderful when they work. Frequently,
we find ourselves driving into a corner and the only way out is rm -rf
and a clean checkout (this is also true for uclibc and busybox on
their own!). The task they are doing is extremely complex and hard to
do well. I'd rather not pull their unreliability into the coreboot
build sequence.

ron
Stefan Reinauer - 2009-09-26 17:38:23
ron minnich wrote:
> On Sat, Sep 26, 2009 at 9:51 AM, Stefan Reinauer <stepan@coresystems.de> wrote:
>
>   
>> Why not? I know buildrom is incredibly useful, but from a usability
>> standpoint, it's clearly one tool too many.
>>     
>
> we've been dealing with buildrom here all summer, as well as
> buildroot. They're wonderful when they work. Frequently,
> we find ourselves driving into a corner and the only way out is rm -rf
> and a clean checkout (this is also true for uclibc and busybox on
> their own!). The task they are doing is extremely complex and hard to
> do well. I'd rather not pull their unreliability into the coreboot
> build sequence.
>   
Things get really complicated when you put a linux kernel and userland
in flash... where you have to download dozens of files, with odd
dependencies.

But with simple payloads like seabios or filo, it doesn't seem to be
black magic.

I do like the idea of always building on a clean checkout. If this means
to really rm -rf the source tree, something sounds severely broken.
Buildroot certainly is, but it's running on a multitude of platforms
with a multitude of applications, so they clearly have a different scope
than we do

I find it quite non-trivial to get this right. Just defining coreboot to
be this payload free (thus, unusable as is) piece of rom code is also
not nice at all.

Stefan
Carl-Daniel Hailfinger - 2009-09-26 22:47:17
On 26.09.2009 19:38, Stefan Reinauer wrote:
> [...] Just defining coreboot to be this payload free 
> (thus, unusable as is) piece of rom code is also not nice at all.
>   

I'd like to differentiate here.
For working hardware init, the payload and anything after it are almost
completely irrelevant (except for some self-registering option ROMs).
For working boot, the payload and following stuff does matter.

IMHO coreboot is _not_ the full-service singing and dancing firmware
with builtin web browser. It is pure hardware init. Personally, I would
love to split coreboot building and payload integration into completely
separate steps (and thanks to CBFS, we can do that easily). A coreboot
build would always result in a ROM image without payload (after all, the
coreboot configuration and compilation should not depend on the
payload). In an additional step, the payload would be compiled and
integrated into the ROM image.

Example command:
make
make build_and_insert_payload

OK, maybe not exactly the commands above, but something similar in
style. This is my personal opinion only (because my coreboot recompiles
beat my payload recompiles by a factor of 50) and I can deal with either
approach.

Regards,
Carl-Daniel

Patch

Index: util/crossgcc/patches/binutils-2.18.50_no-i386-svr4-asm-comments.patch
===================================================================
--- util/crossgcc/patches/binutils-2.18.50_no-i386-svr4-asm-comments.patch	(revision 0)
+++ util/crossgcc/patches/binutils-2.18.50_no-i386-svr4-asm-comments.patch	(revision 0)
@@ -0,0 +1,10 @@ 
+--- binutils-2.18.50/gas/config/tc-i386.c~	2009-01-20 14:19:04.000000000 +0100
++++ binutils-2.18.50/gas/config/tc-i386.c	2009-01-20 14:20:47.000000000 +0100
+@@ -183,6 +183,7 @@
+ 	 && !defined (TE_GNU)				\
+ 	 && !defined (TE_LINUX)				\
+  	 && !defined (TE_NETWARE)			\
++	 && 0						\
+ 	 && !defined (TE_FreeBSD)			\
+ 	 && !defined (TE_NetBSD)))
+ /* This array holds the chars that always start a comment.  If the
Index: util/crossgcc/patches/gcc-4.3.2_use-gnu-style-comments-in-assembly.patch
===================================================================
--- util/crossgcc/patches/gcc-4.3.2_use-gnu-style-comments-in-assembly.patch	(revision 0)
+++ util/crossgcc/patches/gcc-4.3.2_use-gnu-style-comments-in-assembly.patch	(revision 0)
@@ -0,0 +1,11 @@ 
+--- gcc-4.3.2/gcc/config/i386/unix.h~	2009-01-20 16:05:45.000000000 +0100
++++ gcc-4.3.2/gcc/config/i386/unix.h	2009-01-20 16:05:47.000000000 +0100
+@@ -32,7 +32,7 @@
+ 
+ /* String containing the assembler's comment-starter.  */
+ 
+-#define ASM_COMMENT_START "/"
++#define ASM_COMMENT_START "#"
+ 
+ /* Output to assembler file text saying following lines
+    may contain character constants, extra white space, comments, etc.  */
Index: util/crossgcc/patches/gcc-4.3.3_use-gnu-style-comments-in-assembly.patch
===================================================================
--- util/crossgcc/patches/gcc-4.3.3_use-gnu-style-comments-in-assembly.patch	(revision 0)
+++ util/crossgcc/patches/gcc-4.3.3_use-gnu-style-comments-in-assembly.patch	(revision 0)
@@ -0,0 +1,11 @@ 
+--- gcc-4.3.3/gcc/config/i386/unix.h~	2009-01-20 16:05:45.000000000 +0100
++++ gcc-4.3.3/gcc/config/i386/unix.h	2009-01-20 16:05:47.000000000 +0100
+@@ -32,7 +32,7 @@
+ 
+ /* String containing the assembler's comment-starter.  */
+ 
+-#define ASM_COMMENT_START "/"
++#define ASM_COMMENT_START "#"
+ 
+ /* Output to assembler file text saying following lines
+    may contain character constants, extra white space, comments, etc.  */
Index: util/crossgcc/patches/gcc-4.4.1_less-junk-in-crtbegin.patch
===================================================================
--- util/crossgcc/patches/gcc-4.4.1_less-junk-in-crtbegin.patch	(revision 0)
+++ util/crossgcc/patches/gcc-4.4.1_less-junk-in-crtbegin.patch	(revision 0)
@@ -0,0 +1,50 @@ 
+--- t/gcc-4.4.1/gcc/crtstuff.c	Fr. Apr 10 01:23:07 2009
++++ gcc-4.4.1/gcc/crtstuff.c	Di. Jul 28 16:43:28 2009
+@@ -204,6 +204,7 @@
+   = { (func_ptr) (-1) };
+ #endif /* __DTOR_LIST__ alternatives */
+ 
++#if 0
+ #ifdef USE_EH_FRAME_REGISTRY
+ /* Stick a label at the beginning of the frame unwind info so we can register
+    and deregister it with the exception handling library code.  */
+@@ -219,6 +220,7 @@
+   __attribute__ ((unused, section(JCR_SECTION_NAME), aligned(sizeof(void*))))
+   = { };
+ #endif /* JCR_SECTION_NAME */
++#endif
+ 
+ #if defined(INIT_SECTION_ASM_OP) || defined(INIT_ARRAY_SECTION_ASM_OP)
+ 
+@@ -309,6 +311,7 @@
+   }
+ #endif /* !defined(FINI_ARRAY_SECTION_ASM_OP) */
+ 
++#if 0
+ #ifdef USE_EH_FRAME_REGISTRY
+ #ifdef CRT_GET_RFIB_DATA
+   /* If we used the new __register_frame_info_bases interface,
+@@ -320,6 +323,7 @@
+     __deregister_frame_info (__EH_FRAME_BEGIN__);
+ #endif
+ #endif
++#endif
+ 
+   completed = 1;
+ }
+@@ -333,6 +337,7 @@
+   = { __do_global_dtors_aux };
+ #endif /* !defined(FINI_SECTION_ASM_OP) */
+ 
++#if 0
+ #if defined(USE_EH_FRAME_REGISTRY) || defined(JCR_SECTION_NAME)
+ /* Stick a call to __register_frame_info into the .init section.  For some
+    reason calls with no arguments work more reliably in .init, so stick the
+@@ -364,6 +369,7 @@
+     }
+ #endif /* JCR_SECTION_NAME */
+ }
++#endif
+ 
+ #ifdef INIT_SECTION_ASM_OP
+ CRT_CALL_STATIC_FUNCTION (INIT_SECTION_ASM_OP, frame_dummy)
Index: util/crossgcc/patches/binutils-2.19.1_no-i386-svr4-asm-comments.patch
===================================================================
--- util/crossgcc/patches/binutils-2.19.1_no-i386-svr4-asm-comments.patch	(revision 0)
+++ util/crossgcc/patches/binutils-2.19.1_no-i386-svr4-asm-comments.patch	(revision 0)
@@ -0,0 +1,10 @@ 
+--- binutils-2.19.1/gas/config/tc-i386.c~	2009-01-20 14:19:04.000000000 +0100
++++ binutils-2.19.1/gas/config/tc-i386.c	2009-01-20 14:20:47.000000000 +0100
+@@ -318,6 +318,7 @@
+ 	 && !defined (TE_GNU)				\
+ 	 && !defined (TE_LINUX)				\
+  	 && !defined (TE_NETWARE)			\
++	 && 0						\
+ 	 && !defined (TE_FreeBSD)			\
+ 	 && !defined (TE_NetBSD)))
+ /* This array holds the chars that always start a comment.  If the
Index: util/crossgcc/buildgcc
===================================================================
--- util/crossgcc/buildgcc	(revision 0)
+++ util/crossgcc/buildgcc	(revision 0)
@@ -0,0 +1,340 @@ 
+#!/bin/bash
+#
+# Copyright (C) 2008-2009 by coresystems GmbH
+# written by Patrick Georgi <patrick.georgi@coresystems.de> and
+#            Stefan Reinauer <stefan.reinauer@coresystems.de>
+# 
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+#
+
+CROSSGCC_DATE="August 18th, 2009"
+CROSSGCC_VERSION="0.9"
+
+# default settings
+TARGETDIR=`pwd`/xgcc
+TARGETARCH=i386-elf
+DESTDIR=
+
+# version numbers
+GMP_VERSION=4.3.1
+MPFR_VERSION=2.4.1
+GCC_VERSION=4.4.1
+BINUTILS_VERSION=2.19.1
+GDB_VERSION=6.8
+
+# archive locations
+GMP_ARCHIVE="ftp://ftp.gmplib.org/pub/gmp-${GMP_VERSION}/gmp-${GMP_VERSION}.tar.bz2"
+MPFR_ARCHIVE="http://www.mpfr.org/mpfr-current/mpfr-${MPFR_VERSION}.tar.bz2"
+GCC_ARCHIVE="ftp://ftp.gwdg.de/pub/gnu/ftp/gnu/gcc/gcc-${GCC_VERSION}/gcc-core-${GCC_VERSION}.tar.bz2"
+BINUTILS_ARCHIVE="http://ftp.gnu.org/gnu/binutils/binutils-${BINUTILS_VERSION}.tar.bz2"
+GDB_ARCHIVE="http://ftp.gnu.org/gnu/gdb/gdb-${GDB_VERSION}.tar.bz2"
+
+GMP_DIR="gmp-${GMP_VERSION}"
+MPFR_DIR="mpfr-${MPFR_VERSION}"
+GCC_DIR="gcc-${GCC_VERSION}"
+BINUTILS_DIR="binutils-${BINUTILS_VERSION}"
+GDB_DIR="gdb-${GDB_VERSION}"
+
+SAVETEMPS=0
+
+red='\e[0;31m'
+RED='\e[1;31m'
+green='\e[0;32m'
+GREEN='\e[1;32m'
+blue='\e[0;34m'
+BLUE='\e[1;34m'
+cyan='\e[0;36m'
+CYAN='\e[1;36m'
+NC='\e[0m' # No Color
+
+searchgnu()
+{
+	# $1 short name
+	# result: GNU version of that tool on stdout
+	#         or no output if no GNU version was found
+	for i in "$1" "g$1" "gnu$1"; do
+		if test -x "`which $i 2>/dev/null`"; then
+			if test `$i --version 2>/dev/null |grep -c GNU` -gt 0; then
+				echo $i
+				return
+			fi
+		fi
+	done
+	printf "${RED}ERROR:${red} Missing toolchain: $1${NC}\n" >&2
+	exit 1
+}
+
+TAR=`searchgnu tar`
+PATCH=`searchgnu patch`
+MAKE=`searchgnu make`
+
+cleanup()
+{
+	printf "Cleaning up temporary files... "
+	rm -rf build-* combined gcc-* gmp-* mpfr-* binutils-* gdb-*
+	printf "${green}ok${NC}\n"
+}
+
+myhelp()
+{
+	printf "Usage: $0 [-V] [-c] [-p <platform>] [-d <target directory>] [-D <dest dir>]\n"
+	printf "       $0 [-V|--version]\n"
+	printf "       $0 [-h|--help]\n\n"
+
+	printf "Options:\n"
+	printf "    [-V|--version]                print version number and exit\n"
+	printf "    [-h|--help]                   print this help and exit\n"
+	printf "    [-c|--clean]                  remove temporary files before build\n"
+	printf "    [-t|--savetemps]              don't remove temporary files after build\n"
+	printf "    [-p|--platform <platform>]    target platform to build cross compiler for\n"
+	printf "                                  (defaults to $TARGETARCH)\n"
+	printf "    [-d|--directory <target dir>] target directory to install cross compiler to\n"
+	printf "                                  (defaults to $TARGETDIR)\n\n"
+	printf "    [-D|--destdir <dest dir>]     destination directory to install cross compiler to\n"
+	printf "                                  (for RPM builds, default unset)\n\n"
+}
+
+myversion()
+{
+	# version tag is always printed, so just print the license here
+
+	cat << EOF
+Copyright (C) 2008-2009 by coresystems GmbH
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; version 2 of the License.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+EOF
+}
+
+printf "${blue}Welcome to the ${red}coresystems${blue} cross toolchain builder v$CROSSGCC_VERSION ($CROSSGCC_DATE)${NC}\n\n"
+
+# parse parameters.. try to find out whether we're running GNU getopt
+getoptbrand="`getopt -V`"
+if [ "${getoptbrand:0:6}" == "getopt" ]; then
+	# Detected GNU getopt that supports long options.
+	args=`getopt -l version,help,clean,directory:,platform:,destdir:,savetemps Vhcd:p:D:t -- "$@"`
+	eval set "$args"
+else
+	# Detected non-GNU getopt
+	args=`getopt Vhcd:p:D:t $*`
+	set -- $args
+fi
+
+if [ $? != 0 ]; then
+	myhelp
+	exit 1
+fi
+
+while true ; do
+        case "$1" in
+		-V|--version)	shift; myversion; exit 0;;
+		-h|--help)	shift; myhelp; exit 0;;
+		-c|--clean)	shift; cleanup;;
+		-t|--savetemps)	shift; SAVETEMPS=1;;
+		-d|--directory)	shift; TARGETDIR="$1"; shift;;
+		-p|--platform)	shift; TARGETARCH="$1"; shift;;
+		-D|--destdir)	shift; DESTDIR="$1"; shift;;
+		--)		shift; break;;
+		-*)		printf "Invalid option\n\n"; myhelp; exit 1;;
+		*)		break;;
+	esac
+done
+
+printf "Downloading tar balls ... \n"
+mkdir -p tarballs
+for ARCHIVE in $GMP_ARCHIVE $MPFR_ARCHIVE $GCC_ARCHIVE $BINUTILS_ARCHIVE $GDB_ARCHIVE; do
+	FILE=`basename $ARCHIVE`
+	printf " * $FILE "
+	test -f tarballs/$FILE && printf "(cached)" || (
+		printf "(downloading)"
+		cd tarballs
+		wget -q $ARCHIVE
+	)
+	test -f tarballs/$FILE || printf "Failed to download $FILE.\n"
+	test -f tarballs/$FILE || exit 1
+	printf "\n"
+done
+printf "Downloaded tar balls ... "
+printf "${green}ok${NC}\n"
+
+printf "Unpacking and patching ... \n"
+for PACKAGE in GMP MPFR GCC BINUTILS GDB; do
+	archive=$PACKAGE"_ARCHIVE"
+	archive=${!archive}
+	dir=$PACKAGE"_DIR"
+	test -d ${!dir} || ( 
+		printf " * `basename $archive`\n"
+		FLAGS=zxf
+		test ${archive:${#archive}-2:2} = "gz" && FLAGS=zxf
+		test ${archive:${#archive}-3:3} = "bz2" && FLAGS=jxf
+		$TAR $FLAGS tarballs/`basename $archive`
+		for patch in patches/${!dir}"_*.patch"; do
+			test -r $patch || continue
+			printf "   o `basename $patch`\n"
+			patch -s -N -p0 < `echo $patch`
+		done
+	)
+done
+printf "Unpacked and patched ... "
+printf "${green}ok${NC}\n"
+
+mkdir -p build-gmp build-mpfr build-binutils build-gcc build-gdb
+if [ -f build-gmp/.success ]; then
+	printf "Skipping GMP as it is already built\n"
+else
+printf "Building GMP ${GMP_VERSION} ... "
+(
+	cd build-gmp
+	rm -f .failed
+	if [ `uname` = "Darwin" ]; then
+		# generally the OS X compiler can create x64 binaries.
+		# Per default it generated i386 binaries in 10.5 and x64
+		# binaries in 10.6 (even if the kernel is 32bit)
+		# For some weird reason, 10.5 autodetects an ABI=64 though
+		# so we're setting the ABI explicitly here.
+		OPTIONS="ABI=32"
+		touch .architecture_check.c
+		gcc .architecture_check.c -c -o .architecture_check.o
+		ARCH=`file .architecture_check.o |cut -f5 -d\ `
+		test  "$ARCH" = "x86_64" && OPTIONS="ABI=64"
+		rm .architecture_check.c .architecture_check.o
+	fi
+
+	../${GMP_DIR}/configure --disable-shared --prefix=$TARGETDIR $OPTIONS \
+		|| touch .failed
+	$MAKE || touch .failed
+	$MAKE install DESTDIR=$DESTDIR || touch .failed
+	if [ ! -f .failed ]; then touch .success; fi
+) &> build-gmp/crossgcc-build.log
+test -r build-gmp/.failed && printf "${RED}failed${NC}\n" || printf "${green}ok${NC}\n"
+test -r build-gmp/.failed && exit 1
+fi
+
+#if [ "$DESTDIR" != "" -a ! -x $TARGETDIR ]; then
+#	# create compat link
+#	ln -s $DESTDIR$TARGETDIR $TARGETDIR
+#fi
+
+# Now set CFLAGS to match GMP CFLAGS.
+HOSTCFLAGS=`grep __GMP_CFLAGS $DESTDIR$TARGETDIR/include/gmp.h |cut -d\" -f2`
+
+if [ -f build-mpfr/.success ]; then
+	printf "Skipping MPFR as it is already built\n"
+else
+printf "Building MPFR ${MPFR_VERSION} ... "
+(
+	test `uname` = "Darwin" && CFLAGS="$CFLAGS -force_cpusubtype_ALL"
+	cd build-mpfr
+	rm -f .failed
+	../${MPFR_DIR}/configure --disable-shared --prefix=$TARGETDIR \
+		--infodir=$TARGETDIR/info \
+		--with-gmp=$DESTDIR$TARGETDIR CFLAGS="$HOSTCFLAGS" || touch .failed
+	$MAKE || touch .failed
+	$MAKE install DESTDIR=$DESTDIR || touch .failed
+
+	# work around build problem of libgmp.la
+	if [ "$DESTDIR" != "" ]; then
+	    perl -pi -e "s,$DESTDIR,," $DESTDIR$TARGETDIR/libgmp.la
+	fi
+
+	if [ ! -f .failed ]; then touch .success; fi
+) &> build-mpfr/crossgcc-build.log
+test -r build-mpfr/.failed && printf "${RED}failed${NC}\n" || printf "${green}ok${NC}\n"
+test -r build-mpfr/.failed && exit 1
+fi
+
+if [ -f build-binutils/.success ]; then
+	printf "Skipping binutils as it is already built\n"
+else
+printf "Building binutils ${BINUTILS_VERSION} ... "
+(
+	cd build-binutils
+	rm -f .failed
+	../binutils-${BINUTILS_VERSION}/configure --prefix=$TARGETDIR --target=${TARGETARCH} \
+		--disable-werror --disable-nls \
+		CFLAGS="$HOSTCFLAGS" || touch .failed
+	$MAKE || touch .failed
+	$MAKE install DESTDIR=$DESTDIR || touch .failed
+	if [ ! -f .failed ]; then touch .success; fi
+) &> build-binutils/crossgcc-build.log
+test -r build-binutils/.failed && printf "${RED}failed${NC}\n" || printf "${green}ok${NC}\n"
+test -r build-binutils/.failed && exit 1
+fi
+
+if [ -f build-gcc/.success ]; then
+	printf "Skipping GCC as it is already built\n"
+else
+printf "Building GCC ${GCC_VERSION} ... "
+(
+	cd build-gcc
+	rm -f .failed
+	# GCC does not honour HOSTCFLAGS at all. CFLAGS are used for
+	# both target and host object files. This is pretty misdesigned.
+	# There's a work-around called CFLAGS_FOR_BUILD and CFLAGS_FOR_TARGET
+	# but it does not seem to work properly. At least the host library
+	# libiberty is not compiled with CFLAGS_FOR_BUILD.
+	CFLAGS_FOR_BUILD="$HOSTCFLAGS" ../gcc-${GCC_VERSION}/configure \
+		--prefix=$TARGETDIR --libexecdir=$TARGETDIR/lib \
+		--target=${TARGETARCH} --disable-werror \
+		--disable-libssp --disable-bootstrap --disable-nls \
+		--with-gmp=$DESTDIR$TARGETDIR --with-mpfr=$DESTDIR$TARGETDIR \
+		|| touch .failed
+	$MAKE CFLAGS_FOR_BUILD="$HOSTCFLAGS" || touch .failed
+	$MAKE install DESTDIR=$DESTDIR || touch .failed
+	if [ ! -f .failed ]; then touch .success; fi
+) &> build-gcc/crossgcc-build.log
+test -r build-gcc/.failed && printf "${RED}failed${NC}\n" || printf "${green}ok${NC}\n"
+test -r build-gcc/.failed && exit 1
+fi
+
+if [ -f build-gdb/.success ]; then
+	printf "Skipping GDB as it is already built\n"
+else
+printf "Building GDB ${GDB_VERSION} ... "
+(
+	cd build-gdb
+	export PATH=$PATH:$PREFIX/bin
+	rm -f .failed
+	../gdb-${GDB_VERSION}/configure --prefix=$TARGETDIR --target=${TARGETARCH} \
+		--disable-werror --disable-nls
+	$MAKE || touch .failed
+	$MAKE install DESTDIR=$DESTDIR || touch .failed
+	if [ ! -f .failed ]; then touch .success; fi
+) &> build-gdb/crossgcc-build.log
+test -r build-gdb/.failed && printf "${RED}failed${NC}\n" || printf "${green}ok${NC}\n"
+test -r build-gdb/.failed && exit 1
+fi
+
+if [ $SAVETEMPS -eq 0 ]; then
+	printf "Cleaning up... "
+	rm -rf ${GMP_DIR} build-gmp
+	rm -rf ${MPFR_DIR} build-mpfr
+	rm -rf ${BINUTILS_DIR} build-binutils
+	rm -rf ${GCC_DIR} build-gcc
+	rm -rf ${GDB_DIR} build-gdb
+	printf "${green}ok${NC}\n"
+else
+	printf "Leaving temporary files around... ${green}ok${NC}\n"
+fi
+
+printf "\n${green}You can now run your $TARGETARCH cross toolchain from $TARGETDIR.${NC}\n"
+
+

Property changes on: util/crossgcc/buildgcc
___________________________________________________________________
Added: svn:executable
   + *

Index: util/crossgcc/README
===================================================================
--- util/crossgcc/README	(revision 0)
+++ util/crossgcc/README	(revision 0)
@@ -0,0 +1,17 @@ 
+README
+------
+
+This is a cross toolchain builder for -elf toolchains (ie. no libc support)
+
+known working:
+  i386-elf
+  x86_64-elf
+  powerpc-elf
+  mipsel-elf
+
+known broken:
+  alpha-elf
+  arm-elf
+  powerpc64-elf
+
+