OSDN Git Service

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