| #! /bin/sh |
| |
| ######################################################################## |
| # |
| # File: gcc_build |
| # 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() { |
| 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 |
| $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." |
| 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 |
| ######################################################################## |
| |
| # 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 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 |