• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/bin/bash
2
3############################################################################
4#
5# Script for generating a PowerPC cross compiler using crosstool.
6#
7# Copyright (C) 2009 Bart Van Assche <bvanassche@acm.org>.
8#
9# This program is free software; you can redistribute it and/or
10# modify it under the terms of the GNU General Public License
11# as published by the Free Software Foundation, version 2
12# of the License.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19############################################################################
20
21#########################
22# Function definitions  #
23#########################
24
25# Print an error message and exit.
26abort() {
27  echo "build failed: $@"
28  exit 1
29}
30
31# Print command-line help.
32usage() {
33  cat <<EOF
34Usage: $0 [-h] [-t crosstools-directory] [gcc-version glibc-version]
35EOF
36}
37
38# Extract and run crosstool for the specified gcc and glibc versions.
39generate_cross_compiler() {
40  export GCC_DIR=gcc-$1
41  export GLIBC_DIR=glibc-$2
42
43  export GLIBCTHREADS_FILENAME=glibc-linuxthreads-$2
44  # glibc-crypt is only needed for glibc 2.1.x and earlier glibc versions.
45  unset GLIBCCRYPT_FILENAME
46  if [ "${2#2.1.}" != "${2}" ]; then
47    GLIBCCRYPT_FILENAME=glibc-crypt-2.1
48  fi
49  export GLIBCCRYPT_FILENAME
50  unset GCC_CORE_DIR
51  if [ "${1#4.}" != "${1}" -a "${2#2.[12].}" != "$2" ]; then
52    # Use gcc 2.95.3 for compiling glibc 2.1.* and glibc 2.2.*.
53    GCC_CORE_DIR=gcc-2.95.3
54  else
55    GCC_CORE_DIR=gcc-3.3.6
56  fi
57  export GCC_CORE_DIR
58
59  export GCC_EXTRA_CONFIG="--disable-linux-futex --disable-mudflap --disable-nls"
60  #GLIBC_ADDON_OPTIONS=
61
62  # gcc 4.x aborts with a syntax error on glibc's inline functions if you do
63  # not specify -fgnu89-inline.
64  #if [ "${1#4.}" != "${1}" ]; then
65  #  export TARGET_FLAGS="$TARGET_FLAGS -fgnu89-inline"
66  #fi
67
68  if ! /bin/rm -rf $RESULT_TOP/${GCC_DIR}-${GLIBC_DIR}; then
69    abort "Need write permission in $RESULT_TOP/${GCC_DIR}-${GLIBC_DIR}"
70  fi
71  if ! /bin/mkdir -p $RESULT_TOP/$GCC_DIR-$GLIBC_DIR/$TARGET; then
72    abort "Need write permission in $RESULT_TOP/${GCC_DIR}-${GLIBC_DIR}/$TARGET"
73  fi
74
75  /bin/rm -rf $CROSSTOOL_FOLDER
76  if [ ! -e $TARBALLS_DIR/crosstool-${CROSSTOOL_VERSION}.tar.gz ]; then
77    (
78      if cd $TARBALLS_DIR; then
79        wget -q -nc "http://kegel.com/crosstool/crosstool-${CROSSTOOL_VERSION}.tar.gz"
80      fi
81    )
82  fi
83  /bin/tar -zxf $TARBALLS_DIR/crosstool-${CROSSTOOL_VERSION}.tar.gz
84  /bin/tar -C patches -cf - . | /bin/tar -C $CROSSTOOL_FOLDER/patches -xf -
85  (
86    cd $CROSSTOOL_FOLDER
87    for f in ../crosstool-patches/*
88    do
89      patch -p1 -f < "$f" || exit $?
90    done
91    ./all.sh --notest
92  )
93  # /bin/rm -rf $CROSSTOOL_FOLDER
94}
95
96
97#########################
98# Argument processing   #
99#########################
100
101if [ "$SHELL" = "/bin/tcsh" ]; then
102  abort "tcsh is not supported."
103fi
104
105set -- $(/usr/bin/getopt ht: "$@")
106while [ "${1#-}" != "${1}" ]; do
107  case "$1" in
108    -h) usage; exit 1;;
109    -t) result_top="$2"; shift; shift;;
110    --) shift;;
111  esac
112done
113
114#########################
115# Settings              #
116#########################
117
118set -e # Exit immediately if a simple command fails.
119set -x # Enable echo mode.
120
121# Variables that are ignored by crosstool.
122
123CROSSTOOL_VERSION=0.43
124CROSSTOOL_FOLDER=$PWD/crosstool-$CROSSTOOL_VERSION
125KERNEL_VERSION=2.6.22
126export LC_ALL=C
127
128
129# Variables that are used by the crosstool script as input.
130
131# Directory where cross-compilation tools will be installed.
132export RESULT_TOP=${result_top:-$HOME/x86_64-ppc}
133# Directory where the tool tar files can be found.
134export TARBALLS_DIR=$HOME/software/downloads
135# Target architecture: Pentium CPU, Linux OS.
136export TARGET=powerpc-linux
137# Compilation flags for target tools such as glibc.
138export TARGET_CFLAGS="-O"
139# Binutils version.
140export BINUTILS_DIR=binutils-2.16.1
141# Languages that must be supported by the gcc cross-compiler.
142export GCC_LANGUAGES="c,c++"
143# GDB version.
144export GDB_DIR=gdb-6.8
145# Linux kernel version.
146export LINUX_DIR=linux-$KERNEL_VERSION
147# Linux kernel config.
148export KERNELCONFIG=$PWD/kernel-config/$KERNEL_VERSION/.config
149# Make flags
150export PARALLELMFLAGS="-s -j3"
151
152##############################
153# Cross-compiler generation. #
154##############################
155
156if ! /bin/mkdir -p $RESULT_TOP; then
157  abort "You need write permission in $RESULT_TOP"
158fi
159
160if [ "$#" = 0 ]; then
161  generate_cross_compiler 4.1.1  2.3.6
162elif [ "$#" = 2 ]; then
163  generate_cross_compiler "$1" "$2"
164else
165  usage
166  abort "Wrong number of arguments."
167fi
168