#! /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] [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 $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 || \ 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." ${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 .. # 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 ######################################################################## # 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} # 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 # 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