Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # 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
- # this is where this script will store downloaded files and check for already
- # downloaded files
- dlwhere="${RBDEV_DOWNLOAD:-/tmp/rbdev-dl}"
- # 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.
- prefix="${RBDEV_PREFIX:-/usr/local}"
- # 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).
- builddir="${RBDEV_BUILD:-/tmp/rbdev-build}"
- # 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.
- if [ -f "`which gmake 2>/dev/null`" ]; then
- make="gmake"
- else
- make="make"
- fi
- if [ -z $GNU_MIRROR ] ; then
- GNU_MIRROR=http://mirrors.kernel.org/gnu
- fi
- if [ -z $LINUX_MIRROR ] ; then
- LINUX_MIRROR=http://www.kernel.org/pub/linux
- fi
- # These are the tools this script requires and depends upon.
- reqtools="gcc bzip2 gzip make patch makeinfo automake libtool autoconf flex bison"
- ##############################################################################
- # Functions:
- findtool(){
- file="$1"
- IFS=":"
- for path in $PATH
- do
- # echo "Checks for $file in $path" >&2
- if test -f "$path/$file"; then
- echo "$path/$file"
- return
- fi
- done
- }
- findlib (){
- lib="$1"
- # on error, gcc will spit out "cannot find -lxxxx", but it may not be in
- # english so grep for -lxxxx
- if ! gcc -l$lib 2>&1 | grep -q -- "-l$lib"; then
- echo "ok"
- return
- fi
- }
- # check if all the libraries in argument are installed, exit with error if not
- checklib() {
- for t in "$@"; do
- lib=`findlib $t`
- if test -z "$lib"; then
- echo "ROCKBOXDEV: library \"$t\" is required for this script to work."
- missingtools="yes"
- fi
- done
- if [ -n "$missingtools" ]; then
- echo "ROCKBOXDEV: Please install the missing libraries and re-run the script."
- exit 1
- fi
- }
- input() {
- read response
- echo $response
- }
- # compare two versions, return 1 if first version is strictly before the second
- # version_lt ver1 ver2
- version_lt() {
- # use sort with natural version sorting
- ltver=`printf "$1\n$2" | sort -V | head -n 1`
- [ "$1" = "$ltver" ] && true || false
- }
- # Download a file from a server (unless it already exists locally in $dlwhere).
- # The output file name is always $dlwhere/$1, and the function will try URLs
- # one after the other
- # $1 file
- # $2 server file name
- # $2,$3,... URL root list
- getfile_ex() {
- out_file="$dlwhere/$1"
- srv_file="$2"
- if test -f $out_file; then
- echo "ROCKBOXDEV: Skipping download of $1: File already exists"
- return
- fi
- # find tool (curl or wget) and build download command
- tool=`findtool curl`
- if test -z "$tool"; then
- tool=`findtool wget`
- if test -n "$tool"; then
- # wget download
- echo "ROCKBOXDEV: Downloading $1 using wget"
- tool="$tool -T 60 -O "
- else
- echo "ROCKBOXDEV: No downloader tool found!"
- echo "ROCKBOXDEV: Please install curl or wget and re-run the script"
- exit
- fi
- else
- # curl download
- echo "ROCKBOXDEV: Downloading $1 using curl"
- tool="$tool -fLo "
- fi
- # shift arguments so that $@ is the list of URLs
- shift
- shift
- for url in "$@"; do
- echo "ROCKBOXDEV: try $url/$srv_file"
- if $tool "$out_file" "$url/$srv_file"; then
- return
- fi
- done
- echo "ROCKBOXDEV: couldn't download the file!"
- echo "ROCKBOXDEV: check your internet connection"
- exit
- }
- #$1 file
- #$2 URL"root
- # Output file name is the same as the server file name ($1)
- # Does not download the file if it already exists locally in $dlwhere/
- getfile() {
- getfile_ex "$1" "$1" "$2"
- }
- # wrapper around getfile to abstract url
- # getttool tool version
- # the file is always downloaded to "$dlwhere/$toolname-$version.tar.bz2"
- gettool() {
- toolname="$1"
- version="$2"
- ext="tar.bz2"
- file="$toolname-$version"
- srv_file="$toolname-$version"
- case $toolname in
- gcc)
- # before 4.7, the tarball was named gcc-core
- if version_lt "$version" "4.7"; then
- srv_file="gcc-core-$version"
- fi
- url="$GNU_MIRROR/gcc/gcc-$version"
- ;;
- binutils)
- url="$GNU_MIRROR/binutils"
- ;;
- glibc)
- url="$GNU_MIRROR/glibc"
- ;;
- crosstool-ng)
- url="http://crosstool-ng.org/download/crosstool-ng"
- ;;
- alsa-lib)
- url="ftp://ftp.alsa-project.org/pub/lib/"
- ;;
- linux)
- # FIXME linux kernel server uses an overcomplicated architecture,
- # especially for longterm kernels, so we need to lookup several
- # places. This will need fixing for non-4-part 2.6 versions but it
- # is written in a way that should make it easy
- case "$version" in
- 2.6.*.*)
- # 4-part versions -> remove last digit for longterm
- longterm_ver="${version%.*}"
- top_dir="v2.6"
- ;;
- 3.*)
- longterm_ver=""
- top_dir="v3.x"
- ;;
- *)
- echo "ROCKBOXDEV: I don't know how to handle this kernel version: $version"
- exit
- ;;
- esac
- base_url="http://www.kernel.org/pub/linux/kernel/$top_dir"
- # we try several URLs, the 2.6 versions are a mess and need that
- url="$base_url $base_url/longterm/v$longterm_ver $base_url/longterm"
- ext="tar.gz"
- ;;
- *)
- echo "ROCKBOXDEV: Bad toolname $toolname"
- exit
- ;;
- esac
- getfile_ex "$file.$ext" "$srv_file.$ext" $url
- }
- # extract file to the current directory
- # extract file
- extract() {
- if [ -d "$1" ]; then
- echo "ROCKBOXDEV: Skipping extraction of $1: already done"
- return
- fi
- echo "ROCKBOXDEV: extracting $1"
- if [ -f "$dlwhere/$1.tar.bz2" ]; then
- tar xjf "$dlwhere/$1.tar.bz2"
- elif [ -f "$dlwhere/$1.tar.gz" ]; then
- tar xzf "$dlwhere/$1.tar.gz"
- else
- echo "ROCKBOXDEV: I don't know how to extract $1 (no bzip2 or gzip)"
- exit
- fi
- }
- # run a command, and a log command and output to a file (append)
- # exit on error
- # run_cmd logfile cmd...
- run_cmd() {
- logfile="$1"
- shift
- echo "Running '$@'" >>$logfile
- if ! $@ >> "$logfile" 2>&1; then
- echo "ROCKBOXDEV: an error occured, please see $logfile"
- exit
- fi
- }
- # check if the following should be executed or not, depending on RESTART variable:
- # $1=tool
- # If RESTART is empty, always perform step, otherwise only perform is there is
- # an exact match. On the first match, RESTART is reset to "" so that next step
- # are executed
- check_restart() {
- if [ "$1" = "$RESTART" ]; then
- RESTART=""
- true
- fi
- [ "$RESTART" = "" ] && true || false
- }
- # advanced tool building: create a build directory, run configure, run make
- # and run make install. It is possible to customize all steps or disable them
- # $1=tool
- # $2=version
- # $3=configure options, or "NO_CONFIGURE" to disable step
- # $4=make options, or "NO_MAKE" to disable step
- # $5=make install options (will be replaced by "install" if left empty)
- # By default, the restary step is the toolname, but it can be changed by setting
- # RESTART_STEP
- buildtool() {
- tool="$1"
- version="$2"
- toolname="$tool-$version"
- config_opt="$3"
- make_opts="$4"
- install_opts="$5"
- logfile="$builddir/build-$toolname.log"
- stepname=${RESTART_STEP-$tool}
- if ! check_restart "$stepname"; then
- echo "ROCKBOXDEV: Skipping step '$stepname' as requested per RESTART"
- return
- fi
- echo "ROCKBOXDEV: Starting step '$stepname'"
- echo "ROCKBOXDEV: logging to $logfile"
- rm -f "$logfile"
- echo "ROCKBOXDEV: mkdir build-$toolname"
- mkdir "build-$toolname"
- echo "ROCKBOXDEV: cd build-$toolname"
- cd "build-$toolname"
- # in-tree/out-of-tree build
- case "$tool" in
- linux|alsa-lib)
- # in-intree
- echo "ROCKBOXDEV: copy $toolname for in-tree build"
- # copy the source directory to the build directory
- cp -r ../$toolname/* .
- cfg_dir="."
- ;;
- *)
- # out-of-tree
- cfg_dir="../$toolname";
- ;;
- esac
- if [ "$config_opt" != "NO_CONFIGURE" ]; then
- echo "ROCKBOXDEV: $toolname/configure"
- # NOTE glibc requires to be compiled with optimization
- CFLAGS='-U_FORTIFY_SOURCE -fgnu89-inline -O2' run_cmd "$logfile" \
- "$cfg_dir/configure" "--prefix=$prefix" \
- --disable-docs $config_opt
- fi
- if [ "$make_opts" != "NO_MAKE" ]; then
- echo "ROCKBOXDEV: $toolname/make"
- run_cmd "$logfile" $make $make_opts
- fi
- if [ "$install_opts" = "" ]; then
- install_opts="install"
- fi
- echo "ROCKBOXDEV: $toolname/make (install)"
- run_cmd "$logfile" $make $install_opts
- echo "ROCKBOXDEV: rm -rf build-$toolname $toolname"
- cd ..
- rm -rf build-$toolname
- }
- build() {
- toolname="$1"
- target="$2"
- version="$3"
- patch="$4"
- configure_params="$5"
- needs_libs="$6"
- logfile="$builddir/build-$toolname.log"
- patch_url="http://www.rockbox.org/gcc"
- # 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
- # download source tarball
- gettool "$toolname" "$version"
- file="$toolname-$version"
- # download patch
- for p in $patch; do
- getfile "$p" "$patch_url"
- done
- cd $builddir
- extract "$toolname-$version"
- # do we have a patch?
- for p in $patch; do
- echo "ROCKBOXDEV: applying patch $p"
- # apply the patch
- (cd $builddir/$toolname-$version && patch -p1 < "$dlwhere/$p")
- # check if the patch applied cleanly
- if [ $? -gt 0 ]; then
- echo "ROCKBOXDEV: failed to apply patch $p"
- exit
- fi
- done
- # kludge to avoid having to install GMP, MPFR and MPC, for new gcc
- if test -n "$needs_libs"; then
- cd "gcc-$version"
- if (echo $needs_libs | grep -q gmp && test ! -d gmp); then
- echo "ROCKBOXDEV: Getting GMP"
- getfile "gmp-4.3.2.tar.bz2" "$GNU_MIRROR/gmp"
- tar xjf $dlwhere/gmp-4.3.2.tar.bz2
- ln -s gmp-4.3.2 gmp
- fi
- if (echo $needs_libs | grep -q mpfr && test ! -d mpfr); then
- echo "ROCKBOXDEV: Getting MPFR"
- getfile "mpfr-2.4.2.tar.bz2" "$GNU_MIRROR/mpfr"
- tar xjf $dlwhere/mpfr-2.4.2.tar.bz2
- ln -s mpfr-2.4.2 mpfr
- fi
- if (echo $needs_libs | grep -q mpc && test ! -d mpc); then
- echo "ROCKBOXDEV: Getting MPC"
- getfile "mpc-0.8.1.tar.gz" "http://www.multiprecision.org/downloads"
- tar xzf $dlwhere/mpc-0.8.1.tar.gz
- ln -s mpc-0.8.1 mpc
- fi
- cd $builddir
- fi
- echo "ROCKBOXDEV: mkdir build-$toolname"
- mkdir build-$toolname
- echo "ROCKBOXDEV: cd build-$toolname"
- cd build-$toolname
- echo "ROCKBOXDEV: logging to $logfile"
- rm -f "$logfile"
- echo "ROCKBOXDEV: $toolname/configure"
- case $toolname in
- crosstool-ng) # ct-ng doesnt support out-of-tree build and the src folder is named differently
- toolname="crosstool-ng"
- cp -r ../$toolname-$version/* ../$toolname-$version/.version .
- ./configure --prefix=$prefix $configure_params
- ;;
- *)
- CFLAGS='-U_FORTIFY_SOURCE -fgnu89-inline'
- run_cmd "$logfile" ../$toolname-$version/configure --target=$target --prefix=$prefix --enable-languages=c --disable-libssp --disable-docs $configure_params
- ;;
- esac
- echo "ROCKBOXDEV: $toolname/make"
- run_cmd "$logfile" $make -i
- echo "ROCKBOXDEV: $toolname/make install"
- run_cmd "$logfile" $make install -i
- echo "ROCKBOXDEV: rm -rf build-$toolname $toolname-$version"
- cd ..
- rm -rf build-$toolname $toolname-$version
- }
- make_ctng() {
- if test -f "`which ct-ng 2>/dev/null`"; then
- ctng="ct-ng"
- else
- ctng=""
- fi
- if test ! -n "$ctng"; then
- if test ! -f "$prefix/bin/ct-ng"; then # look if we build it already
- build "crosstool-ng" "" "1.13.2" "crosstool-ng-1.13.2.diff"
- fi
- fi
- ctng=`PATH=$prefix/bin:$PATH which ct-ng`
- }
- build_ctng() {
- ctng_target="$1"
- extra="$2"
- tc_arch="$3"
- tc_host="$4"
- make_ctng
- dlurl="http://www.rockbox.org/gcc/$ctng_target"
- # download
- getfile "ct-ng-config" "$dlurl"
- test -n "$extra" && getfile "$extra" "$dlurl"
- # 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
- # copy config and cd to $builddir
- mkdir $builddir/build-$ctng_target
- ctng_config="$builddir/build-$ctng_target/.config"
- cat "$dlwhere/ct-ng-config" | sed -e "s,\(CT_PREFIX_DIR=\).*,\1$prefix," > $ctng_config
- cd $builddir/build-$ctng_target
- $ctng "build"
- # install extras
- if test -e "$dlwhere/$extra"; then
- # verify the toolchain has sysroot support
- if test -n `cat $ctng_config | grep CT_USE_SYSROOT\=y`; then
- sysroot=`cat $ctng_config | grep CT_SYSROOT_NAME | sed -e 's,CT_SYSROOT_NAME\=\"\([a-zA-Z0-9]*\)\",\1,'`
- tar xf "$dlwhere/$extra" -C "$prefix/$tc_arch-$ctng_target-$tc_host/$sysroot"
- fi
- fi
- # cleanup
- cd $builddir
- rm -rf $builddir/build-$ctng_target
- }
- # build a cross compiler toolchain for linux
- # $1=target
- # $2=binutils version
- # $3=binutils configure extra options
- # $4=gcc version
- # $5=gcc configure extra options
- # $6=linux version
- # $7=glibc version
- # $8=glibc configure extra options
- build_linux_toolchain () {
- target="$1"
- binutils_ver="$2"
- binutils_opts="$3"
- gcc_ver="$4"
- gcc_opts="$5"
- linux_ver="$6"
- glibc_ver="$7"
- glibc_opts="$8"
- # where to put the sysroot
- sysroot="$prefix/$target/sysroot"
- # extract arch from target
- arch=${target%%-*}
- # check libraries:
- # contrary to other toolchains that rely on a hack to avoid installing
- # gmp, mpc and mpfr, we simply require that they are installed on the system
- # this is not a huge requirement since virtually all systems these days
- # provide dev packages for them
- # FIXME: maybe add an option to download and install them automatically
- checklib "mpc" "gmp" "mpfr"
- # 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
- # download all tools
- gettool "binutils" "$binutils_ver"
- gettool "gcc" "$gcc_ver"
- gettool "linux" "$linux_ver"
- gettool "glibc" "$glibc_ver"
- # extract them
- cd $builddir
- extract "binutils-$binutils_ver"
- extract "gcc-$gcc_ver"
- extract "linux-$linux_ver"
- extract "glibc-$glibc_ver"
- # we make it possible to restart a build on error by using the RESTART
- # variable, the format is RESTART="tool" where tool is the toolname at which
- # to restart (binutils, gcc)
- # install binutils, with support for sysroot
- buildtool "binutils" "$binutils_ver" "--target=$target --disable-werror \
- --with-sysroot=$sysroot --disable-nls" "" ""
- # build stage 1 compiler: disable headers, disable threading so that
- # pthread headers are not included, pretend we use newlib so that libgcc
- # doesn't get linked at the end
- # NOTE there is some magic involved here
- RESTART_STEP="gcc-stage1" \
- buildtool "gcc" "$gcc_ver" "$gcc_opts --enable-languages=c --target=$target \
- --without-headers --disable-threads --disable-libgomp --disable-libmudflap \
- --disable-libssp --disable-libquadmath --disable-libquadmath-support \
- --disable-shared --with-newlib --disable-libitm \
- --disable-libsanitizer --disable-libatomic" "" ""
- # install linux headers
- # NOTE: we need to tell make where to put the build files, since buildtool
- # switches to the builddir, "." will be the correct builddir when ran
- if [ "$arch" == "mipsel" ]; then
- arch="mips"
- fi
- linux_opts="O=. ARCH=$arch INSTALL_HDR_PATH=$sysroot/usr/"
- RESTART_STEP="linux-headers" \
- buildtool "linux" "$linux_ver" "NO_CONFIGURE" \
- "$linux_opts headers_install" "$linux_opts headers_check"
- # build glibc using the first stage cross compiler
- # we need to set the prefix to /usr because the glibc runs on the actual
- # target and is indeed installed in /usr
- prefix="/usr" \
- buildtool "glibc" "$glibc_ver" "--target=$target --host=$target --build=$MACHTYPE \
- --with-__thread --with-headers=$sysroot/usr/include $glibc_opts" \
- "" "install install_root=$sysroot"
- # build stage 2 compiler
- buildtool "gcc" "$gcc_ver" "$gcc_opts --enable-languages=c,c++ --target=$target \
- --with-sysroot=$sysroot" "" ""
- }
- usage () {
- echo "usage: rockboxdev.sh [options]"
- echo "options:"
- echo " --help Display this help"
- echo " --target=LIST List of targets to build"
- echo " --restart=STEP Restart build at given STEP (same as RESTART env var)"
- echo " --prefix=PREFIX Set install prefix (same as RBDEV_PREFIX env var)"
- echo " --dlwhere=DIR Set download directory (same as RBDEV_DOWNLOAD env var)"
- echo " --builddir=DIR Set build directory (same as RBDEV_BUILD env var)"
- echo " --makeflags=FLAGS Set make flags (same as MAKEFLAGS env var)"
- exit 1
- }
- ##############################################################################
- # Code:
- # Parse arguments
- for i in "$@"
- do
- case $i in
- --help)
- usage
- ;;
- --prefix=*)
- prefix="${i#*=}"
- shift
- ;;
- --target=*)
- RBDEV_TARGET="${i#*=}"
- shift
- ;;
- --restart=*)
- RBDEV_RESTART="${i#*=}"
- shift
- ;;
- --dlwhere=*)
- dlwhere="${i#*=}"
- shift
- ;;
- --builddir=*)
- builddir="${i#*=}"
- shift
- ;;
- --makeflags=*)
- export MAKEFLAGS="${i#*=}" # export so it's available in make
- shift
- ;;
- *)
- echo "Unknown option '$i'"
- exit 1
- ;;
- esac
- done
- # Verify required tools and libraries
- for t in $reqtools; do
- tool=`findtool $t`
- if test -z "$tool"; then
- echo "ROCKBOXDEV: \"$t\" is required for this script to work."
- missingtools="yes"
- fi
- done
- if [ -n "$missingtools" ]; then
- echo "ROCKBOXDEV: Please install the missing tools and re-run the script."
- exit 1
- fi
- echo "Download directory : $dlwhere (set RBDEV_DOWNLOAD or use --download= to change)"
- echo "Install prefix : $prefix (set RBDEV_PREFIX or use --prefix= to change)"
- echo "Build dir : $builddir (set RBDEV_BUILD or use --builddir= to change)"
- echo "Make options : $MAKEFLAGS (set MAKEFLAGS or use --makeflags= to change)"
- echo "Restart step : $RBDEV_RESTART (set RBDEV_RESTART or use --restart= to change)"
- echo "Target arch : $RBDEV_TARGET (set RBDEV_TARGET or use --target to change)"
- # 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
- fi
- # 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
- if [ -z "$RBDEV_TARGET" ]; then
- echo "Select target arch:"
- echo "s - sh (Archos models)"
- echo "m - m68k (iriver h1x0/h3x0, iaudio m3/m5/x5 and mpio hd200)"
- echo "a - arm (ipods, iriver H10, Sansa, D2, Gigabeat, etc)"
- echo "i - mips (Jz47xx and ATJ-based players)"
- echo "r - arm-app (Samsung ypr0)"
- echo "x - arm-linux (Generic Linux ARM: Samsung ypr0, Linux-based Sony NWZ)"
- echo "y - mips-linux (Generic Linux MIPS: AGPTek Rocker)"
- echo "separate multiple targets with spaces"
- echo "(Example: \"s m a\" will build sh, m68k and arm)"
- echo ""
- selarch=`input`
- else
- selarch=$RBDEV_TARGET
- fi
- system=`uname -s`
- # add target dir to path to ensure the new binutils are used in gcc build
- PATH="$prefix/bin:${PATH}"
- for arch in $selarch
- do
- echo ""
- case $arch in
- [Ss])
- # For binutils 2.16.1 builtin rules conflict on some systems with a
- # default rule for Objective C. Disable the builtin make rules. See
- # http://sourceware.org/ml/binutils/2005-12/msg00259.html
- export MAKEFLAGS="-r $MAKEFLAGS"
- build "binutils" "sh-elf" "2.16.1" "binutils-2.16.1-texinfo-fix.diff" "--disable-werror"
- build "gcc" "sh-elf" "4.0.3" "gcc-4.0.3-rockbox-1.diff"
- ;;
- [Ii])
- build "binutils" "mipsel-elf" "2.26.1" "" "--disable-werror"
- build "gcc" "mipsel-elf" "4.9.4" "" "" "gmp mpfr mpc"
- ;;
- [Mm])
- build "binutils" "m68k-elf" "2.20.1" "binutils-2.20.1-texinfo-fix.diff" "--disable-werror"
- build "gcc" "m68k-elf" "4.5.2" "" "--with-arch=cf MAKEINFO=missing" "gmp mpfr mpc"
- ;;
- [Aa])
- binopts=""
- gccopts=""
- case $system in
- Darwin)
- binopts="--disable-nls"
- gccopts="--disable-nls"
- ;;
- esac
- build "binutils" "arm-elf-eabi" "2.20.1" "binutils-2.20.1-ld-thumb-interwork-long-call.diff binutils-2.20.1-texinfo-fix.diff" "$binopts --disable-werror"
- build "gcc" "arm-elf-eabi" "4.4.4" "rockbox-multilibs-noexceptions-arm-elf-eabi-gcc-4.4.2_1.diff" "$gccopts MAKEINFO=missing" "gmp mpfr"
- ;;
- [Rr])
- build_ctng "ypr0" "alsalib.tar.gz" "arm" "linux-gnueabi"
- ;;
- [Xx])
- # IMPORTANT NOTE
- # This toolchain must support several targets and thus must support
- # the oldest possible configuration.
- #
- # Samsung YP-R0/R1:
- # ARM1176JZF-S, softfp EABI
- # gcc: 4.9.4 is the latest 4.9.x stable branch, also the only one that
- # compiles with GCC >6
- # kernel: 2.6.27.59 is the same 2.6.x stable kernel as used by the
- # original ct-ng toolchain, the device runs kernel 2.6.24
- # glibc: 2.19 is the latest version that supports kernel 2.6.24 which
- # is used on the device, but we need to support ABI 2.4 because
- # the device uses glibc 2.4.2
- #
- # Sony NWZ:
- # gcc: 4.9.4 is the latest 4.9.x stable branch, also the only one that
- # compiles with GCC >6
- # kernel: 2.6.32.68 is the latest 2.6.x stable kernel, the device
- # runs kernel 2.6.23 or 2.6.35 or 3.x for the most recent
- # glibc: 2.19 is the latest version that supports kernel 2.6.23 which
- # is used on many Sony players, but we need to support ABI 2.7
- # because the device uses glibc 2.7
- #
- # Thus the lowest common denominator is to use the latest 2.6.x stable
- # kernel but compile glibc to support kernel 2.6.23 and glibc 2.4.
- # We use a recent 2.26.1 binutils to avoid any build problems and
- # avoid patches/bugs.
- glibcopts="--enable-kernel=2.6.23 --enable-oldest-abi=2.4"
- build_linux_toolchain "arm-rockbox-linux-gnueabi" "2.26.1" "" "4.9.4" \
- "$gccopts" "2.6.32.68" "2.19" "$glibcopts"
- # build alsa-lib
- # we need to set the prefix to how it is on device (/usr) and then
- # tweak install dir at make install step
- alsalib_ver="1.0.19"
- gettool "alsa-lib" "$alsalib_ver"
- extract "alsa-lib-$alsalib_ver"
- prefix="/usr" buildtool "alsa-lib" "$alsalib_ver" \
- "--host=$target --disable-python" "" "install DESTDIR=$prefix/$target/sysroot"
- ;;
- [yy])
- # IMPORTANT NOTE
- # This toolchain must support several targets and thus must support
- # the oldest possible configuration.
- #
- # AGPTek Rocker:
- # XBurst release 1 (something inbetween mips32r1 and mips32r2)
- # gcc: 4.9.4 is the latest 4.9.x stable branch, also the only one that
- # compiles with GCC >6
- # kernel: 3.10.14
- # glibc: 2.16
- #
- # To maximize compatibility, we use kernel 3.2.85 which is the lastest
- # longterm 3.2 kernel and is supported by the latest glibc, and we
- # require support for up to glibc 2.4
- # We use a recent 2.26.1 binutils to avoid any build problems and
- # avoid patches/bugs.
- glibcopts="--enable-kernel=3.2 --enable-oldest-abi=2.4"
- # FIXME: maybe add -mhard-float
- build_linux_toolchain "mipsel-rockbox-linux-gnu" "2.26.1" "" "4.9.4" \
- "$gccopts" "3.2.85" "2.25" "$glibcopts"
- # build alsa-lib
- # we need to set the prefix to how it is on device (/usr) and then
- # tweak install dir at make install step
- alsalib_ver="1.0.19"
- gettool "alsa-lib" "$alsalib_ver"
- extract "alsa-lib-$alsalib_ver"
- prefix="/usr" buildtool "alsa-lib" "$alsalib_ver" \
- "--host=$target --disable-python" "" "install DESTDIR=$prefix/$target/sysroot"
- ;;
- *)
- echo "ROCKBOXDEV: Unsupported architecture option: $arch"
- exit
- ;;
- esac
- done
- echo ""
- echo "ROCKBOXDEV: Done!"
- echo ""
- echo "ROCKBOXDEV: Make sure your PATH includes $prefix/bin"
- echo ""
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement