1#! /bin/sh 2 3######################################################################## 4# 5# File: gcc_build 6# Author: Mark Mitchell 7# Date: 07/10/2000 8# 9# Contents: 10# Script to automatically download and build GCC. 11# 12# Copyright (c) 2000, 2001 Free Software Foundation. 13# 14# This file is part of GNU CC. 15# 16# GNU CC is free software; you can redistribute it and/or modify 17# it under the terms of the GNU General Public License as published by 18# the Free Software Foundation; either version 2, or (at your option) 19# any later version. 20# 21# GNU CC is distributed in the hope that it will be useful, 22# but WITHOUT ANY WARRANTY; without even the implied warranty of 23# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 24# GNU General Public License for more details. 25# 26# You should have received a copy of the GNU General Public License 27# along with GNU CC; see the file COPYING. If not, write to 28# the Free Software Foundation, 59 Temple Place - Suite 330, 29# Boston, MA 02111-1307, USA. 30# 31######################################################################## 32 33######################################################################## 34# Notes 35######################################################################## 36 37# If you are using password-based CVS, you must manually log in, and 38# not log out from, the CVS server before running this script. 39 40# You can set the following variables in the environment. They 41# have no corresponding command-line options because they should 42# only be needed infrequently: 43# 44# MAKE The path to `make'. 45 46######################################################################## 47# Functions 48######################################################################## 49 50# Issue the error message given by $1 and exit with a non-zero 51# exit code. 52 53error() { 54 echo "gcc_build: error: $1" 55 exit 1 56} 57 58# Issue a usage message explaining how to use this script. 59 60usage() { 61cat <<EOF 62gcc_build [-c configure_options] 63 [-d destination_directory] 64 [-m make_boot_options] 65 [-o objdir] 66 [-u username] 67 [-p protocol] 68 [-t tarfile] 69 [-x make_check_options] 70 [bootstrap] 71 [build] 72 [checkout] 73 [configure] 74 [export] 75 [install] 76 [test] 77 [update] 78EOF 79 exit 1 80} 81 82# Change to the directory given by $1. 83 84changedir() { 85 cd $1 || \ 86 error "Could not change directory to $1" 87} 88 89# Set up CVS environment variables 90 91cvs_setup() { 92 CVSROOT=":${CVS_PROTOCOL}:${CVS_USERNAME}@" 93 CVSROOT="${CVSROOT}${CVS_SERVER}:${CVS_REPOSITORY}" 94 export CVSROOT 95} 96 97# Checkout a fresh copy of the GCC build tree. 98 99checkout_gcc() { 100 # Tell CVS where to find everything. 101 cvs_setup 102 103 # If the destination already exists, don't risk destroying it. 104 test -e ${DESTINATION} && \ 105 error "${DESTINATION} already exists" 106 107 # CVS doesn't allow an absolute path for the destination directory. 108 DESTINATION_PARENT=`dirname ${DESTINATION}` 109 test -d ${DESTINATION_PARENT} || \ 110 error "${DESTINATION_PARENT} is not a directory" 111 changedir ${DESTINATION_PARENT} 112 113 # Checkout the tree 114 cvs -z 9 co -d `basename ${DESTINATION}` gcc || \ 115 error "Could not check out GCC" 116} 117 118# Update GCC. 119 120update_gcc() { 121 # Tell CVS where to find everything 122 cvs_setup 123 124 # If the destination does not already exist, complain. 125 test -d ${DESTINATION} || \ 126 error "{$DESTINATION} does not exist" 127 # Enter the destination directory. 128 changedir ${DESTINATION} 129 130 # Update the tree 131 ./contrib/gcc_update -d || \ 132 error "Could not update GCC" 133} 134 135# Configure for a build of GCC. 136 137configure_gcc() { 138 # Go to the source directory. 139 changedir ${DESTINATION} 140 141 # Remove the object directory. 142 rm -rf ${OBJDIR} 143 # Create it again. 144 mkdir ${OBJDIR} || \ 145 error "Could not create ${OBJDIR}" 146 # Enter it. 147 changedir ${OBJDIR} 148 149 # Configure the tree. 150 echo "Configuring: ${DESTINATION}/configure ${CONFIGURE_OPTIONS}" 151 eval ${DESTINATION}/configure ${CONFIGURE_OPTIONS} || \ 152 error "Could not configure the compiler" 153} 154 155# Bootstrap GCC. Assume configuration has already occurred. 156 157bootstrap_gcc() { 158 # Go to the source directory. 159 changedir ${DESTINATION} 160 # Go to the object directory. 161 changedir ${OBJDIR} 162 163 # Bootstrap the compiler 164 echo "Building: ${MAKE} ${MAKE_BOOTSTRAP_OPTIONS} bootstrap" 165 eval ${MAKE} ${MAKE_BOOTSTRAP_OPTIONS} bootstrap || \ 166 error "Could not bootstrap the compiler" 167} 168 169# Test GCC. 170 171test_gcc() { 172 # Go to the source directory. 173 changedir ${DESTINATION} 174 # Go to the object directory. 175 changedir ${OBJDIR} 176 177 echo "Running tests... This will take a while." 178 eval \${MAKE} -k ${MAKE_CHECK_OPTIONS} check 179 ${DESTINATION}/contrib/test_summary 180} 181 182# Export the GCC source tree. 183 184export_gcc() { 185 # Go to the source directory. 186 changedir ${DESTINATION} 187 # Go up one level. 188 changedir .. 189 # Build a tarball of the source directory. 190 tar czf ${TARFILE} \ 191 --exclude=${OBJDIR} \ 192 --exclude=CVS \ 193 --exclude='.#*' \ 194 --exclude='*~' \ 195 `basename ${DESTINATION}` 196} 197 198# Install GCC. 199 200install_gcc() { 201 # Go to the source directory. 202 changedir ${DESTINATION} 203 # Go to the object directory. 204 changedir ${OBJDIR} 205 206 ${MAKE} install || error "Installation failed" 207} 208 209######################################################################## 210# Initialization 211######################################################################## 212 213# The CVS server containing the GCC repository. 214CVS_SERVER="gcc.gnu.org" 215# The path to the repository on that server. 216CVS_REPOSITORY="/cvs/gcc" 217# The CVS protocol to use. 218CVS_PROTOCOL="pserver" 219# The username to use when connecting to the server. 220CVS_USERNAME="anoncvs" 221 222# The directory where the checked out GCC will be placed. 223DESTINATION="${HOME}/dev/gcc" 224# The relative path from the top of the source tree to the 225# object directory. 226OBJDIR="objdir" 227 228# The file where the tarred up sources will be placed. 229TARFILE="${HOME}/dev/gcc.tgz" 230 231# Options to pass to configure. 232CONFIGURE_OPTIONS= 233# The `make' program. 234MAKE=${MAKE:-make} 235# Options to pass to "make bootstrap". 236MAKE_BOOTSTRAP_OPTIONS= 237# Options to pass to "make check". 238MAKE_CHECK_OPTIONS= 239 240# Modes of operation 241BOOTSTRAP=0 242CHECKOUT=0 243CONFIGURE=0 244EXPORT=0 245INSTALL=0 246TEST=0 247UPDATE=0 248 249######################################################################## 250# Main Program 251######################################################################## 252 253# Parse the options. 254while getopts "c:d:m:o:p:t:u:x:" ARG; do 255 case $ARG in 256 c) CONFIGURE_OPTIONS="${OPTARG}";; 257 d) DESTINATION="${OPTARG}";; 258 m) MAKE_BOOTSTRAP_OPTIONS="${OPTARG}";; 259 o) OBJDIR="${OPTARG}";; 260 p) CVS_PROTOCOL="${OPTARG}";; 261 t) TARFILE="${OPTARG}";; 262 x) MAKE_CHECK_OPTIONS="${OPTARG}";; 263 u) CVS_USERNAME="${OPTARG}";; 264 \?) usage;; 265 esac 266done 267shift `expr ${OPTIND} - 1` 268 269# Handle the major modes. 270while [ $# -ne 0 ]; do 271 case $1 in 272 bootstrap) BOOTSTRAP=1;; 273 build) CONFIGURE=1; BOOTSTRAP=1;; 274 checkout) CHECKOUT=1;; 275 configure) CONFIGURE=1;; 276 export) EXPORT=1;; 277 install) INSTALL=1;; 278 test) TEST=1;; 279 update) UPDATE=1;; 280 *) usage;; 281 esac 282 shift 283done 284 285# Check the arguments for sanity. 286if [ ${CHECKOUT} -ne 0 ] && [ ${UPDATE} -ne 0 ]; then 287 error "Cannot checkout and update simultaneously" 288fi 289 290# Checkout the tree. 291if [ ${CHECKOUT} -ne 0 ]; then 292 checkout_gcc 293elif [ ${UPDATE} -ne 0 ]; then 294 update_gcc 295fi 296 297# Configure to build the tree. 298if [ ${CONFIGURE} -ne 0 ]; then 299 configure_gcc 300fi 301 302# Bootstrap the compiler. 303if [ ${BOOTSTRAP} -ne 0 ]; then 304 bootstrap_gcc 305fi 306 307# Test the compiler 308if [ ${TEST} -ne 0 ]; then 309 test_gcc 310fi 311 312# Install the compiler. 313if [ ${INSTALL} -ne 0 ]; then 314 install_gcc 315fi 316 317# Export the sources 318if [ ${EXPORT} -ne 0 ]; then 319 export_gcc 320fi 321