#! /bin/sh

########################################################################
#
# File:   gcc_build
# Author: Mark Mitchell
# Date:   2000-07-10
#
# Adapted to Subversion by Ben Elliston <bje@au.ibm.com>, 2005-07-14.
#
# Contents:
#   Script to automatically download and build GCC.
#
# Copyright (c) 2000, 2001, 2003, 2005 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 3, 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, 51 Franklin Street, Fifth Floor,
# Boston, MA 02110-1301, USA.
#
########################################################################

########################################################################
# Notes
########################################################################

# 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]
		 [-b branch_name]
		 [-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"
}

# Checkout a fresh copy of the GCC build tree.

checkout_gcc() {
    # If the destination already exists, don't risk destroying it.
    test -e ${DESTINATION} && \
	error "${DESTINATION} already exists"

    # Checkout the tree
    test -n "${SVN_USERNAME}" && SVN_USERNAME="${SVN_USERNAME}@"
    SVNROOT="${SVN_PROTOCOL}://${SVN_USERNAME}${SVN_SERVER}${SVN_REPOSITORY}${SVN_BRANCH}"

    $GCC_SVN co $SVNROOT ${DESTINATION} || \
	error "Could not check out GCC"
}

# Update GCC.

update_gcc() {
    # 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 || \
	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=.svn \
	--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
########################################################################

# SVN command
GCC_SVN=${GCC_SVN-${SVN-svn}}
# The SVN server containing the GCC repository.
SVN_SERVER="gcc.gnu.org"
# The path to the repository on that server.
SVN_REPOSITORY="/svn/gcc/"
# The branch to check out from that server.
# Defaults to trunk if no branch is defined with -b.
SVN_BRANCH=""
# The SVN protocol to use.
SVN_PROTOCOL="svn"
# The username to use when connecting to the server.
# An empty string means anonymous.
SVN_USERNAME=""

# 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
########################################################################

# Issue usage if no parameters are given.
test $# -eq 0 && usage

# Parse the options.
while getopts "c:d:m:o:p:t:b:u:x:" ARG; do
    case $ARG in
    c)    CONFIGURE_OPTIONS="${OPTARG}";;
    d)    DESTINATION="${OPTARG}";;
    m)    MAKE_BOOTSTRAP_OPTIONS="${OPTARG}";;
    o)    OBJDIR="${OPTARG}";;
    p)    SVN_PROTOCOL="${OPTARG}";;
    t)    TARFILE="${OPTARG}";;
    x)    MAKE_CHECK_OPTIONS="${OPTARG}";;
    b)    SVN_BRANCH="${OPTARG}";;
    u)    SVN_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

if [ ${CHECKOUT} -eq 0 ] && test -n "${SVN_BRANCH}"; then
    error "Branch argument only makes sense when doing a checkout"
fi

# Validate the branch name.
if test -n "${SVN_BRANCH}"; then
    SVN_BRANCH="branches/${SVN_BRANCH}";
else
    SVN_BRANCH="trunk";
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
