Home | History | Annotate | Line # | Download | only in maintainer-scripts
gcc_release revision 1.1.1.2
      1      1.1  mrg #! /bin/sh
      2      1.1  mrg 
      3      1.1  mrg ########################################################################
      4      1.1  mrg #
      5      1.1  mrg # File:   gcc_release
      6      1.1  mrg # Author: Jeffrey Law, Bernd Schmidt, Mark Mitchell
      7      1.1  mrg # Date:   2001-05-25
      8      1.1  mrg #
      9      1.1  mrg # Contents:
     10      1.1  mrg #   Script to create a GCC release.
     11      1.1  mrg #
     12  1.1.1.2  mrg # Copyright (c) 2001, 2002, 2006, 2009, 2010, 2011 Free Software Foundation.
     13      1.1  mrg #
     14      1.1  mrg # This file is part of GCC.
     15      1.1  mrg #
     16      1.1  mrg # GCC is free software; you can redistribute it and/or modify
     17      1.1  mrg # it under the terms of the GNU General Public License as published by
     18      1.1  mrg # the Free Software Foundation; either version 3, or (at your option)
     19      1.1  mrg # any later version.
     20      1.1  mrg #
     21      1.1  mrg # GCC is distributed in the hope that it will be useful,
     22      1.1  mrg # but WITHOUT ANY WARRANTY; without even the implied warranty of
     23      1.1  mrg # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     24      1.1  mrg # GNU General Public License for more details.
     25      1.1  mrg #
     26      1.1  mrg # You should have received a copy of the GNU General Public License
     27      1.1  mrg # along with GCC; see the file COPYING3.  If not see
     28      1.1  mrg # <http://www.gnu.org/licenses/>.
     29      1.1  mrg #
     30      1.1  mrg ########################################################################
     31      1.1  mrg 
     32      1.1  mrg ########################################################################
     33      1.1  mrg # Notes
     34      1.1  mrg ########################################################################
     35      1.1  mrg 
     36      1.1  mrg # Here is an example usage of this script, to create a GCC 3.0.2
     37      1.1  mrg # prerelease:
     38      1.1  mrg #
     39      1.1  mrg #   gcc_release -r 3.0.2
     40      1.1  mrg #
     41      1.1  mrg # This script will automatically use the head of the release branch
     42      1.1  mrg # to generate the release.
     43      1.1  mrg 
     44      1.1  mrg ########################################################################
     45      1.1  mrg # Functions
     46      1.1  mrg ########################################################################
     47      1.1  mrg 
     48      1.1  mrg # Issue the error message given by $1 and exit with a non-zero
     49      1.1  mrg # exit code.
     50      1.1  mrg 
     51      1.1  mrg error() {
     52      1.1  mrg     echo "gcc_release: error: $1"
     53      1.1  mrg     exit 1
     54      1.1  mrg }
     55      1.1  mrg 
     56      1.1  mrg # Issue the informational message given by $1.
     57      1.1  mrg 
     58      1.1  mrg inform() {
     59      1.1  mrg     echo "gcc_release: $1"
     60      1.1  mrg }
     61      1.1  mrg 
     62      1.1  mrg # Issue a usage message explaining how to use this script.
     63      1.1  mrg 
     64      1.1  mrg usage() {
     65      1.1  mrg cat <<EOF
     66      1.1  mrg gcc_release -r release [-f] [further options]
     67      1.1  mrg gcc_release -s name:svnbranch [further options]
     68      1.1  mrg 
     69      1.1  mrg Options:
     70      1.1  mrg 
     71      1.1  mrg   -r release           Version of the form X.Y or X.Y.Z.
     72      1.1  mrg   -s name:svnbranch    Create a snapshot, not a real release.
     73      1.1  mrg 
     74      1.1  mrg   -d destination       Local working directory where we will build the release
     75      1.1  mrg                        (default=${HOME}).
     76      1.1  mrg   -f                   Create a final release (and update ChangeLogs,...).
     77      1.1  mrg   -l                   Indicate that we are running on gcc.gnu.org.
     78      1.1  mrg   -p previous-tarball  Location of a previous tarball (to generate diff files).
     79      1.1  mrg   -t tag               Tag to mark the release in SVN.
     80      1.1  mrg   -u username          Username for upload operations.
     81      1.1  mrg EOF
     82      1.1  mrg     exit 1
     83      1.1  mrg }
     84      1.1  mrg 
     85      1.1  mrg # Change to the directory given by $1.
     86      1.1  mrg 
     87      1.1  mrg changedir() {
     88      1.1  mrg   cd $1 || \
     89      1.1  mrg     error "Could not change directory to $1"
     90      1.1  mrg }
     91      1.1  mrg 
     92      1.1  mrg # Build the source tree that will be the basis for the release
     93      1.1  mrg # in ${WORKING_DIRECTORY}/gcc-${RELEASE}.
     94      1.1  mrg 
     95      1.1  mrg build_sources() {
     96      1.1  mrg   # If the WORKING_DIRECTORY already exists, do not risk destroying it.
     97      1.1  mrg   if [ -r ${WORKING_DIRECTORY} ]; then
     98      1.1  mrg     error "\`${WORKING_DIRECTORY}' already exists"
     99      1.1  mrg   fi
    100      1.1  mrg   # Create the WORKING_DIRECTORY.
    101      1.1  mrg   mkdir "${WORKING_DIRECTORY}" \
    102      1.1  mrg     || error "Could not create \`${WORKING_DIRECTORY}'"
    103      1.1  mrg   changedir "${WORKING_DIRECTORY}"
    104      1.1  mrg 
    105      1.1  mrg   # If this is a final release, make sure that the ChangeLogs
    106      1.1  mrg   # and version strings are updated.
    107      1.1  mrg   if [ ${FINAL} -ne 0 ]; then
    108      1.1  mrg     inform "Updating ChangeLogs and version files"
    109      1.1  mrg 
    110      1.1  mrg     ${SVN} -q co "${SVNROOT}/${SVNBRANCH}" "`basename ${SOURCE_DIRECTORY}`" ||\
    111      1.1  mrg            error "Could not check out release sources"
    112      1.1  mrg     for x in `find ${SOURCE_DIRECTORY} -name ChangeLog`; do
    113      1.1  mrg       # Update this ChangeLog file only if it does not yet contain the
    114      1.1  mrg       # entry we are going to add.  (This is a safety net for repeated
    115      1.1  mrg       # runs of this script for the same release.)
    116      1.1  mrg       if ! grep "GCC ${RELEASE} released." ${x} > /dev/null ; then       
    117      1.1  mrg         cat - ${x} > ${x}.new <<EOF
    118      1.1  mrg ${LONG_DATE}  Release Manager
    119      1.1  mrg 
    120      1.1  mrg 	* GCC ${RELEASE} released.
    121      1.1  mrg 
    122      1.1  mrg EOF
    123      1.1  mrg         mv ${x}.new ${x} || \
    124      1.1  mrg             error "Could not update ${x}"
    125      1.1  mrg         (changedir `dirname ${x}` && \
    126      1.1  mrg             ${SVN} -q ci -m 'Mark ChangeLog' `basename ${x}`) || \
    127      1.1  mrg             error "Could not commit ${x}"
    128      1.1  mrg       fi
    129      1.1  mrg     done
    130      1.1  mrg 
    131      1.1  mrg     # Update gcc/DEV-PHASE.
    132      1.1  mrg 
    133      1.1  mrg     [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` = ${RELEASE} ] || \
    134      1.1  mrg     error "Release number ${RELEASE} does not match BASE-VER"
    135      1.1  mrg     (changedir ${SOURCE_DIRECTORY}/gcc && \
    136      1.1  mrg      : > DEV-PHASE && \
    137      1.1  mrg      ${SVN} -q ci -m 'Mark as release' DEV-PHASE) || \
    138      1.1  mrg     error "Could not update DEV-PHASE"
    139      1.1  mrg 
    140      1.1  mrg     # Make sure we tag the sources for a final release.
    141      1.1  mrg     TAG="tags/gcc_`echo ${RELEASE} | tr . _`_release"
    142      1.1  mrg 
    143      1.1  mrg     rm -rf ${SOURCE_DIRECTORY}
    144      1.1  mrg   fi
    145      1.1  mrg 
    146      1.1  mrg   # Tag the sources.
    147      1.1  mrg   if [ -n "${TAG}" ]; then
    148      1.1  mrg     inform "Tagging sources as ${TAG}"
    149      1.1  mrg     # We don't want to overwrite an existing tag.  So, if the tag
    150      1.1  mrg     # already exists, issue an error message; the release manager can
    151      1.1  mrg     # manually remove the tag if appropriate.
    152      1.1  mrg     echo "${SVN} ls ${SVNROOT}/${TAG}/ChangeLog" 
    153      1.1  mrg     if ${SVN} ls "${SVNROOT}/${TAG}/ChangeLog"; then 
    154      1.1  mrg       error "Tag ${TAG} already exists"
    155      1.1  mrg     fi
    156      1.1  mrg     ${SVN} -m "Tagging source as ${TAG}" cp "${SVNROOT}/${SVNBRANCH}" "${SVNROOT}/${TAG}" || \
    157      1.1  mrg       error "Could not tag sources"
    158      1.1  mrg     SVNBRANCH=${TAG}
    159      1.1  mrg   fi
    160      1.1  mrg   SVNREV=`${SVN} info "${SVNROOT}/${SVNBRANCH}"|awk '/Revision:/ {print $2}'`
    161      1.1  mrg 
    162      1.1  mrg   # Export the current sources.
    163      1.1  mrg   inform "Retrieving sources (svn export -r ${SVNREV} ${SVNROOT}/${SVNBRANCH})"
    164      1.1  mrg 
    165      1.1  mrg   ${SVN} -q export -r${SVNREV} "${SVNROOT}/${SVNBRANCH}" "`basename ${SOURCE_DIRECTORY}`" ||\
    166      1.1  mrg     error "Could not retrieve sources"
    167      1.1  mrg 
    168      1.1  mrg   # Run gcc_update on them to set up the timestamps nicely, and (re)write
    169      1.1  mrg   # the LAST_UPDATED file containing the SVN tag/revision used.
    170      1.1  mrg   changedir "gcc-${RELEASE}"
    171      1.1  mrg   contrib/gcc_update --touch
    172      1.1  mrg   echo "Obtained from SVN: ${SVNBRANCH} revision ${SVNREV}" > LAST_UPDATED
    173      1.1  mrg 
    174      1.1  mrg   # For a prerelease or real release, we need to generate additional
    175      1.1  mrg   # files not present in SVN.
    176      1.1  mrg   changedir "${SOURCE_DIRECTORY}"
    177      1.1  mrg   if [ $SNAPSHOT -ne 1 ]; then
    178      1.1  mrg     # Generate the documentation.
    179      1.1  mrg     inform "Building install docs"
    180      1.1  mrg     SOURCEDIR=${SOURCE_DIRECTORY}/gcc/doc
    181      1.1  mrg     DESTDIR=${SOURCE_DIRECTORY}/INSTALL
    182      1.1  mrg     export SOURCEDIR
    183      1.1  mrg     export DESTDIR
    184      1.1  mrg     ${SOURCE_DIRECTORY}/gcc/doc/install.texi2html
    185      1.1  mrg 
    186      1.1  mrg     # Regenerate the NEWS file.
    187      1.1  mrg     contrib/gennews > NEWS || \
    188      1.1  mrg       error "Could not regenerate NEWS files"
    189      1.1  mrg 
    190      1.1  mrg     # Now, we must build the compiler in order to create any generated
    191      1.1  mrg     # files that are supposed to go in the source directory.  This is
    192      1.1  mrg     # also a good sanity check to make sure that the release builds
    193      1.1  mrg     # on at least one platform.
    194      1.1  mrg     inform "Building compiler"
    195      1.1  mrg     OBJECT_DIRECTORY=../objdir
    196      1.1  mrg     contrib/gcc_build -d ${SOURCE_DIRECTORY} -o ${OBJECT_DIRECTORY} \
    197      1.1  mrg       -c "--enable-generated-files-in-srcdir --disable-multilib" build || \
    198      1.1  mrg       error "Could not rebuild GCC"
    199      1.1  mrg   fi
    200      1.1  mrg 
    201      1.1  mrg   # Move message catalogs to source directory.
    202      1.1  mrg   mv ../objdir/gcc/po/*.gmo gcc/po/
    203      1.1  mrg   [ -f libcpp/po/cpplib.pot ] && mv ../objdir/libcpp/po/*.gmo libcpp/po/
    204      1.1  mrg 
    205      1.1  mrg   # Create a "MD5SUMS" file to use for checking the validity of the release.
    206      1.1  mrg   echo \
    207      1.1  mrg "# This file contains the MD5 checksums of the files in the 
    208      1.1  mrg # gcc-"${RELEASE}".tar.bz2 tarball.
    209      1.1  mrg #
    210      1.1  mrg # Besides verifying that all files in the tarball were correctly expanded,
    211      1.1  mrg # it also can be used to determine if any files have changed since the
    212      1.1  mrg # tarball was expanded or to verify that a patchfile was correctly applied.
    213      1.1  mrg #
    214      1.1  mrg # Suggested usage:
    215      1.1  mrg # md5sum -c MD5SUMS | grep -v \"OK$\"
    216      1.1  mrg " > MD5SUMS
    217      1.1  mrg 
    218      1.1  mrg   find . -type f |
    219      1.1  mrg   sed -e 's:^\./::' -e '/MD5SUMS/d' |
    220      1.1  mrg   sort |
    221      1.1  mrg   xargs md5sum >>MD5SUMS
    222      1.1  mrg }
    223      1.1  mrg 
    224      1.1  mrg # Build a single tarfile.  The first argument is the name of the tarfile
    225      1.1  mrg # to build, without any suffixes.  They will be added automatically.  The
    226      1.1  mrg # rest of the arguments are files or directories to include, and possibly
    227      1.1  mrg # other arguments to tar.
    228      1.1  mrg 
    229      1.1  mrg build_tarfile() {
    230      1.1  mrg   # Get the name of the destination tar file.
    231      1.1  mrg   TARFILE="$1.tar.bz2"
    232      1.1  mrg   shift
    233      1.1  mrg 
    234      1.1  mrg   # Build the tar file itself.
    235      1.1  mrg   (${TAR} cf - "$@" | ${BZIP2} > ${TARFILE}) || \
    236      1.1  mrg     error "Could not build tarfile"
    237      1.1  mrg   FILE_LIST="${FILE_LIST} ${TARFILE}"
    238      1.1  mrg }
    239      1.1  mrg 
    240      1.1  mrg # Build the various tar files for the release.
    241      1.1  mrg 
    242      1.1  mrg build_tarfiles() {
    243      1.1  mrg   inform "Building tarfiles"
    244      1.1  mrg 
    245      1.1  mrg   changedir "${WORKING_DIRECTORY}"
    246      1.1  mrg 
    247      1.1  mrg   # The GNU Coding Standards specify that all files should
    248      1.1  mrg   # world readable.
    249      1.1  mrg   chmod -R a+r ${SOURCE_DIRECTORY}
    250      1.1  mrg   # And that all directories have mode 755.
    251      1.1  mrg   find ${SOURCE_DIRECTORY} -type d -exec chmod 755 {} \;
    252      1.1  mrg  
    253      1.1  mrg   # Build one huge tarfile for the entire distribution.
    254      1.1  mrg   build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}`
    255      1.1  mrg }
    256      1.1  mrg 
    257      1.1  mrg # Build .gz files.
    258      1.1  mrg build_gzip() {
    259      1.1  mrg   for f in ${FILE_LIST}; do
    260      1.1  mrg     target=${f%.bz2}.gz
    261      1.1  mrg     (${BZIP2} -d -c $f | ${GZIP} > ${target}) || error "Could not create ${target}"
    262      1.1  mrg   done
    263      1.1  mrg }
    264      1.1  mrg 
    265      1.1  mrg # Build diffs against an old release.
    266      1.1  mrg build_diffs() {
    267      1.1  mrg   old_dir=${1%/*}
    268      1.1  mrg   old_file=${1##*/}
    269      1.1  mrg   old_vers=${old_file%.tar.bz2}
    270      1.1  mrg   old_vers=${old_vers#gcc-}
    271      1.1  mrg   inform "Building diffs against version $old_vers"
    272  1.1.1.2  mrg   for f in gcc; do
    273      1.1  mrg     old_tar=${old_dir}/${f}-${old_vers}.tar.bz2
    274      1.1  mrg     new_tar=${WORKING_DIRECTORY}/${f}-${RELEASE}.tar.bz2
    275      1.1  mrg     if [ ! -e $old_tar ]; then
    276      1.1  mrg       inform "$old_tar not found; not generating diff file"
    277      1.1  mrg     elif [ ! -e $new_tar ]; then
    278      1.1  mrg       inform "$new_tar not found; not generating diff file"
    279      1.1  mrg     else
    280      1.1  mrg       build_diff $old_tar gcc-${old_vers} $new_tar gcc-${RELEASE} \
    281      1.1  mrg         ${f}-${old_vers}-${RELEASE}.diff.bz2
    282      1.1  mrg     fi
    283      1.1  mrg   done
    284      1.1  mrg }
    285      1.1  mrg 
    286      1.1  mrg # Build an individual diff.
    287      1.1  mrg build_diff() {
    288      1.1  mrg   changedir "${WORKING_DIRECTORY}"
    289      1.1  mrg   tmpdir=gccdiff.$$
    290      1.1  mrg   mkdir $tmpdir || error "Could not create directory $tmpdir"
    291      1.1  mrg   changedir $tmpdir
    292      1.1  mrg   (${BZIP2} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs"
    293      1.1  mrg   (${BZIP2} -d -c $3 | ${TAR} xf - ) || error "Could not unpack $3 for diffs"
    294      1.1  mrg   ${DIFF} $2 $4 > ../${5%.bz2}
    295      1.1  mrg   if [ $? -eq 2 ]; then
    296      1.1  mrg     error "Trouble making diffs from $1 to $3"
    297      1.1  mrg   fi
    298      1.1  mrg   ${BZIP2} ../${5%.bz2} || error "Could not generate ../$5"
    299      1.1  mrg   changedir ..
    300      1.1  mrg   rm -rf $tmpdir
    301      1.1  mrg   FILE_LIST="${FILE_LIST} $5"
    302      1.1  mrg }
    303      1.1  mrg 
    304      1.1  mrg # Upload the files to the FTP server.
    305      1.1  mrg upload_files() {
    306      1.1  mrg   inform "Uploading files"
    307      1.1  mrg 
    308      1.1  mrg   changedir "${WORKING_DIRECTORY}"
    309      1.1  mrg 
    310      1.1  mrg   # Make sure the directory exists on the server.
    311      1.1  mrg   if [ $LOCAL -eq 0 ]; then
    312      1.1  mrg     ${SSH} -l ${GCC_USERNAME} ${GCC_HOSTNAME} \
    313      1.1  mrg       mkdir -p "${FTP_PATH}/diffs"
    314      1.1  mrg     UPLOAD_PATH="${GCC_USERNAME}@${GCC_HOSTNAME}:${FTP_PATH}"
    315      1.1  mrg   else
    316      1.1  mrg     mkdir -p "${FTP_PATH}/diffs" \
    317      1.1  mrg       || error "Could not create \`${FTP_PATH}'"
    318      1.1  mrg     UPLOAD_PATH=${FTP_PATH}
    319      1.1  mrg   fi
    320      1.1  mrg 
    321      1.1  mrg   # Then copy files to their respective (sub)directories.
    322      1.1  mrg   for x in gcc*.gz gcc*.bz2; do
    323      1.1  mrg     if [ -e ${x} ]; then
    324      1.1  mrg       # Make sure the file will be readable on the server.
    325      1.1  mrg       chmod a+r ${x}
    326      1.1  mrg       # Copy it.
    327      1.1  mrg       case ${x} in
    328      1.1  mrg         *.diff.*)
    329      1.1  mrg           SUBDIR="diffs/";
    330      1.1  mrg           ;;
    331      1.1  mrg         *)
    332      1.1  mrg           SUBDIR="";
    333      1.1  mrg       esac
    334      1.1  mrg       ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \
    335      1.1  mrg         || error "Could not upload ${x}"
    336      1.1  mrg     fi
    337      1.1  mrg   done
    338      1.1  mrg }
    339      1.1  mrg 
    340      1.1  mrg # Print description if snapshot exists.
    341      1.1  mrg snapshot_print() {
    342      1.1  mrg   if [ -e ${RELEASE}/$1 ]; then
    343  1.1.1.2  mrg     hash=`openssl  md5  ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'`
    344  1.1.1.2  mrg     hash2=`openssl sha1 ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'`
    345  1.1.1.2  mrg 
    346  1.1.1.2  mrg     printf " %-37s%s\n\n  %s\n  %s\n\n" "$1" "$2" "$hash" "$hash2" \
    347  1.1.1.2  mrg       >> ${SNAPSHOT_README}
    348  1.1.1.2  mrg 
    349      1.1  mrg      echo "  <tr><td><a href=\"$1\">$1</a></td>" >> ${SNAPSHOT_INDEX}
    350      1.1  mrg      echo "      <td>$2</td></tr>" >> ${SNAPSHOT_INDEX}
    351      1.1  mrg   fi
    352      1.1  mrg }
    353      1.1  mrg 
    354      1.1  mrg # Announce a snapshot, both on the web and via mail.
    355      1.1  mrg announce_snapshot() {
    356      1.1  mrg   inform "Updating links and READMEs on the FTP server"
    357      1.1  mrg   
    358      1.1  mrg   TEXT_DATE=`date --date=$DATE +%B\ %d,\ %Y`
    359      1.1  mrg   SNAPSHOT_README=${RELEASE}/README
    360      1.1  mrg   SNAPSHOT_INDEX=${RELEASE}/index.html
    361      1.1  mrg 
    362      1.1  mrg   changedir "${SNAPSHOTS_DIR}"
    363      1.1  mrg   echo \
    364      1.1  mrg "Snapshot gcc-"${RELEASE}" is now available on
    365      1.1  mrg   ftp://gcc.gnu.org/pub/gcc/snapshots/"${RELEASE}"/
    366      1.1  mrg and on various mirrors, see http://gcc.gnu.org/mirrors.html for details.
    367      1.1  mrg 
    368      1.1  mrg This snapshot has been generated from the GCC "${BRANCH}" SVN branch
    369      1.1  mrg with the following options: "svn://gcc.gnu.org/svn/gcc/${SVNBRANCH} revision ${SVNREV}"
    370      1.1  mrg 
    371      1.1  mrg You'll find:
    372      1.1  mrg " > ${SNAPSHOT_README}
    373      1.1  mrg 
    374      1.1  mrg   echo \
    375      1.1  mrg "<html>
    376      1.1  mrg 
    377      1.1  mrg <head>
    378      1.1  mrg <title>GCC "${RELEASE}" Snapshot</title>
    379      1.1  mrg </head>
    380      1.1  mrg 
    381      1.1  mrg <body>
    382      1.1  mrg <h1>GCC "${RELEASE}" Snapshot</h1>
    383      1.1  mrg 
    384      1.1  mrg <p>The <a href =\"http://gcc.gnu.org/\">GCC Project</a> makes
    385      1.1  mrg periodic snapshots of the GCC source tree available to the public
    386      1.1  mrg for testing purposes.</p>
    387      1.1  mrg 	
    388      1.1  mrg <p>If you are planning to download and use one of our snapshots, then
    389      1.1  mrg we highly recommend you join the GCC developers list.  Details for
    390      1.1  mrg how to sign up can be found on the GCC project home page.</p>
    391      1.1  mrg 
    392      1.1  mrg <p>This snapshot has been generated from the GCC "${BRANCH}" SVN branch
    393      1.1  mrg with the following options: <code>"svn://gcc.gnu.org/svn/gcc/${SVNBRANCH} revision ${SVNREV}"</code></p>
    394      1.1  mrg 
    395      1.1  mrg <table>" > ${SNAPSHOT_INDEX}
    396      1.1  mrg        
    397  1.1.1.2  mrg   snapshot_print gcc-${RELEASE}.tar.bz2 "Complete GCC"
    398      1.1  mrg 
    399      1.1  mrg   echo \
    400      1.1  mrg "Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the diffs/ subdirectory.
    401      1.1  mrg 
    402      1.1  mrg When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
    403      1.1  mrg link is updated and a message is sent to the gcc list.  Please do not use
    404      1.1  mrg a snapshot before it has been announced that way." >> ${SNAPSHOT_README}
    405      1.1  mrg 
    406      1.1  mrg   echo \
    407      1.1  mrg "</table>
    408      1.1  mrg <p>Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the
    409      1.1  mrg <a href=\"diffs/\">diffs/ subdirectory</a>.</p>
    410      1.1  mrg 
    411      1.1  mrg <p>When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
    412      1.1  mrg link is updated and a message is sent to the gcc list.  Please do not use
    413      1.1  mrg a snapshot before it has been announced that way.</p>
    414      1.1  mrg 
    415      1.1  mrg <hr />
    416      1.1  mrg 
    417      1.1  mrg <address>
    418      1.1  mrg <a href=\"mailto:gcc (at] gcc.gnu.org\">gcc (at] gcc.gnu.org</a>
    419      1.1  mrg <br />
    420      1.1  mrg Last modified "${TEXT_DATE}"
    421      1.1  mrg </address>
    422      1.1  mrg </body>
    423      1.1  mrg 
    424      1.1  mrg </html>" >> ${SNAPSHOT_INDEX}
    425      1.1  mrg 
    426      1.1  mrg   rm -f LATEST-${BRANCH}
    427      1.1  mrg   ln -s ${RELEASE} LATEST-${BRANCH}
    428      1.1  mrg 
    429      1.1  mrg   inform "Sending mail"
    430      1.1  mrg 
    431      1.1  mrg   export QMAILHOST=gcc.gnu.org
    432      1.1  mrg   mail -s "gcc-${RELEASE} is now available" gcc@gcc.gnu.org < ${SNAPSHOT_README}
    433      1.1  mrg }
    434      1.1  mrg 
    435      1.1  mrg ########################################################################
    436      1.1  mrg # Initialization
    437      1.1  mrg ########################################################################
    438      1.1  mrg 
    439      1.1  mrg LC_ALL=C
    440      1.1  mrg export LC_ALL
    441      1.1  mrg 
    442      1.1  mrg # Today's date.
    443      1.1  mrg DATE=`date "+%Y%m%d"`
    444      1.1  mrg LONG_DATE=`date "+%Y-%m-%d"`
    445      1.1  mrg 
    446      1.1  mrg SVN=${SVN:-svn}
    447      1.1  mrg # The CVS server containing the GCC repository.
    448      1.1  mrg SVN_SERVER="gcc.gnu.org"
    449      1.1  mrg # The path to the repository on that server.
    450      1.1  mrg SVN_REPOSITORY="/svn/gcc"
    451      1.1  mrg # The username to use when connecting to the server.
    452      1.1  mrg SVN_USERNAME="${USER}"
    453      1.1  mrg 
    454      1.1  mrg # The machine to which files will be uploaded.
    455      1.1  mrg GCC_HOSTNAME="gcc.gnu.org"
    456      1.1  mrg # The name of the account on the machine to which files are uploaded.
    457      1.1  mrg GCC_USERNAME="gccadmin"
    458      1.1  mrg # The directory in which the files will be placed (do not use ~user syntax).
    459      1.1  mrg FTP_PATH=/var/ftp/pub/gcc
    460      1.1  mrg # The directory in which snapshots will be placed.
    461      1.1  mrg SNAPSHOTS_DIR=${FTP_PATH}/snapshots
    462      1.1  mrg 
    463      1.1  mrg # The major number for the release.  For release `3.0.2' this would be 
    464      1.1  mrg # `3'
    465      1.1  mrg RELEASE_MAJOR=""
    466      1.1  mrg # The minor number for the release.  For release `3.0.2' this would be
    467      1.1  mrg # `0'.
    468      1.1  mrg RELEASE_MINOR=""
    469      1.1  mrg # The revision number for the release.  For release `3.0.2' this would
    470      1.1  mrg # be `2'.
    471      1.1  mrg RELEASE_REVISION=""
    472      1.1  mrg # The complete name of the release.
    473      1.1  mrg RELEASE=""
    474      1.1  mrg 
    475      1.1  mrg # The name of the branch from which the release should be made, in a 
    476      1.1  mrg # user-friendly form.
    477      1.1  mrg BRANCH=""
    478      1.1  mrg 
    479      1.1  mrg # The name of the branch from which the release should be made, as used
    480      1.1  mrg # for our version control system.
    481      1.1  mrg SVNBRANCH=""
    482      1.1  mrg 
    483      1.1  mrg # The tag to apply to the sources used for the release.
    484      1.1  mrg TAG=""
    485      1.1  mrg 
    486      1.1  mrg # The old tarballs from which to generate diffs.
    487      1.1  mrg OLD_TARS=""
    488      1.1  mrg 
    489      1.1  mrg # The directory that will be used to construct the release.  The
    490      1.1  mrg # release itself will be placed in a subdirectory of this directory.
    491      1.1  mrg DESTINATION=${HOME}
    492      1.1  mrg # The subdirectory.
    493      1.1  mrg WORKING_DIRECTORY=""
    494      1.1  mrg # The directory that will contain the GCC sources.
    495      1.1  mrg SOURCE_DIRECTORY=""
    496      1.1  mrg 
    497      1.1  mrg # Non-zero if this is the final release, rather than a prerelease.
    498      1.1  mrg FINAL=0
    499      1.1  mrg 
    500      1.1  mrg # Non-zero if we are building a snapshot, and don't build gcc or
    501      1.1  mrg # include generated files.
    502      1.1  mrg SNAPSHOT=0
    503      1.1  mrg 
    504      1.1  mrg # Non-zero if we are running locally on gcc.gnu.org, and use local CVS
    505      1.1  mrg # and copy directly to the FTP directory.
    506      1.1  mrg LOCAL=0
    507      1.1  mrg 
    508      1.1  mrg # Major operation modes.
    509      1.1  mrg MODE_GZIP=0
    510      1.1  mrg MODE_DIFFS=0
    511      1.1  mrg MODE_SOURCES=0
    512      1.1  mrg MODE_TARFILES=0
    513      1.1  mrg MODE_UPLOAD=0
    514      1.1  mrg 
    515      1.1  mrg # List of archive files generated; used to create .gz files from .bz2.
    516      1.1  mrg FILE_LIST=""
    517      1.1  mrg 
    518      1.1  mrg # Programs we use.
    519      1.1  mrg 
    520      1.1  mrg BZIP2="${BZIP2:-bzip2}"
    521      1.1  mrg CVS="${CVS:-cvs -f -Q -z9}"
    522      1.1  mrg DIFF="${DIFF:-diff -Nrcpad}"
    523      1.1  mrg ENV="${ENV:-env}"
    524      1.1  mrg GZIP="${GZIP:-gzip --best}"
    525      1.1  mrg SCP="${SCP:-scp -p}"
    526      1.1  mrg SSH="${SSH:-ssh}"
    527      1.1  mrg TAR="${TAR:-tar}"
    528      1.1  mrg 
    529      1.1  mrg ########################################################################
    530      1.1  mrg # Command Line Processing
    531      1.1  mrg ########################################################################
    532      1.1  mrg 
    533      1.1  mrg # Parse the options.
    534      1.1  mrg while getopts "d:fr:u:t:p:s:l" ARG; do
    535      1.1  mrg     case $ARG in
    536      1.1  mrg     d)    DESTINATION="${OPTARG}";;
    537      1.1  mrg     r)    RELEASE="${OPTARG}";;
    538      1.1  mrg     t)    TAG="${OPTARG}";;
    539      1.1  mrg     u)    SVN_USERNAME="${OPTARG}";;
    540      1.1  mrg     f)    FINAL=1;;
    541      1.1  mrg     s)    SNAPSHOT=1
    542      1.1  mrg           BRANCH=${OPTARG%:*}
    543      1.1  mrg           SVNBRANCH=${OPTARG#*:}
    544      1.1  mrg           ;;
    545      1.1  mrg     l)    LOCAL=1
    546      1.1  mrg 	  SCP=cp
    547      1.1  mrg 	  PATH=~:/usr/local/bin:$PATH;;
    548      1.1  mrg     p)    OLD_TARS="${OLD_TARS} ${OPTARG}"
    549      1.1  mrg           if [ ! -f ${OPTARG} ]; then
    550      1.1  mrg 	    error "-p argument must name a tarball"
    551      1.1  mrg 	  fi;;
    552      1.1  mrg     \?)   usage;;
    553      1.1  mrg     esac
    554      1.1  mrg done
    555      1.1  mrg shift `expr ${OPTIND} - 1`
    556      1.1  mrg 
    557      1.1  mrg # Handle the major modes.
    558      1.1  mrg while [ $# -ne 0 ]; do
    559      1.1  mrg     case $1 in
    560      1.1  mrg     diffs)    MODE_DIFFS=1;;
    561      1.1  mrg     gzip)     MODE_GZIP=1;;
    562      1.1  mrg     sources)  MODE_SOURCES=1;;
    563      1.1  mrg     tarfiles) MODE_TARFILES=1;;
    564      1.1  mrg     upload)   MODE_UPLOAD=1;;
    565      1.1  mrg     all)      MODE_SOURCES=1; MODE_TARFILES=1; MODE_DIFFS=1; MODE_UPLOAD=1;
    566      1.1  mrg               if [ $SNAPSHOT -ne 1 ]; then
    567      1.1  mrg                 # Only for releases and pre-releases.
    568      1.1  mrg                 MODE_GZIP=1;
    569      1.1  mrg               fi
    570      1.1  mrg               ;;
    571      1.1  mrg     *)        error "Unknown mode $1";;
    572      1.1  mrg     esac
    573      1.1  mrg     shift
    574      1.1  mrg done
    575      1.1  mrg 
    576      1.1  mrg # Perform consistency checking.
    577      1.1  mrg if [ ${LOCAL} -eq 0 ] && [ -z ${SVN_USERNAME} ]; then
    578      1.1  mrg   error "No username specified"
    579      1.1  mrg fi
    580      1.1  mrg 
    581      1.1  mrg if [ ! -d ${DESTINATION} ]; then
    582      1.1  mrg   error "\`${DESTINATION}' is not a directory"
    583      1.1  mrg fi
    584      1.1  mrg 
    585      1.1  mrg if [ $SNAPSHOT -eq 0 ]; then
    586      1.1  mrg   if [ -z ${RELEASE} ]; then
    587      1.1  mrg     error "No release number specified"
    588      1.1  mrg   fi
    589      1.1  mrg 
    590      1.1  mrg   # Compute the major and minor release numbers.
    591      1.1  mrg   RELEASE_MAJOR=`echo $RELEASE | awk --assign FS=. '{ print $1; }'`
    592      1.1  mrg   RELEASE_MINOR=`echo $RELEASE | awk --assign FS=. '{ print $2; }'`
    593      1.1  mrg   RELEASE_REVISION=`echo $RELEASE | awk --assign FS=. '{ print $3; }'`
    594      1.1  mrg 
    595      1.1  mrg   if [ -z "${RELEASE_MAJOR}" ] || [ -z "${RELEASE_MINOR}" ]; then
    596      1.1  mrg     error "Release number \`${RELEASE}' is invalid"
    597      1.1  mrg   fi
    598      1.1  mrg 
    599      1.1  mrg   # Compute the full name of the release.
    600      1.1  mrg   if [ -z "${RELEASE_REVISION}" ]; then
    601      1.1  mrg     RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}"
    602      1.1  mrg   else
    603      1.1  mrg     RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}.${RELEASE_REVISION}"
    604      1.1  mrg   fi
    605      1.1  mrg 
    606      1.1  mrg   # Compute the name of the branch, which is based solely on the major
    607      1.1  mrg   # and minor release numbers.
    608      1.1  mrg   SVNBRANCH="branches/gcc-${RELEASE_MAJOR}_${RELEASE_MINOR}-branch"
    609      1.1  mrg 
    610      1.1  mrg   # If this is not a final release, set various parameters accordingly.
    611      1.1  mrg   if [ ${FINAL} -ne 1 ]; then
    612      1.1  mrg     RELEASE="${RELEASE}-RC-${DATE}"
    613      1.1  mrg     FTP_PATH="${SNAPSHOTS_DIR}/${RELEASE}"
    614      1.1  mrg   else
    615      1.1  mrg     FTP_PATH="${FTP_PATH}/releases/gcc-${RELEASE}/"
    616      1.1  mrg   fi
    617      1.1  mrg else
    618      1.1  mrg   RELEASE=${BRANCH}-${DATE}
    619      1.1  mrg   FTP_PATH="${FTP_PATH}/snapshots/${RELEASE}"
    620      1.1  mrg 
    621      1.1  mrg   # If diffs are requested when building locally on gcc.gnu.org, we (usually)
    622      1.1  mrg   # know what the last snapshot date was and take the corresponding tarballs,
    623      1.1  mrg   # unless the user specified tarballs explicitly.
    624      1.1  mrg   if [ $MODE_DIFFS -ne 0 ] && [ $LOCAL -ne 0 ] && [ -z "${OLD_TARS}" ]; then
    625      1.1  mrg     LAST_DATE=`cat ~/.snapshot_date-${BRANCH}`
    626      1.1  mrg     OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.bz2
    627      1.1  mrg   fi
    628      1.1  mrg fi
    629      1.1  mrg 
    630      1.1  mrg # Compute the name of the WORKING_DIRECTORY and the SOURCE_DIRECTORY.
    631      1.1  mrg WORKING_DIRECTORY="${DESTINATION}/gcc-${RELEASE}"
    632      1.1  mrg SOURCE_DIRECTORY="${WORKING_DIRECTORY}/gcc-${RELEASE}"
    633      1.1  mrg 
    634      1.1  mrg # Set up SVNROOT.
    635      1.1  mrg if [ $LOCAL -eq 0 ]; then
    636      1.1  mrg     SVNROOT="svn+ssh://${SVN_USERNAME}@${SVN_SERVER}${SVN_REPOSITORY}"
    637      1.1  mrg else
    638      1.1  mrg     SVNROOT="file:///svn/gcc"
    639      1.1  mrg fi
    640      1.1  mrg export SVNROOT
    641      1.1  mrg 
    642      1.1  mrg ########################################################################
    643      1.1  mrg # Main Program
    644      1.1  mrg ########################################################################
    645      1.1  mrg 
    646      1.1  mrg # Set the timezone to UTC
    647      1.1  mrg TZ="UTC0"
    648      1.1  mrg export TZ
    649      1.1  mrg 
    650      1.1  mrg # Build the source directory.
    651      1.1  mrg 
    652      1.1  mrg if [ $MODE_SOURCES -ne 0 ]; then
    653      1.1  mrg   build_sources
    654      1.1  mrg fi
    655      1.1  mrg 
    656      1.1  mrg # Build the tar files.
    657      1.1  mrg 
    658      1.1  mrg if [ $MODE_TARFILES -ne 0 ]; then
    659      1.1  mrg   build_tarfiles
    660      1.1  mrg fi
    661      1.1  mrg 
    662      1.1  mrg # Build diffs
    663      1.1  mrg 
    664      1.1  mrg if [ $MODE_DIFFS -ne 0 ]; then
    665      1.1  mrg   # Possibly build diffs.
    666      1.1  mrg   if [ -n "$OLD_TARS" ]; then
    667      1.1  mrg     for old_tar in $OLD_TARS; do
    668      1.1  mrg       build_diffs $old_tar
    669      1.1  mrg     done
    670      1.1  mrg   fi
    671      1.1  mrg fi
    672      1.1  mrg 
    673      1.1  mrg # Build gzip files
    674      1.1  mrg if [ $MODE_GZIP -ne 0 ]; then
    675      1.1  mrg   build_gzip
    676      1.1  mrg fi
    677      1.1  mrg 
    678      1.1  mrg # Upload them to the FTP server.
    679      1.1  mrg if [ $MODE_UPLOAD -ne 0 ]; then
    680      1.1  mrg   upload_files
    681      1.1  mrg 
    682      1.1  mrg   # For snapshots, make some further updates.
    683      1.1  mrg   if [ $SNAPSHOT -ne 0 ] && [ $LOCAL -ne 0 ]; then
    684      1.1  mrg     announce_snapshot
    685      1.1  mrg 
    686      1.1  mrg     # Update snapshot date file.
    687      1.1  mrg     changedir ~
    688      1.1  mrg     echo $DATE > .snapshot_date-${BRANCH}
    689      1.1  mrg 
    690      1.1  mrg     # Remove working directory
    691      1.1  mrg     rm -rf ${WORKING_DIRECTORY}
    692      1.1  mrg   fi
    693      1.1  mrg fi
    694