OSDN Git Service

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