diff options
Diffstat (limited to 'gnu/usr.bin/gcc/contrib/gcc_build')
-rwxr-xr-x | gnu/usr.bin/gcc/contrib/gcc_build | 320 |
1 files changed, 320 insertions, 0 deletions
diff --git a/gnu/usr.bin/gcc/contrib/gcc_build b/gnu/usr.bin/gcc/contrib/gcc_build new file mode 100755 index 00000000000..416835c2ccc --- /dev/null +++ b/gnu/usr.bin/gcc/contrib/gcc_build @@ -0,0 +1,320 @@ +#! /bin/sh + +######################################################################## +# +# File: gcc_build +# Author: Mark Mitchell +# Date: 07/10/2000 +# +# Contents: +# Script to automatically download and build GCC. +# +# Copyright (c) 2000, 2001 Free Software Foundation. +# +# This file is part of GNU CC. +# +# GNU CC 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 2, or (at your option) +# any later version. +# +# GNU CC 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 GNU CC; see the file COPYING. If not, write to +# the Free Software Foundation, 59 Temple Place - Suite 330, +# Boston, MA 02111-1307, USA. +# +######################################################################## + +######################################################################## +# Notes +######################################################################## + +# If you are using password-based CVS, you must manually log in, and +# not log out from, the CVS server before running this script. + +# 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] + [-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" +} + +# Set up CVS environment variables + +cvs_setup() { + CVSROOT=":${CVS_PROTOCOL}:${CVS_USERNAME}@" + CVSROOT="${CVSROOT}${CVS_SERVER}:${CVS_REPOSITORY}" + export CVSROOT +} + +# Checkout a fresh copy of the GCC build tree. + +checkout_gcc() { + # Tell CVS where to find everything. + cvs_setup + + # If the destination already exists, don't risk destroying it. + test -e ${DESTINATION} && \ + error "${DESTINATION} already exists" + + # CVS doesn't allow an absolute path for the destination directory. + DESTINATION_PARENT=`dirname ${DESTINATION}` + test -d ${DESTINATION_PARENT} || \ + error "${DESTINATION_PARENT} is not a directory" + changedir ${DESTINATION_PARENT} + + # Checkout the tree + cvs -z 9 co -d `basename ${DESTINATION}` gcc || \ + error "Could not check out GCC" +} + +# Update GCC. + +update_gcc() { + # Tell CVS where to find everything + cvs_setup + + # 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 -d || \ + 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=CVS \ + --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 +######################################################################## + +# The CVS server containing the GCC repository. +CVS_SERVER="gcc.gnu.org" +# The path to the repository on that server. +CVS_REPOSITORY="/cvs/gcc" +# The CVS protocol to use. +CVS_PROTOCOL="pserver" +# The username to use when connecting to the server. +CVS_USERNAME="anoncvs" + +# 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 +######################################################################## + +# Parse the options. +while getopts "c:d:m:o:p:t:u:x:" ARG; do + case $ARG in + c) CONFIGURE_OPTIONS="${OPTARG}";; + d) DESTINATION="${OPTARG}";; + m) MAKE_BOOTSTRAP_OPTIONS="${OPTARG}";; + o) OBJDIR="${OPTARG}";; + p) CVS_PROTOCOL="${OPTARG}";; + t) TARFILE="${OPTARG}";; + x) MAKE_CHECK_OPTIONS="${OPTARG}";; + u) CVS_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 + +# 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 |