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