Home | History | Annotate | Line # | Download | only in contrib
      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