* final.c (final_scan_insn): Don't remove no-op instructions.
[official-gcc.git] / maintainer-scripts / gcc_release
blob51422b99af65636377d00b6e3d5fa7644f2910e1
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, 59 Temple Place - Suite 330,
29 # Boston, MA 02111-1307, 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 # 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"
191 # Export the current sources.
192 inform "Retrieving sources (cvs export ${EXPORTTAG} ${EXPORTDATE} gcc)"
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"
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
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
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
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
244 # Regenerate the NEWS file.
245 contrib/gennews > NEWS || \
246 error "Could not regenerate NEWS files"
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"
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/
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.
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.
272 # Suggested usage:
273 # md5sum -c MD5SUMS | grep -v \"OK$\"
274 " > MD5SUMS
276 find . -type f |
277 sed -e 's:^\./::' -e '/MD5SUMS/d' |
278 sort |
279 xargs md5sum >>MD5SUMS
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.
287 build_tarfile() {
288 # Get the name of the destination tar file.
289 TARFILE="$1.tar.bz2"
290 shift
292 # Build the tar file itself.
293 (${TAR} cf - "$@" | ${BZIP2} > ${TARFILE}) || \
294 error "Could not build tarfile"
295 FILE_LIST="${FILE_LIST} ${TARFILE}"
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
309 done
310 if [ $dir_exists = 1 ]; then
311 build_tarfile "$dest" "$@"
312 else
313 echo "Not building $dest tarfile"
317 # Build the various tar files for the release.
319 build_tarfiles() {
320 inform "Building tarfiles"
322 changedir "${WORKING_DIRECTORY}"
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 {} \;
330 # Build one huge tarfile for the entire distribution.
331 build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}`
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}
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}`
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
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
378 done
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"
393 ${BZIP2} ../${5%.bz2} || error "Could not generate ../$5"
394 changedir ..
395 rm -rf $tmpdir
396 FILE_LIST="${FILE_LIST} $5"
399 # Upload the files to the FTP server.
400 upload_files() {
401 inform "Uploading files"
403 changedir "${WORKING_DIRECTORY}"
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}
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/";
427 SUBDIR="";
428 esac
429 ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \
430 || error "Could not upload ${x}"
432 done
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}
444 # Announce a snapshot, both on the web and via mail.
445 announce_snapshot() {
446 inform "Updating links and READMEs on the FTP server"
448 TEXT_DATE=`date --date=$DATE +%B\ %d,\ %Y`
449 SNAPSHOT_README=${RELEASE}/README
450 SNAPSHOT_INDEX=${RELEASE}/index.html
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.
458 This snapshot has been generated from the GCC "${BRANCH}" CVS branch
459 with the following options: "${EXPORTTAG} ${EXPORTDATE}"
461 You'll find:
462 " > ${SNAPSHOT_README}
464 echo \
465 "<html>
467 <head>
468 <title>GCC "${RELEASE}" Snapshot</title>
469 </head>
471 <body>
472 <h1>GCC "${RELEASE}" Snapshot</h1>
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>
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>
482 <p>This snapshot has been generated from the GCC "${BRANCH}" CVS branch
483 with the following options: <code>"${EXPORTTAG} ${EXPORTDATE}"</code></p>
485 <table>" > ${SNAPSHOT_INDEX}
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"
497 echo \
498 "Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the diffs/ subdirectory.
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}
504 echo \
505 "</table>
506 <p>Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the
507 <a href=\"diffs/\">diffs/ subdirectory</a>.</p>
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>
513 <hr />
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>
522 </html>" >> ${SNAPSHOT_INDEX}
524 rm -f LATEST-${BRANCH}
525 ln -s ${RELEASE} LATEST-${BRANCH}
527 inform "Sending mail"
529 export QMAILHOST=gcc.gnu.org
530 mail -s "gcc-${RELEASE} is now available" gcc@gcc.gnu.org < ${SNAPSHOT_README}
533 ########################################################################
534 # Initialization
535 ########################################################################
537 # Today's date.
538 DATE=`date "+%Y%m%d"`
539 LONG_DATE=`date "+%Y-%m-%d"`
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}"
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
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=""
571 # The name of the branch from which the release should be made, in a
572 # user-friendly form.
573 BRANCH=""
575 # The name of the branch from which the release should be made, as used
576 # for our version control system.
577 CVSBRANCH=""
579 # The tag to apply to the sources used for the release.
580 TAG=""
582 # The old tarballs from which to generate diffs.
583 OLD_TARS=""
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=""
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"
603 # Non-zero if this is the final release, rather than a prerelease.
604 FINAL=0
606 # Non-zero if we are building a snapshot, and don't build gcc or
607 # include generated files.
608 SNAPSHOT=0
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
614 # Major operation modes.
615 MODE_GZIP=0
616 MODE_DIFFS=0
617 MODE_SOURCES=0
618 MODE_TARFILES=0
619 MODE_UPLOAD=0
621 # List of archive files generated; used to create .gz files from .bz2.
622 FILE_LIST=""
624 # Programs we use.
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}"
635 ########################################################################
636 # Command Line Processing
637 ########################################################################
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#*:}
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`
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;
677 *) error "Unknown mode $1";;
678 esac
679 shift
680 done
682 # Perform consistency checking.
683 if [ ${LOCAL} -eq 0 ] && [ -z ${CVS_USERNAME} ]; then
684 error "No username specified"
687 if [ ! -d ${DESTINATION} ]; then
688 error "\`${DESTINATION}' is not a directory"
691 if [ $SNAPSHOT -eq 0 ]; then
692 if [ -z ${RELEASE} ]; then
693 error "No release number specified"
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; }'`
701 if [ -z "${RELEASE_MAJOR}" ] || [ -z "${RELEASE_MINOR}" ]; then
702 error "Release number \`${RELEASE}' is invalid"
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}"
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"
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}/"
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 '.' '_'`
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
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}"
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}`
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}"
760 export CVSROOT
762 ########################################################################
763 # Main Program
764 ########################################################################
766 # Set the timezone to UTC
767 TZ="UTC0"
768 export TZ
770 # Build the source directory.
772 if [ $MODE_SOURCES -ne 0 ]; then
773 build_sources
776 # Build the tar files.
778 if [ $MODE_TARFILES -ne 0 ]; then
779 build_tarfiles
782 # Build diffs
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
793 # Build gzip files
794 if [ $MODE_GZIP -ne 0 ]; then
795 build_gzip
798 # Upload them to the FTP server.
800 if [ $MODE_UPLOAD -ne 0 ]; then
801 upload_files
803 # For snapshots, make some further updates.
804 if [ $SNAPSHOT -ne 0 ] && [ $LOCAL -ne 0 ]; then
805 announce_snapshot
807 # Update snapshot date file.
808 changedir ~
809 echo $DATE > .snapshot_date-${BRANCH}
811 # Remove working directory
812 rm -rf ${WORKING_DIRECTORY}