OSDN Git Service

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