* pa-protos.h (get_deferred_plabel): New prototype.
[official-gcc.git] / maintainer-scripts / gcc_release
blob6458ce1b24ecb0a212ce3b542c49048b778f011b
1 #! /bin/sh
3 ########################################################################
5 # File: gcc_release
6 # Author: Jeffrey Law, Bernd Schmidt, Mark Mitchell
7 # Date: 2001-05-25
9 # Contents:
10 # Script to create a GCC release.
12 # Copyright (c) 2001, 2002 Free Software Foundation.
14 # This file is part of GCC.
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.
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.
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.
31 ########################################################################
33 ########################################################################
34 # Notes
35 ########################################################################
37 # Here is an example usage of this script, to create a GCC 3.0.2
38 # prerelease:
40 # gcc_release -r 3.0.2
42 # This script will automatically use the head of the release branch
43 # to generate the release.
45 ########################################################################
46 # Functions
47 ########################################################################
49 # Issue the error message given by $1 and exit with a non-zero
50 # exit code.
52 error() {
53 echo "gcc_release: error: $1"
54 exit 1
57 # Issue the informational message given by $1.
59 inform() {
60 echo "gcc_release: $1"
63 # Issue a usage message explaining how to use this script.
65 usage() {
66 cat <<EOF
67 gcc_release -r release [-f] [further options]
68 gcc_release -s name:cvsbranch [further options]
70 Options:
72 -r release Version of the form X.Y or X.Y.Z.
73 -s name:cvsbranch Create a snapshot, not a real release.
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
86 # Change to the directory given by $1.
88 changedir() {
89 cd $1 || \
90 error "Could not change directory to $1"
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.
97 adjust_dirs() {
98 for x in $@; do
99 echo `basename ${SOURCE_DIRECTORY}`/$x
100 done
103 # Build the source tree that will be the basis for the release
104 # in ${WORKING_DIRECTORY}/gcc-${RELEASE}.
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"
111 # Create the WORKING_DIRECTORY.
112 mkdir "${WORKING_DIRECTORY}" \
113 || error "Could not create \`${WORKING_DIRECTORY}'"
114 changedir "${WORKING_DIRECTORY}"
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"
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
132 * GCC ${RELEASE} released.
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}"
141 done
143 # Update gcc/DEV-PHASE if it exists, otherwise gcc/version.c.
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
163 # Make sure we tag the sources for a final release.
164 TAG="gcc_`echo ${RELEASE} | tr . _`_release"
166 rm -rf ${SOURCE_DIRECTORY}
169 # Tag the sources.
170 EXPORTDATE=""
171 if [ -n "${TAG}" ]; then
172 inform "Tagging sources as ${TAG}"
173 EXPORTTAG="-r${TAG}"
174 # Try to check out a file using ${TAG}. If the command succeeds,
175 # then the sources have already been tagged. We don't want to
176 # overwrite an existing tag, so we don't want to use the "-F"
177 # option to "cvs rtag" below. So, if the tag already exists,
178 # issue an error message; the release manager can manually remove
179 # the tag if appropriate.
180 if ${CVS} export -d "`basename ${SOURCE_DIRECTORY}`" \
181 "${EXPORTTAG}" gcc/ChangeLog; then
182 error "Tag ${TAG} already exists"
184 ${CVS} rtag -r ${CVSBRANCH} ${TAG} gcc || \
185 error "Could not tag sources"
186 else
187 if [ ${CVSBRANCH} != "HEAD" ]; then
188 EXPORTTAG="-r${CVSBRANCH}"
189 # It does not work to use both "-r" and "-D" with
190 # "cvs export" so EXPORTDATE is not set here.
191 else
192 # HEAD is the default branch, no need to specify it.
193 EXPORTTAG=""
194 EXPORTDATE="-D`date -u +"%Y-%m-%d %H:%M"` UTC"
198 # Export the current sources.
199 inform "Retrieving sources (cvs export ${EXPORTTAG} ${EXPORTDATE} gcc)"
201 if [ -z "${EXPORTTAG}" ]; then
202 ${CVS} export -d "`basename ${SOURCE_DIRECTORY}`" \
203 "${EXPORTDATE}" gcc || \
204 error "Could not retrieve sources"
205 elif [ -z "${EXPORTDATE}" ]; then
206 ${CVS} export -d "`basename ${SOURCE_DIRECTORY}`" \
207 "${EXPORTTAG}" gcc || \
208 error "Could not retrieve sources"
209 else
210 error "Cannot specify -r and -D at the same time"
213 # Run gcc_update on them to set up the timestamps nicely, and (re)write
214 # the LAST_UPDATED file containing the CVS tag/date used.
215 changedir "gcc-${RELEASE}"
216 contrib/gcc_update --touch
217 echo "Obtained from CVS: ${EXPORTTAG} ${EXPORTDATE}" > LAST_UPDATED
219 # Obtain some documentation files from the wwwdocs module.
220 inform "Retrieving HTML documentation"
221 changedir "${WORKING_DIRECTORY}"
222 for x in bugs faq; do
223 (${CVS} export -r HEAD wwwdocs/htdocs/${x}.html && \
224 cp ${WORKING_DIRECTORY}/wwwdocs/htdocs/${x}.html \
225 ${SOURCE_DIRECTORY}) || \
226 error "Could not retrieve ${x}.html"
227 done
229 inform "Generating plain-text documentation from HTML"
230 changedir "${SOURCE_DIRECTORY}"
231 for file in *.html; do
232 newfile=`echo $file | sed -e 's/.html//' | tr "[:lower:]" "[:upper:]"`
233 (${ENV} TERM=vt100 lynx -dump $file \
234 | sed -e "s#file://localhost`/bin/pwd`\(.*\)#http://gcc.gnu.org\1#g" \
235 > $newfile) || \
236 error "Could not generate text-only version of ${file}"
237 done
239 # For a prerelease or real release, we need to generate additional
240 # files not present in CVS.
241 changedir "${SOURCE_DIRECTORY}"
242 if [ $SNAPSHOT -ne 1 ]; then
243 # Generate the documentation.
244 inform "Building install docs"
245 SOURCEDIR=${SOURCE_DIRECTORY}/gcc/doc
246 DESTDIR=${SOURCE_DIRECTORY}/INSTALL
247 export SOURCEDIR
248 export DESTDIR
249 ${SOURCE_DIRECTORY}/gcc/doc/install.texi2html
251 # Regenerate the NEWS file.
252 contrib/gennews > NEWS || \
253 error "Could not regenerate NEWS files"
255 # Now, we must build the compiler in order to create any generated
256 # files that are supposed to go in the source directory. This is
257 # also a good sanity check to make sure that the release builds
258 # on at least one platform.
259 inform "Building compiler"
260 OBJECT_DIRECTORY=../objdir
261 contrib/gcc_build -d ${SOURCE_DIRECTORY} -o ${OBJECT_DIRECTORY} \
262 -c "--enable-generated-files-in-srcdir" build || \
263 error "Could not rebuild GCC"
266 # Move message catalogs to source directory.
267 mv ../objdir/gcc/po/*.gmo gcc/po/
268 [ -f libcpp/po/cpplib.pot ] && mv ../objdir/libcpp/po/*.gmo libcpp/po/
270 # Create a "MD5SUMS" file to use for checking the validity of the release.
271 echo \
272 "# This file contains the MD5 checksums of the files in the
273 # gcc-"${RELEASE}".tar.bz2 tarball.
275 # Besides verifying that all files in the tarball were correctly expanded,
276 # it also can be used to determine if any files have changed since the
277 # tarball was expanded or to verify that a patchfile was correctly applied.
279 # Suggested usage:
280 # md5sum -c MD5SUMS | grep -v \"OK$\"
281 " > MD5SUMS
283 find . -type f |
284 sed -e 's:^\./::' -e '/MD5SUMS/d' |
285 sort |
286 xargs md5sum >>MD5SUMS
289 # Buid a single tarfile. The first argument is the name of the name
290 # of the tarfile to build, without any suffixes. They will be added
291 # automatically. The rest of the arguments are the files or
292 # directories to include, and possibly other arguments to tar.
294 build_tarfile() {
295 # Get the name of the destination tar file.
296 TARFILE="$1.tar.bz2"
297 shift
299 # Build the tar file itself.
300 (${TAR} cf - "$@" | ${BZIP2} > ${TARFILE}) || \
301 error "Could not build tarfile"
302 FILE_LIST="${FILE_LIST} ${TARFILE}"
305 # Build a single tarfile if any of the directories listed exist,
306 # but not if none of them do (because that component doesn't exist
307 # on this branch).
308 maybe_build_tarfile() {
309 dest=$1
310 shift
311 dir_exists=0
312 for maybe_dir in "$@"; do
313 if [ -d "$maybe_dir" ]; then
314 dir_exists=1
316 done
317 if [ $dir_exists = 1 ]; then
318 build_tarfile "$dest" "$@"
319 else
320 echo "Not building $dest tarfile"
324 # Build the various tar files for the release.
326 build_tarfiles() {
327 inform "Building tarfiles"
329 changedir "${WORKING_DIRECTORY}"
331 # The GNU Coding Standards specify that all files should
332 # world readable.
333 chmod -R a+r ${SOURCE_DIRECTORY}
334 # And that all directories have mode 777.
335 find ${SOURCE_DIRECTORY} -type d -exec chmod 777 {} \;
337 # Build one huge tarfile for the entire distribution.
338 build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}`
340 # Now, build one for each of the languages.
341 maybe_build_tarfile gcc-ada-${RELEASE} ${ADA_DIRS}
342 maybe_build_tarfile gcc-g++-${RELEASE} ${CPLUSPLUS_DIRS}
343 maybe_build_tarfile gcc-g77-${RELEASE} ${FORTRAN_DIRS}
344 maybe_build_tarfile gcc-fortran-${RELEASE} ${FORTRAN95_DIRS}
345 maybe_build_tarfile gcc-java-${RELEASE} ${JAVA_DIRS}
346 maybe_build_tarfile gcc-objc-${RELEASE} ${OBJECTIVEC_DIRS}
347 maybe_build_tarfile gcc-testsuite-${RELEASE} ${TESTSUITE_DIRS}
349 # The core is everything else.
350 EXCLUDES=""
351 for x in ${ADA_DIRS} ${CPLUSPLUS_DIRS} ${FORTRAN_DIRS} ${FORTRAN95_DIRS}\
352 ${JAVA_DIRS} ${OBJECTIVEC_DIRS} ${TESTSUITE_DIRS}; do
353 EXCLUDES="${EXCLUDES} --exclude $x"
354 done
355 build_tarfile gcc-core-${RELEASE} ${EXCLUDES} \
356 `basename ${SOURCE_DIRECTORY}`
359 # Build .gz files.
360 build_gzip() {
361 for f in ${FILE_LIST}; do
362 target=${f%.bz2}.gz
363 (${BZIP2} -d -c $f | ${GZIP} > ${target}) || error "Could not create ${target}"
364 done
367 # Build diffs against an old release.
368 build_diffs() {
369 old_dir=${1%/*}
370 old_file=${1##*/}
371 old_vers=${old_file%.tar.bz2}
372 old_vers=${old_vers#gcc-}
373 inform "Building diffs against version $old_vers"
374 for f in gcc gcc-ada gcc-g++ gcc-g77 gcc-fortran gcc-java gcc-objc gcc-testsuite gcc-core; do
375 old_tar=${old_dir}/${f}-${old_vers}.tar.bz2
376 new_tar=${WORKING_DIRECTORY}/${f}-${RELEASE}.tar.bz2
377 if [ ! -e $old_tar ]; then
378 inform "$old_tar not found; not generating diff file"
379 elif [ ! -e $new_tar ]; then
380 inform "$new_tar not found; not generating diff file"
381 else
382 build_diff $old_tar gcc-${old_vers} $new_tar gcc-${RELEASE} \
383 ${f}-${old_vers}-${RELEASE}.diff.bz2
385 done
388 # Build an individual diff.
389 build_diff() {
390 changedir "${WORKING_DIRECTORY}"
391 tmpdir=gccdiff.$$
392 mkdir $tmpdir || error "Could not create directory $tmpdir"
393 changedir $tmpdir
394 (${BZIP2} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs"
395 (${BZIP2} -d -c $3 | ${TAR} xf - ) || error "Could not unpack $3 for diffs"
396 ${DIFF} $2 $4 > ../${5%.bz2}
397 if [ $? -eq 2 ]; then
398 error "Trouble making diffs from $1 to $3"
400 ${BZIP2} ../${5%.bz2} || error "Could not generate ../$5"
401 changedir ..
402 rm -rf $tmpdir
403 FILE_LIST="${FILE_LIST} $5"
406 # Upload the files to the FTP server.
407 upload_files() {
408 inform "Uploading files"
410 changedir "${WORKING_DIRECTORY}"
412 # Make sure the directory exists on the server.
413 if [ $LOCAL -eq 0 ]; then
414 ${SSH} -l ${GCC_USERNAME} ${GCC_HOSTNAME} \
415 mkdir -p "${FTP_PATH}/diffs"
416 UPLOAD_PATH="${GCC_USERNAME}@${GCC_HOSTNAME}:${FTP_PATH}"
417 else
418 mkdir -p "${FTP_PATH}/diffs" \
419 || error "Could not create \`${FTP_PATH}'"
420 UPLOAD_PATH=${FTP_PATH}
423 # Then copy files to their respective (sub)directories.
424 for x in gcc*.gz gcc*.bz2; do
425 if [ -e ${x} ]; then
426 # Make sure the file will be readable on the server.
427 chmod a+r ${x}
428 # Copy it.
429 case ${x} in
430 *.diff.*)
431 SUBDIR="diffs/";
434 SUBDIR="";
435 esac
436 ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \
437 || error "Could not upload ${x}"
439 done
442 #Print description if snapshot exists
443 snapshot_print() {
444 if [ -e ${RELEASE}/$1 ]; then
445 printf "%-38s%s\n\n" "$1" "$2" >> ${SNAPSHOT_README}
446 echo " <tr><td><a href=\"$1\">$1</a></td>" >> ${SNAPSHOT_INDEX}
447 echo " <td>$2</td></tr>" >> ${SNAPSHOT_INDEX}
451 # Announce a snapshot, both on the web and via mail.
452 announce_snapshot() {
453 inform "Updating links and READMEs on the FTP server"
455 TEXT_DATE=`date --date=$DATE +%B\ %d,\ %Y`
456 SNAPSHOT_README=${RELEASE}/README
457 SNAPSHOT_INDEX=${RELEASE}/index.html
459 changedir "${SNAPSHOTS_DIR}"
460 echo \
461 "Snapshot gcc-"${RELEASE}" is now available on
462 ftp://gcc.gnu.org/pub/gcc/snapshots/"${RELEASE}"/
463 and on various mirrors, see http://gcc.gnu.org/mirrors.html for details.
465 This snapshot has been generated from the GCC "${BRANCH}" CVS branch
466 with the following options: "${EXPORTTAG} ${EXPORTDATE}"
468 You'll find:
469 " > ${SNAPSHOT_README}
471 echo \
472 "<html>
474 <head>
475 <title>GCC "${RELEASE}" Snapshot</title>
476 </head>
478 <body>
479 <h1>GCC "${RELEASE}" Snapshot</h1>
481 <p>The <a href =\"http://gcc.gnu.org/\">GCC Project</a> makes
482 periodic snapshots of the GCC source tree available to the public
483 for testing purposes.</p>
485 <p>If you are planning to download and use one of our snapshots, then
486 we highly recommend you join the GCC developers list. Details for
487 how to sign up can be found on the GCC project home page.</p>
489 <p>This snapshot has been generated from the GCC "${BRANCH}" CVS branch
490 with the following options: <code>"${EXPORTTAG} ${EXPORTDATE}"</code></p>
492 <table>" > ${SNAPSHOT_INDEX}
494 snapshot_print gcc-${RELEASE}.tar.bz2 "Complete GCC (includes all of below)"
495 snapshot_print gcc-core-${RELEASE}.tar.bz2 "C front end and core compiler"
496 snapshot_print gcc-ada-${RELEASE}.tar.bz2 "Ada front end and runtime"
497 snapshot_print gcc-fortran-${RELEASE}.tar.bz2 "Fortran front end and runtime"
498 snapshot_print gcc-g++-${RELEASE}.tar.bz2 "C++ front end and runtime"
499 snapshot_print gcc-g77-${RELEASE}.tar.bz2 "Fortran 77 front end and runtime"
500 snapshot_print gcc-java-${RELEASE}.tar.bz2 "Java front end and runtime"
501 snapshot_print gcc-objc-${RELEASE}.tar.bz2 "Objective-C front end and runtime"
502 snapshot_print gcc-testsuite-${RELEASE}.tar.bz2 "The GCC testsuite"
504 echo \
505 "Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the diffs/ subdirectory.
507 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." >> ${SNAPSHOT_README}
511 echo \
512 "</table>
513 <p>Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the
514 <a href=\"diffs/\">diffs/ subdirectory</a>.</p>
516 <p>When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
517 link is updated and a message is sent to the gcc list. Please do not use
518 a snapshot before it has been announced that way.</p>
520 <hr />
522 <address>
523 <a href=\"mailto:gcc@gcc.gnu.org\">gcc@gcc.gnu.org</a>
524 <br />
525 Last modified "${TEXT_DATE}"
526 </address>
527 </body>
529 </html>" >> ${SNAPSHOT_INDEX}
531 rm -f LATEST-${BRANCH}
532 ln -s ${RELEASE} LATEST-${BRANCH}
534 inform "Sending mail"
536 export QMAILHOST=gcc.gnu.org
537 mail -s "gcc-${RELEASE} is now available" gcc@gcc.gnu.org < ${SNAPSHOT_README}
540 ########################################################################
541 # Initialization
542 ########################################################################
544 # Today's date.
545 DATE=`date "+%Y%m%d"`
546 LONG_DATE=`date "+%Y-%m-%d"`
548 # The CVS server containing the GCC repository.
549 CVS_SERVER="gcc.gnu.org"
550 # The path to the repository on that server.
551 CVS_REPOSITORY="/cvs/gcc"
552 # The CVS protocol to use.
553 CVS_PROTOCOL="ext"
554 # The username to use when connecting to the server.
555 CVS_USERNAME="${USER}"
557 # The machine to which files will be uploaded.
558 GCC_HOSTNAME="gcc.gnu.org"
559 # The name of the account on the machine to which files are uploaded.
560 GCC_USERNAME="gccadmin"
561 # The directory in which the files will be placed (do not use ~user syntax).
562 FTP_PATH=/var/ftp/pub/gcc
563 # The directory in which snapshots will be placed.
564 SNAPSHOTS_DIR=${FTP_PATH}/snapshots
566 # The major number for the release. For release `3.0.2' this would be
567 # `3'
568 RELEASE_MAJOR=""
569 # The minor number for the release. For release `3.0.2' this would be
570 # `0'.
571 RELEASE_MINOR=""
572 # The revision number for the release. For release `3.0.2' this would
573 # be `2'.
574 RELEASE_REVISION=""
575 # The complete name of the release.
576 RELEASE=""
578 # The name of the branch from which the release should be made, in a
579 # user-friendly form.
580 BRANCH=""
582 # The name of the branch from which the release should be made, as used
583 # for our version control system.
584 CVSBRANCH=""
586 # The tag to apply to the sources used for the release.
587 TAG=""
589 # The old tarballs from which to generate diffs.
590 OLD_TARS=""
592 # The directory that will be used to construct the release. The
593 # release itself will be placed in a subdirectory of this diretory.
594 DESTINATION=${HOME}
595 # The subdirectory.
596 WORKING_DIRECTORY=""
597 # The directory that will contain the GCC sources.
598 SOURCE_DIRECTORY=""
600 # The directories that should be part of the various language-specific
601 # tar files. These are all relative to the top of the source tree.
602 ADA_DIRS="gcc/ada libada gnattools"
603 CPLUSPLUS_DIRS="gcc/cp libstdc++-v3"
604 FORTRAN_DIRS="gcc/f libf2c"
605 FORTRAN95_DIRS="gcc/fortran libgfortran"
606 JAVA_DIRS="gcc/java libjava libffi fastjar zlib boehm-gc"
607 OBJECTIVEC_DIRS="gcc/objc libobjc"
608 TESTSUITE_DIRS="gcc/testsuite"
610 # Non-zero if this is the final release, rather than a prerelease.
611 FINAL=0
613 # Non-zero if we are building a snapshot, and don't build gcc or
614 # include generated files.
615 SNAPSHOT=0
617 # Non-zero if we are running locally on gcc.gnu.org, and use local CVS
618 # and copy directly to the FTP directory.
619 LOCAL=0
621 # Major operation modes.
622 MODE_GZIP=0
623 MODE_DIFFS=0
624 MODE_SOURCES=0
625 MODE_TARFILES=0
626 MODE_UPLOAD=0
628 # List of archive files generated; used to create .gz files from .bz2.
629 FILE_LIST=""
631 # Programs we use.
633 BZIP2="${BZIP2:-bzip2}"
634 CVS="${CVS:-cvs -f -Q -z9}"
635 DIFF="${DIFF:-diff -Nrcpad}"
636 ENV="${ENV:-env}"
637 GZIP="${GZIP:-gzip --best}"
638 SCP="${SCP:-scp -p}"
639 SSH="${SSH:-ssh}"
640 TAR="${TAR:-tar}"
642 ########################################################################
643 # Command Line Processing
644 ########################################################################
646 # Parse the options.
647 while getopts "d:fr:u:t:p:s:l" ARG; do
648 case $ARG in
649 d) DESTINATION="${OPTARG}";;
650 r) RELEASE="${OPTARG}";;
651 t) TAG="${OPTARG}";;
652 u) CVS_USERNAME="${OPTARG}";;
653 f) FINAL=1;;
654 s) SNAPSHOT=1
655 BRANCH=${OPTARG%:*}
656 CVSBRANCH=${OPTARG#*:}
658 l) LOCAL=1
659 SCP=cp
660 PATH=~:/usr/local/bin:$PATH;;
661 p) OLD_TARS="${OLD_TARS} ${OPTARG}"
662 if [ ! -f ${OPTARG} ]; then
663 error "-p argument must name a tarball"
664 fi;;
665 \?) usage;;
666 esac
667 done
668 shift `expr ${OPTIND} - 1`
670 # Handle the major modes.
671 while [ $# -ne 0 ]; do
672 case $1 in
673 diffs) MODE_DIFFS=1;;
674 gzip) MODE_GZIP=1;;
675 sources) MODE_SOURCES=1;;
676 tarfiles) MODE_TARFILES=1;;
677 upload) MODE_UPLOAD=1;;
678 all) MODE_SOURCES=1; MODE_TARFILES=1; MODE_DIFFS=1; MODE_UPLOAD=1;
679 if [ $SNAPSHOT -ne 1 ]; then
680 # Only for releases and pre-releases.
681 MODE_GZIP=1;
684 *) error "Unknown mode $1";;
685 esac
686 shift
687 done
689 # Perform consistency checking.
690 if [ ${LOCAL} -eq 0 ] && [ -z ${CVS_USERNAME} ]; then
691 error "No username specified"
694 if [ ! -d ${DESTINATION} ]; then
695 error "\`${DESTINATION}' is not a directory"
698 if [ $SNAPSHOT -eq 0 ]; then
699 if [ -z ${RELEASE} ]; then
700 error "No release number specified"
703 # Compute the major and minor release numbers.
704 RELEASE_MAJOR=`echo $RELEASE | awk --assign FS=. '{ print $1; }'`
705 RELEASE_MINOR=`echo $RELEASE | awk --assign FS=. '{ print $2; }'`
706 RELEASE_REVISION=`echo $RELEASE | awk --assign FS=. '{ print $3; }'`
708 if [ -z "${RELEASE_MAJOR}" ] || [ -z "${RELEASE_MINOR}" ]; then
709 error "Release number \`${RELEASE}' is invalid"
712 # Compute the full name of the release.
713 if [ -z "${RELEASE_REVISION}" ]; then
714 RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}"
715 else
716 RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}.${RELEASE_REVISION}"
719 # Compute the name of the branch, which is based solely on the major
720 # and minor release numbers.
721 CVSBRANCH="gcc-${RELEASE_MAJOR}_${RELEASE_MINOR}-branch"
723 # If this is not a final release, set various parameters acordingly.
724 if [ ${FINAL} -ne 1 ]; then
725 RELEASE="${RELEASE}-${DATE}"
726 FTP_PATH="${FTP_PATH}/prerelease-${RELEASE}/"
727 else
728 FTP_PATH="${FTP_PATH}/releases/gcc-${RELEASE}/"
730 else
731 RELEASE=${BRANCH}-${DATE}
732 FTP_PATH="${FTP_PATH}/snapshots/${RELEASE}"
733 if [ ${CVSBRANCH} != "HEAD" ]; then
734 TAG=gcc-ss-`echo ${RELEASE} | tr '.' '_'`
737 # If diffs are requested when building locally on gcc.gnu.org, we (usually)
738 # know what the last snapshot date was and take the corresponding tarballs,
739 # unless the user specified tarballs explictly.
740 if [ $MODE_DIFFS -ne 0 ] && [ $LOCAL -ne 0 ] && [ -z "${OLD_TARS}" ]; then
741 LAST_DATE=`cat ~/.snapshot_date-${BRANCH}`
742 OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.bz2
746 # Compute the name of the WORKING_DIRECTORY and the SOURCE_DIRECTORY.
747 WORKING_DIRECTORY="${DESTINATION}/gcc-${RELEASE}"
748 SOURCE_DIRECTORY="${WORKING_DIRECTORY}/gcc-${RELEASE}"
750 # Recompute the names of all the language-specific directories,
751 # relative to the WORKING_DIRECTORY.
752 ADA_DIRS=`adjust_dirs ${ADA_DIRS}`
753 CPLUSPLUS_DIRS=`adjust_dirs ${CPLUSPLUS_DIRS}`
754 FORTRAN_DIRS=`adjust_dirs ${FORTRAN_DIRS}`
755 FORTRAN95_DIRS=`adjust_dirs ${FORTRAN95_DIRS}`
756 JAVA_DIRS=`adjust_dirs ${JAVA_DIRS}`
757 OBJECTIVEC_DIRS=`adjust_dirs ${OBJECTIVEC_DIRS}`
758 TESTSUITE_DIRS=`adjust_dirs ${TESTSUITE_DIRS}`
760 # Set up CVSROOT.
761 if [ $LOCAL -eq 0 ]; then
762 CVSROOT=":${CVS_PROTOCOL}:${CVS_USERNAME}@"
763 CVSROOT="${CVSROOT}${CVS_SERVER}:${CVS_REPOSITORY}"
764 else
765 CVSROOT="${CVS_REPOSITORY}"
767 export CVSROOT
769 ########################################################################
770 # Main Program
771 ########################################################################
773 # Set the timezone to UTC
774 TZ="UTC0"
775 export TZ
777 # Build the source directory.
779 if [ $MODE_SOURCES -ne 0 ]; then
780 build_sources
783 # Build the tar files.
785 if [ $MODE_TARFILES -ne 0 ]; then
786 build_tarfiles
789 # Build diffs
791 if [ $MODE_DIFFS -ne 0 ]; then
792 # Possibly build diffs.
793 if [ -n "$OLD_TARS" ]; then
794 for old_tar in $OLD_TARS; do
795 build_diffs $old_tar
796 done
800 # Build gzip files
801 if [ $MODE_GZIP -ne 0 ]; then
802 build_gzip
805 # Upload them to the FTP server.
807 if [ $MODE_UPLOAD -ne 0 ]; then
808 upload_files
810 # For snapshots, make some further updates.
811 if [ $SNAPSHOT -ne 0 ] && [ $LOCAL -ne 0 ]; then
812 announce_snapshot
814 # Update snapshot date file.
815 changedir ~
816 echo $DATE > .snapshot_date-${BRANCH}
818 # Remove working directory
819 rm -rf ${WORKING_DIRECTORY}