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