Newer
Older
#! /bin/sh
########################################################################
#
# Author: Mark Mitchell
# Date: 07/10/2000
#
# Contents:
# Script to automatically download and build GCC.
#
# Copyright (c) 2000, 2001, 2003 Free Software Foundation.
# This file is part of GCC.
# GCC 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; either version 2, or (at your option)
# any later version.
#
# GCC 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.
#
# You should have received a copy of the GNU General Public License
# along with GCC; see the file COPYING. If not, write to
# the Free Software Foundation, 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#
########################################################################
########################################################################
# Notes
########################################################################
# If you are using password-based CVS, you must manually log in, and
# not log out from, the CVS server before running this script.
# You can set the following variables in the environment. They
# have no corresponding command-line options because they should
# only be needed infrequently:
#
# MAKE The path to `make'.
########################################################################
# Functions
########################################################################
# Issue the error message given by $1 and exit with a non-zero
# exit code.
error() {
exit 1
}
# Issue a usage message explaining how to use this script.
usage() {
cat <<EOF
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
[export]
[install]
[test]
[update]
EOF
exit 1
}
# Change to the directory given by $1.
changedir() {
cd $1 || \
error "Could not change directory to $1"
}
# Set up CVS environment variables
cvs_setup() {
CVSROOT=":${CVS_PROTOCOL}:${CVS_USERNAME}@"
CVSROOT="${CVSROOT}${CVS_SERVER}:${CVS_REPOSITORY}"
export CVSROOT
}
# Checkout a fresh copy of the GCC build tree.
checkout_gcc() {
# Tell CVS where to find everything.
cvs_setup
# If the destination already exists, don't risk destroying it.
test -e ${DESTINATION} && \
error "${DESTINATION} already exists"
# CVS doesn't allow an absolute path for the destination directory.
DESTINATION_PARENT=`dirname ${DESTINATION}`
test -d ${DESTINATION_PARENT} || \
error "${DESTINATION_PARENT} is not a directory"
changedir ${DESTINATION_PARENT}
# Checkout the tree
$GCC_CVS -z 9 co -d `basename ${DESTINATION}` gcc || \
error "Could not check out GCC"
}
# Update GCC.
update_gcc() {
# Tell CVS where to find everything
cvs_setup
# If the destination does not already exist, complain.
test -d ${DESTINATION} || \
error "{$DESTINATION} does not exist"
# Enter the destination directory.
changedir ${DESTINATION}
# Update the tree
./contrib/gcc_update -d || \
# Configure for a build of GCC.
# Go to the source directory.
changedir ${DESTINATION}
# Remove the object directory.
rm -rf ${OBJDIR}
# Create it again.
mkdir ${OBJDIR} || \
error "Could not create ${OBJDIR}"
# Enter it.
changedir ${OBJDIR}
# Configure the tree.
Mark Mitchell
committed
echo "Configuring: ${DESTINATION}/configure ${CONFIGURE_OPTIONS}"
eval ${DESTINATION}/configure ${CONFIGURE_OPTIONS} || \
error "Could not configure the compiler"
}
# Bootstrap GCC. Assume configuration has already occurred.
bootstrap_gcc() {
# Go to the source directory.
changedir ${DESTINATION}
# Go to the object directory.
changedir ${OBJDIR}
Mark Mitchell
committed
echo "Building: ${MAKE} ${MAKE_BOOTSTRAP_OPTIONS} bootstrap"
eval ${MAKE} ${MAKE_BOOTSTRAP_OPTIONS} bootstrap || \
error "Could not bootstrap the compiler"
}
# Test GCC.
test_gcc() {
# Go to the source directory.
changedir ${DESTINATION}
# Go to the object directory.
changedir ${OBJDIR}
echo "Running tests... This will take a while."
${MAKE} -k check
${DESTINATION}/contrib/test_summary
}
# Export the GCC source tree.
export_gcc() {
# Go to the source directory.
changedir ${DESTINATION}
# Go up one level.
changedir ..
tar czf ${TARFILE} \
--exclude=${OBJDIR} \
--exclude=CVS \
--exclude='.#*' \
--exclude='*~' \
`basename ${DESTINATION}`
}
# Install GCC.
install_gcc() {
# Go to the source directory.
changedir ${DESTINATION}
# Go to the object directory.
changedir ${OBJDIR}
${MAKE} install || error "Installation failed"
}
########################################################################
# Initialization
########################################################################
# CVS command
GCC_CVS=${GCC_CVS-${CVS-cvs}}
# The CVS server containing the GCC repository.
CVS_SERVER="gcc.gnu.org"
# The path to the repository on that server.
CVS_REPOSITORY="/cvs/gcc"
# The CVS protocol to use.
CVS_PROTOCOL="pserver"
# The username to use when connecting to the server.
CVS_USERNAME="anoncvs"
# The directory where the checked out GCC will be placed.
DESTINATION="${HOME}/dev/gcc"
# The relative path from the top of the source tree to the
# object directory.
OBJDIR="objdir"
# The file where the tarred up sources will be placed.
TARFILE="${HOME}/dev/gcc.tgz"
# Options to pass to configure.
CONFIGURE_OPTIONS=
# The `make' program.
MAKE=${MAKE:-make}
EXPORT=0
INSTALL=0
TEST=0
UPDATE=0
########################################################################
# Main Program
########################################################################
# Parse the options.
while getopts "c:d:m:o:p:t:u:" ARG; do
case $ARG in
c) CONFIGURE_OPTIONS="${OPTARG}";;
d) DESTINATION="${OPTARG}";;
m) MAKE_BOOTSTRAP_OPTIONS="${OPTARG}";;
o) OBJDIR="${OPTARG}";;
p) CVS_PROTOCOL="${OPTARG}";;
t) CVS_TARGFILE="${OPTARG}";;
\?) usage;;
esac
done
shift `expr ${OPTIND} - 1`
# Handle the major modes.
while [ $# -ne 0 ]; do
case $1 in
bootstrap) BOOTSTRAP=1;;
build) CONFIGURE=1; BOOTSTRAP=1;;
export) EXPORT=1;;
install) INSTALL=1;;
test) TEST=1;;
update) UPDATE=1;;
*) usage;;
esac
shift
done
# Check the arguments for sanity.
if [ ${CHECKOUT} -ne 0 ] && [ ${UPDATE} -ne 0 ]; then
error "Cannot checkout and update simultaneously"
fi
# Checkout the tree.
if [ ${CHECKOUT} -ne 0 ]; then
checkout_gcc
elif [ ${UPDATE} -ne 0 ]; then
update_gcc
fi
# Configure to build the tree.
if [ ${CONFIGURE} -ne 0 ]; then
configure_gcc
fi
# Bootstrap the compiler.
if [ ${BOOTSTRAP} -ne 0 ]; then
bootstrap_gcc
fi
# Test the compiler
if [ ${TEST} -ne 0 ]; then
test_gcc
fi
# Install the compiler.
if [ ${INSTALL} -ne 0 ]; then
install_gcc
fi
# Export the sources
if [ ${EXPORT} -ne 0 ]; then
export_gcc
fi