blob: 8b132bb9a9c4ec557a52b056a37de7d106f5c100 [file] [log] [blame]
#!/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