#! /bin/sh

########################################################################
#
# File:   gcc_build
# Author: Mark Mitchell
# Date:   07/10/2000
#
# Contents:
#   Script to automatically download and build GCC.
#
# Copyright (c) 2000, 2001 Free Software Foundation.
#
# This file is part of GNU CC.
#
# GNU CC 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.
#
# GNU CC 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 GNU CC; 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() {
    echo "gcc_build: error: $1"
    exit 1
}

# Issue a usage message explaining how to use this script.

usage() {
cat <<EOF
gcc_build        [-c configure_options] 
		 [-d destination_directory]
		 [-m make_boot_options]
		 [-o objdir]
		 [-u username]
		 [-p protocol]
		 [-t tarfile]
                 [-x make_check_options]
		 [bootstrap]
		 [build]
		 [checkout]
		 [configure]
		 [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
    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 || \
	error "Could not update GCC"
}

# Configure for a build of GCC.

configure_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.
    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}

    # Bootstrap the compiler
    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."
    eval \${MAKE} -k ${MAKE_CHECK_OPTIONS} check
    ${DESTINATION}/contrib/test_summary
}

# Export the GCC source tree.

export_gcc() {
    # Go to the source directory.
    changedir ${DESTINATION}
    # Go up one level.
    changedir ..
    # Build a tarball of the source directory.
    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
########################################################################

# 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}
# Options to pass to "make bootstrap".
MAKE_BOOTSTRAP_OPTIONS=
# Options to pass to "make check".
MAKE_CHECK_OPTIONS=

# Modes of operation
BOOTSTRAP=0
CHECKOUT=0
CONFIGURE=0
EXPORT=0
INSTALL=0
TEST=0
UPDATE=0

########################################################################
# Main Program
########################################################################

# Parse the options.
while getopts "c:d:m:o:p:t:u:x:" 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)    TARFILE="${OPTARG}";;
    x)    MAKE_CHECK_OPTIONS="${OPTARG}";;
    u)    CVS_USERNAME="${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;;
    checkout) CHECKOUT=1;;
    configure) CONFIGURE=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
