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