2006-05-15 13:26:59 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
2008-10-29 16:02:06 +00:00
|
|
|
# Abort execution as soon as an error is encountered
|
|
|
|
# That way the script do not let the user think the process completed correctly
|
|
|
|
# and leave the opportunity to fix the problem and restart compilation where
|
|
|
|
# it stopped
|
|
|
|
set -e
|
|
|
|
|
2006-05-15 13:26:59 +00:00
|
|
|
# this is where this script will store downloaded files and check for already
|
|
|
|
# downloaded files
|
2009-01-08 20:00:10 +00:00
|
|
|
dlwhere="${RBDEV_DOWNLOAD:-/tmp/rbdev-dl}"
|
2006-05-15 13:26:59 +00:00
|
|
|
|
|
|
|
# will append the target string to the prefix dir mentioned here
|
|
|
|
# Note that the user running this script must be able to do make install in
|
|
|
|
# this given prefix directory. Also make sure that this given root dir
|
|
|
|
# exists.
|
2009-01-08 20:00:10 +00:00
|
|
|
prefix="${RBDEV_PREFIX:-/usr/local}"
|
2006-05-15 13:26:59 +00:00
|
|
|
|
2006-05-30 08:38:02 +00:00
|
|
|
# This directory is used to extract all files and to build everything in. It
|
|
|
|
# must not exist before this script is invoked (as a security measure).
|
2009-01-08 20:00:10 +00:00
|
|
|
builddir="${RBDEV_BUILD:-/tmp/rbdev-build}"
|
2006-05-15 13:26:59 +00:00
|
|
|
|
2006-11-22 09:07:45 +00:00
|
|
|
# This script needs to use GNU Make. On Linux systems, GNU Make is invoked
|
|
|
|
# by running the "make" command, on most BSD systems, GNU Make is invoked
|
|
|
|
# by running the "gmake" command. Set the "make" variable accordingly.
|
2008-12-01 13:24:33 +00:00
|
|
|
if [ -f "`which gmake 2>/dev/null`" ]; then
|
2009-05-10 18:11:09 +00:00
|
|
|
make="gmake"
|
2006-11-22 09:07:45 +00:00
|
|
|
else
|
2010-06-02 00:51:18 +00:00
|
|
|
make="make"
|
2006-11-22 09:07:45 +00:00
|
|
|
fi
|
|
|
|
|
2008-07-30 15:46:13 +00:00
|
|
|
if [ -z $GNU_MIRROR ] ; then
|
2011-01-10 19:13:33 +00:00
|
|
|
GNU_MIRROR=http://mirrors.kernel.org/gnu
|
2008-07-30 15:46:13 +00:00
|
|
|
fi
|
|
|
|
|
2007-05-24 19:58:17 +00:00
|
|
|
# These are the tools this script requires and depends upon.
|
2011-01-06 14:56:36 +00:00
|
|
|
reqtools="gcc bzip2 gzip make patch makeinfo"
|
2007-05-24 19:58:17 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
##############################################################################
|
|
|
|
# Functions:
|
2006-11-22 09:07:45 +00:00
|
|
|
|
2006-05-15 13:26:59 +00:00
|
|
|
findtool(){
|
|
|
|
file="$1"
|
|
|
|
|
|
|
|
IFS=":"
|
|
|
|
for path in $PATH
|
|
|
|
do
|
2008-08-01 11:19:29 +00:00
|
|
|
# echo "Checks for $file in $path" >&2
|
2006-05-15 13:26:59 +00:00
|
|
|
if test -f "$path/$file"; then
|
|
|
|
echo "$path/$file"
|
|
|
|
return
|
|
|
|
fi
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
input() {
|
|
|
|
read response
|
|
|
|
echo $response
|
|
|
|
}
|
|
|
|
|
|
|
|
#$1 file
|
|
|
|
#$2 URL"root
|
|
|
|
getfile() {
|
|
|
|
tool=`findtool curl`
|
|
|
|
if test -z "$tool"; then
|
|
|
|
tool=`findtool wget`
|
|
|
|
if test -n "$tool"; then
|
|
|
|
# wget download
|
2008-08-01 11:19:29 +00:00
|
|
|
echo "ROCKBOXDEV: Downloading $2/$1 using wget"
|
2006-05-15 13:26:59 +00:00
|
|
|
$tool -O $dlwhere/$1 $2/$1
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
# curl download
|
2008-08-01 11:19:29 +00:00
|
|
|
echo "ROCKBOXDEV: Downloading $2/$1 using curl"
|
2006-05-15 13:26:59 +00:00
|
|
|
$tool -Lo $dlwhere/$1 $2/$1
|
|
|
|
fi
|
2008-08-01 11:19:29 +00:00
|
|
|
|
2008-08-10 14:36:18 +00:00
|
|
|
if [ $? -ne 0 ] ; then
|
|
|
|
echo "ROCKBOXDEV: couldn't download the file!"
|
|
|
|
echo "ROCKBOXDEV: check your internet connection"
|
|
|
|
exit
|
|
|
|
fi
|
|
|
|
|
2006-05-15 13:26:59 +00:00
|
|
|
if test -z "$tool"; then
|
2008-08-01 11:19:29 +00:00
|
|
|
echo "ROCKBOXDEV: No downloader tool found!"
|
|
|
|
echo "ROCKBOXDEV: Please install curl or wget and re-run the script"
|
2006-05-15 13:26:59 +00:00
|
|
|
exit
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2007-05-24 19:58:17 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
build() {
|
|
|
|
toolname="$1"
|
|
|
|
target="$2"
|
|
|
|
version="$3"
|
|
|
|
patch="$4"
|
|
|
|
configure_params="$5"
|
2011-01-06 14:56:36 +00:00
|
|
|
needs_libs="$6"
|
2006-05-29 22:23:00 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
patch_url="http://www.rockbox.org/gcc"
|
2006-05-29 22:23:00 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
case $toolname in
|
|
|
|
gcc)
|
|
|
|
file="gcc-core-$version.tar.bz2"
|
2011-01-10 19:13:33 +00:00
|
|
|
url="$GNU_MIRROR/gcc/gcc-$version"
|
2010-06-05 23:05:07 +00:00
|
|
|
;;
|
2006-05-29 22:23:00 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
binutils)
|
|
|
|
file="binutils-$version.tar.bz2"
|
2011-01-10 19:13:33 +00:00
|
|
|
url="$GNU_MIRROR/binutils"
|
2010-06-05 23:05:07 +00:00
|
|
|
;;
|
2006-05-29 22:23:00 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
*)
|
|
|
|
echo "ROCKBOXDEV: Bad toolname $toolname"
|
|
|
|
exit
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
# create build directory
|
|
|
|
if test -d $builddir; then
|
|
|
|
if test ! -w $builddir; then
|
|
|
|
echo "ROCKBOXDEV: No write permission for $builddir"
|
|
|
|
exit
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
mkdir -p $builddir
|
|
|
|
fi
|
2006-05-29 22:23:00 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
# download source tarball
|
|
|
|
if test ! -f "$dlwhere/$file"; then
|
|
|
|
getfile "$file" "$url"
|
|
|
|
fi
|
2006-05-15 13:26:59 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
# download patch
|
|
|
|
if test -n "$patch"; then
|
|
|
|
if test ! -f "$dlwhere/$patch"; then
|
|
|
|
getfile "$patch" "$patch_url"
|
|
|
|
fi
|
|
|
|
fi
|
2006-05-15 13:26:59 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
cd $builddir
|
2006-05-30 08:38:02 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
echo "ROCKBOXDEV: extracting $file"
|
|
|
|
tar xjf $dlwhere/$file
|
2006-05-15 13:26:59 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
# do we have a patch?
|
|
|
|
if test -n "$patch"; then
|
|
|
|
echo "ROCKBOXDEV: applying patch $patch"
|
2006-05-15 13:26:59 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
# apply the patch
|
|
|
|
(cd $builddir/$toolname-$version && patch -p1 < "$dlwhere/$patch")
|
2009-03-12 16:48:58 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
# check if the patch applied cleanly
|
|
|
|
if [ $? -gt 0 ]; then
|
|
|
|
echo "ROCKBOXDEV: failed to apply patch $patch"
|
|
|
|
exit
|
|
|
|
fi
|
|
|
|
fi
|
2006-05-15 13:26:59 +00:00
|
|
|
|
2011-01-06 14:56:36 +00:00
|
|
|
# kludge to avoid having to install GMP, MPFR and MPC, for new gcc
|
|
|
|
if test -n "$needs_libs"; then
|
2010-06-06 00:27:52 +00:00
|
|
|
cd "gcc-$version"
|
2011-01-06 14:56:36 +00:00
|
|
|
if (echo $needs_libs | grep -q gmp && test ! -d gmp); then
|
2010-06-05 23:05:07 +00:00
|
|
|
echo "ROCKBOXDEV: Getting GMP"
|
2011-01-06 14:56:36 +00:00
|
|
|
if test ! -f $dlwhere/gmp-4.3.2.tar.bz2; then
|
2011-01-10 19:13:33 +00:00
|
|
|
getfile "gmp-4.3.2.tar.bz2" "$GNU_MIRROR/gmp"
|
2010-06-06 00:27:52 +00:00
|
|
|
fi
|
2011-01-06 14:56:36 +00:00
|
|
|
tar xjf $dlwhere/gmp-4.3.2.tar.bz2
|
|
|
|
ln -s gmp-4.3.2 gmp
|
2010-06-05 23:05:07 +00:00
|
|
|
fi
|
|
|
|
|
2011-01-06 14:56:36 +00:00
|
|
|
if (echo $needs_libs | grep -q mpfr && test ! -d mpfr); then
|
2010-06-05 23:05:07 +00:00
|
|
|
echo "ROCKBOXDEV: Getting MPFR"
|
2010-06-06 00:27:52 +00:00
|
|
|
if test ! -f $dlwhere/mpfr-2.4.2.tar.bz2; then
|
2011-01-10 19:13:33 +00:00
|
|
|
getfile "mpfr-2.4.2.tar.bz2" "$GNU_MIRROR/mpfr"
|
2010-06-06 00:27:52 +00:00
|
|
|
fi
|
2010-06-05 23:05:07 +00:00
|
|
|
tar xjf $dlwhere/mpfr-2.4.2.tar.bz2
|
|
|
|
ln -s mpfr-2.4.2 mpfr
|
|
|
|
fi
|
2011-01-06 14:56:36 +00:00
|
|
|
|
|
|
|
if (echo $needs_libs | grep -q mpc && test ! -d mpc); then
|
|
|
|
echo "ROCKBOXDEV: Getting MPC"
|
|
|
|
if test ! -f $dlwhere/mpc-0.8.1.tar.gz; then
|
2011-01-10 19:13:33 +00:00
|
|
|
getfile "mpc-0.8.1.tar.gz" "http://www.multiprecision.org/mpc/download"
|
2011-01-06 14:56:36 +00:00
|
|
|
fi
|
|
|
|
tar xzf $dlwhere/mpc-0.8.1.tar.gz
|
|
|
|
ln -s mpc-0.8.1 mpc
|
|
|
|
fi
|
2010-06-06 00:27:52 +00:00
|
|
|
cd $builddir
|
2010-06-05 23:05:07 +00:00
|
|
|
fi
|
2006-05-15 13:26:59 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
echo "ROCKBOXDEV: mkdir build-$toolname"
|
|
|
|
mkdir build-$toolname
|
2006-05-15 13:26:59 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
echo "ROCKBOXDEV: cd build-$toolname"
|
|
|
|
cd build-$toolname
|
2009-02-24 20:53:04 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
echo "ROCKBOXDEV: $toolname/configure"
|
2010-06-11 03:54:54 +00:00
|
|
|
CFLAGS=-U_FORTIFY_SOURCE ../$toolname-$version/configure --target=$target --prefix=$prefix --enable-languages=c --disable-libssp --disable-docs $configure_params
|
2009-04-10 15:35:24 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
echo "ROCKBOXDEV: $toolname/make"
|
2010-06-12 21:08:45 +00:00
|
|
|
$make
|
2009-03-12 16:35:03 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
echo "ROCKBOXDEV: $toolname/make install"
|
|
|
|
$make install
|
2009-03-12 16:35:03 +00:00
|
|
|
|
2010-10-19 21:31:35 +00:00
|
|
|
echo "ROCKBOXDEV: rm -rf build-$toolname $toolname-$version"
|
|
|
|
cd ..
|
|
|
|
rm -rf build-$toolname $toolname-$version
|
2010-06-05 23:05:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
##############################################################################
|
|
|
|
# Code:
|
|
|
|
|
|
|
|
# Verify required tools
|
|
|
|
for t in $reqtools; do
|
|
|
|
tool=`findtool $t`
|
|
|
|
if test -z "$tool"; then
|
|
|
|
echo "ROCKBOXDEV: \"$t\" is required for this script to work."
|
|
|
|
echo "ROCKBOXDEV: Please install \"$t\" and re-run the script."
|
|
|
|
exit
|
2010-03-08 14:49:10 +00:00
|
|
|
fi
|
2010-06-05 23:05:07 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
echo "Download directory : $dlwhere (set RBDEV_DOWNLOAD to change)"
|
|
|
|
echo "Install prefix : $prefix (set RBDEV_PREFIX to change)"
|
|
|
|
echo "Build dir : $builddir (set RBDEV_BUILD to change)"
|
2010-06-12 21:08:45 +00:00
|
|
|
echo "Make options : $MAKEFLAGS (set MAKEFLAGS to change)"
|
2010-06-05 23:05:07 +00:00
|
|
|
echo ""
|
|
|
|
|
|
|
|
# Verify download directory
|
|
|
|
if test -d "$dlwhere"; then
|
|
|
|
if ! test -w "$dlwhere"; then
|
|
|
|
echo "ROCKBOXDEV: No write permission for $dlwhere"
|
|
|
|
exit
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
mkdir $dlwhere
|
|
|
|
if test $? -ne 0; then
|
|
|
|
echo "ROCKBOXDEV: Failed creating directory $dlwhere"
|
|
|
|
exit
|
|
|
|
fi
|
2006-05-25 23:44:51 +00:00
|
|
|
fi
|
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
# Verify the prefix dir
|
|
|
|
if test ! -d $prefix; then
|
|
|
|
mkdir -p $prefix
|
|
|
|
if test $? -ne 0; then
|
|
|
|
echo "ROCKBOXDEV: Failed creating directory $prefix"
|
|
|
|
exit
|
|
|
|
fi
|
|
|
|
fi
|
|
|
|
if test ! -w $prefix; then
|
|
|
|
echo "ROCKBOXDEV: No write permission for $prefix"
|
|
|
|
exit
|
|
|
|
fi
|
2006-05-30 08:38:02 +00:00
|
|
|
|
|
|
|
echo "Select target arch:"
|
2006-08-10 06:46:56 +00:00
|
|
|
echo "s - sh (Archos models)"
|
2010-06-06 10:03:00 +00:00
|
|
|
echo "m - m68k (iriver h1x0/h3x0, iaudio m3/m5/x5 and mpio hd200)"
|
2010-07-10 15:52:53 +00:00
|
|
|
echo "e - arm-eabi (ipods, iriver H10, Sansa, D2, Gigabeat, etc)"
|
2010-07-10 20:17:26 +00:00
|
|
|
echo "a - arm (older ARM toolchain, deprecated) "
|
2008-08-02 11:20:20 +00:00
|
|
|
echo "i - mips (Jz4740 and ATJ-based players)"
|
2008-09-07 22:01:29 +00:00
|
|
|
echo "separate multiple targets with spaces"
|
2011-01-06 14:56:36 +00:00
|
|
|
echo "(Example: \"s m a\" will build sh, m68k and arm)"
|
2008-08-01 11:19:29 +00:00
|
|
|
echo ""
|
2006-05-30 08:38:02 +00:00
|
|
|
|
2008-09-07 22:01:29 +00:00
|
|
|
selarch=`input`
|
2010-06-05 23:05:07 +00:00
|
|
|
system=`uname -s`
|
|
|
|
|
|
|
|
# add target dir to path to ensure the new binutils are used in gcc build
|
|
|
|
PATH="$prefix/bin:${PATH}"
|
2006-05-30 08:38:02 +00:00
|
|
|
|
2008-09-07 22:01:29 +00:00
|
|
|
for arch in $selarch
|
|
|
|
do
|
2010-06-05 23:05:07 +00:00
|
|
|
echo ""
|
|
|
|
case $arch in
|
|
|
|
[Ss])
|
2011-05-27 15:13:29 +00:00
|
|
|
build "binutils" "sh-elf" "2.16.1" "" "--disable-werror"
|
2010-06-05 23:05:07 +00:00
|
|
|
build "gcc" "sh-elf" "4.0.3" "gcc-4.0.3-rockbox-1.diff"
|
|
|
|
;;
|
|
|
|
|
|
|
|
[Ii])
|
2010-06-05 23:20:09 +00:00
|
|
|
build "binutils" "mipsel-elf" "2.17" "" "--disable-werror"
|
2010-06-05 23:05:07 +00:00
|
|
|
patch=""
|
|
|
|
if [ "$system" = "Interix" ]; then
|
|
|
|
patch="gcc-4.1.2-interix.diff"
|
|
|
|
fi
|
2010-06-05 23:20:09 +00:00
|
|
|
build "gcc" "mipsel-elf" "4.1.2" "$patch"
|
2010-06-05 23:05:07 +00:00
|
|
|
;;
|
|
|
|
|
|
|
|
[Mm])
|
2011-05-27 15:13:29 +00:00
|
|
|
build "binutils" "m68k-elf" "2.20.1" "" "--disable-werror"
|
2011-01-12 21:39:02 +00:00
|
|
|
build "gcc" "m68k-elf" "4.5.2" "" "--with-arch=cf" "gmp mpfr mpc"
|
2010-06-05 23:05:07 +00:00
|
|
|
;;
|
|
|
|
|
|
|
|
[Aa])
|
2011-05-27 15:13:29 +00:00
|
|
|
build "binutils" "arm-elf" "2.16.1" "" "--disable-werror"
|
2010-06-05 23:05:07 +00:00
|
|
|
build "gcc" "arm-elf" "4.0.3" "rockbox-multilibs-arm-elf-gcc-4.0.3_3.diff"
|
|
|
|
;;
|
|
|
|
|
|
|
|
[Ee])
|
2010-09-27 20:42:30 +00:00
|
|
|
binopts=""
|
|
|
|
gccopts=""
|
|
|
|
case $system in
|
|
|
|
Darwin)
|
2011-05-27 15:13:29 +00:00
|
|
|
binopts="--disable-nls"
|
2010-09-27 20:42:30 +00:00
|
|
|
gccopts="--disable-nls"
|
|
|
|
;;
|
|
|
|
esac
|
2011-05-27 15:13:29 +00:00
|
|
|
build "binutils" "arm-elf-eabi" "2.20.1" "binutils-2.20.1-ld-thumb-interwork-long-call.diff" "$binopts --disable-werror"
|
2011-01-06 14:56:36 +00:00
|
|
|
build "gcc" "arm-elf-eabi" "4.4.4" "rockbox-multilibs-noexceptions-arm-elf-eabi-gcc-4.4.2_1.diff" "$gccopts" "gmp mpfr"
|
2010-06-05 23:05:07 +00:00
|
|
|
;;
|
2009-04-10 15:35:24 +00:00
|
|
|
|
2010-06-05 23:05:07 +00:00
|
|
|
*)
|
|
|
|
echo "ROCKBOXDEV: Unsupported architecture option: $arch"
|
|
|
|
exit
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
done
|
2006-05-15 13:26:59 +00:00
|
|
|
|
2008-08-01 11:19:29 +00:00
|
|
|
echo ""
|
2010-06-05 23:05:07 +00:00
|
|
|
echo "ROCKBOXDEV: Done!"
|
2006-05-29 22:23:00 +00:00
|
|
|
echo ""
|
2010-06-05 23:05:07 +00:00
|
|
|
echo "ROCKBOXDEV: Make sure your PATH includes $prefix/bin"
|
2009-04-10 15:35:24 +00:00
|
|
|
echo ""
|