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