diff options
Diffstat (limited to 'contrib/gcc_build')
-rwxr-xr-x | contrib/gcc_build | 325 |
1 files changed, 325 insertions, 0 deletions
diff --git a/contrib/gcc_build b/contrib/gcc_build new file mode 100755 index 000000000..6713066d7 --- /dev/null +++ b/contrib/gcc_build @@ -0,0 +1,325 @@ +#! /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 |