| #!/bin/bash |
| |
| ############################################################################ |
| # |
| # Script for generating a PowerPC cross compiler using crosstool. |
| # |
| # Copyright (C) 2009 Bart Van Assche <bvanassche@acm.org>. |
| # |
| # 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. |
| # |
| ############################################################################ |
| |
| ######################### |
| # Function definitions # |
| ######################### |
| |
| # Print an error message and exit. |
| abort() { |
| echo "build failed: $@" |
| exit 1 |
| } |
| |
| # Print command-line help. |
| usage() { |
| cat <<EOF |
| Usage: $0 [-h] [-t crosstools-directory] [gcc-version glibc-version] |
| EOF |
| } |
| |
| # Extract and run crosstool for the specified gcc and glibc versions. |
| generate_cross_compiler() { |
| export GCC_DIR=gcc-$1 |
| export GLIBC_DIR=glibc-$2 |
| |
| export GLIBCTHREADS_FILENAME=glibc-linuxthreads-$2 |
| # glibc-crypt is only needed for glibc 2.1.x and earlier glibc versions. |
| unset GLIBCCRYPT_FILENAME |
| if [ "${2#2.1.}" != "${2}" ]; then |
| GLIBCCRYPT_FILENAME=glibc-crypt-2.1 |
| fi |
| export GLIBCCRYPT_FILENAME |
| unset GCC_CORE_DIR |
| if [ "${1#4.}" != "${1}" -a "${2#2.[12].}" != "$2" ]; then |
| # Use gcc 2.95.3 for compiling glibc 2.1.* and glibc 2.2.*. |
| GCC_CORE_DIR=gcc-2.95.3 |
| else |
| GCC_CORE_DIR=gcc-3.3.6 |
| fi |
| export GCC_CORE_DIR |
| |
| export GCC_EXTRA_CONFIG="--disable-linux-futex --disable-mudflap --disable-nls" |
| #GLIBC_ADDON_OPTIONS= |
| |
| # gcc 4.x aborts with a syntax error on glibc's inline functions if you do |
| # not specify -fgnu89-inline. |
| #if [ "${1#4.}" != "${1}" ]; then |
| # export TARGET_FLAGS="$TARGET_FLAGS -fgnu89-inline" |
| #fi |
| |
| if ! /bin/rm -rf $RESULT_TOP/${GCC_DIR}-${GLIBC_DIR}; then |
| abort "Need write permission in $RESULT_TOP/${GCC_DIR}-${GLIBC_DIR}" |
| fi |
| if ! /bin/mkdir -p $RESULT_TOP/$GCC_DIR-$GLIBC_DIR/$TARGET; then |
| abort "Need write permission in $RESULT_TOP/${GCC_DIR}-${GLIBC_DIR}/$TARGET" |
| fi |
| |
| /bin/rm -rf $CROSSTOOL_FOLDER |
| if [ ! -e $TARBALLS_DIR/crosstool-${CROSSTOOL_VERSION}.tar.gz ]; then |
| ( |
| if cd $TARBALLS_DIR; then |
| wget -q -nc "http://kegel.com/crosstool/crosstool-${CROSSTOOL_VERSION}.tar.gz" |
| fi |
| ) |
| fi |
| /bin/tar -zxf $TARBALLS_DIR/crosstool-${CROSSTOOL_VERSION}.tar.gz |
| /bin/tar -C patches -cf - . | /bin/tar -C $CROSSTOOL_FOLDER/patches -xf - |
| ( |
| cd $CROSSTOOL_FOLDER |
| for f in ../crosstool-patches/* |
| do |
| patch -p1 -f < "$f" || exit $? |
| done |
| ./all.sh --notest |
| ) |
| # /bin/rm -rf $CROSSTOOL_FOLDER |
| } |
| |
| |
| ######################### |
| # Argument processing # |
| ######################### |
| |
| if [ "$SHELL" = "/bin/tcsh" ]; then |
| abort "tcsh is not supported." |
| fi |
| |
| set -- $(/usr/bin/getopt ht: "$@") |
| while [ "${1#-}" != "${1}" ]; do |
| case "$1" in |
| -h) usage; exit 1;; |
| -t) result_top="$2"; shift; shift;; |
| --) shift;; |
| esac |
| done |
| |
| ######################### |
| # Settings # |
| ######################### |
| |
| set -e # Exit immediately if a simple command fails. |
| set -x # Enable echo mode. |
| |
| # Variables that are ignored by crosstool. |
| |
| CROSSTOOL_VERSION=0.43 |
| CROSSTOOL_FOLDER=$PWD/crosstool-$CROSSTOOL_VERSION |
| KERNEL_VERSION=2.6.22 |
| export LC_ALL=C |
| |
| |
| # Variables that are used by the crosstool script as input. |
| |
| # Directory where cross-compilation tools will be installed. |
| export RESULT_TOP=${result_top:-$HOME/x86_64-ppc} |
| # Directory where the tool tar files can be found. |
| export TARBALLS_DIR=$HOME/software/downloads |
| # Target architecture: Pentium CPU, Linux OS. |
| export TARGET=powerpc-linux |
| # Compilation flags for target tools such as glibc. |
| export TARGET_CFLAGS="-O" |
| # Binutils version. |
| export BINUTILS_DIR=binutils-2.16.1 |
| # Languages that must be supported by the gcc cross-compiler. |
| export GCC_LANGUAGES="c,c++" |
| # GDB version. |
| export GDB_DIR=gdb-6.8 |
| # Linux kernel version. |
| export LINUX_DIR=linux-$KERNEL_VERSION |
| # Linux kernel config. |
| export KERNELCONFIG=$PWD/kernel-config/$KERNEL_VERSION/.config |
| # Make flags |
| export PARALLELMFLAGS="-s -j3" |
| |
| ############################## |
| # Cross-compiler generation. # |
| ############################## |
| |
| if ! /bin/mkdir -p $RESULT_TOP; then |
| abort "You need write permission in $RESULT_TOP" |
| fi |
| |
| if [ "$#" = 0 ]; then |
| generate_cross_compiler 4.1.1 2.3.6 |
| elif [ "$#" = 2 ]; then |
| generate_cross_compiler "$1" "$2" |
| else |
| usage |
| abort "Wrong number of arguments." |
| fi |