| #! /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-2026 Free Software Foundation, Inc. | |
| # | |
| # 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 |