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