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