#! /bin/sh ######################################################################## # # File: gcc_build # Author: Mark Mitchell # Date: 07/10/2000 # # Contents: # Script to automatically download and build GCC. # # Copyright (c) 2000 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 <&1 | tee -a ${LOGFILE}) || \ 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 (eval ${MAKE} ${MAKE_BOOTSTRAP_OPTIONS} bootstrap 2>&1 | tee -a ${LOGFILE}) || \ 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 2>&1 | tee -a ${LOGFILE}) (${DESTINATION}/contrib/test_summary | tee -a ${LOGFILE}) } # 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 2>&1 | tee -a ${LOGFILE}) || \ 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 information will be logged. LOGFILE=${HOME}/build-gcc.$$.log # 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. MAKE_BOOTSTRAP_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:" 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}";; 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 # Remove any old logfiles. rm -f ${LOGFILE} # Tell the user where to find the logfile. echo "gcc_build: The logfile for this run is ${LOGFILE}" # 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