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