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