* ggc-zone.c (struct alloc_zone): Add statistics counters.
[official-gcc.git] / maintainer-scripts / gcc_release
blob036c8bf943abb9c4e40e75cda88c341f12c56f51
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 find . -type f |sed -e 's:^\./::' -e '/MD5SUMS/d' |sort |xargs md5sum >MD5SUMS
257 # Buid a single tarfile. The first argument is the name of the name
258 # of the tarfile to build, without any suffixes. They will be added
259 # automatically. The rest of the arguments are the files or
260 # directories to include, and possibly other arguments to tar.
262 build_tarfile() {
263 # Get the name of the destination tar file.
264 TARFILE="$1.tar.bz2"
265 shift
267 # Build the tar file itself.
268 (${TAR} cf - "$@" | ${BZIP2} > ${TARFILE}) || \
269 error "Could not build tarfile"
270 FILE_LIST="${FILE_LIST} ${TARFILE}"
273 # Build a single tarfile if any of the directories listed exist,
274 # but not if none of them do (because that component doesn't exist
275 # on this branch).
276 maybe_build_tarfile() {
277 dest=$1
278 shift
279 dir_exists=0
280 for maybe_dir in "$@"; do
281 if [ -d "$maybe_dir" ]; then
282 dir_exists=1
284 done
285 if [ $dir_exists = 1 ]; then
286 build_tarfile "$dest" "$@"
287 else
288 echo "Not building $dest tarfile"
292 # Build the various tar files for the release.
294 build_tarfiles() {
295 inform "Building tarfiles"
297 changedir "${WORKING_DIRECTORY}"
299 # The GNU Coding Standards specify that all files should
300 # world readable.
301 chmod -R a+r ${SOURCE_DIRECTORY}
302 # And that all directories have mode 777.
303 find ${SOURCE_DIRECTORY} -type d -exec chmod 777 {} \;
305 # Build one huge tarfile for the entire distribution.
306 build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}`
308 # Now, build one for each of the languages.
309 maybe_build_tarfile gcc-ada-${RELEASE} ${ADA_DIRS}
310 maybe_build_tarfile gcc-g++-${RELEASE} ${CPLUSPLUS_DIRS}
311 maybe_build_tarfile gcc-g77-${RELEASE} ${FORTRAN_DIRS}
312 maybe_build_tarfile gcc-fortran-${RELEASE} ${FORTRAN95_DIRS}
313 maybe_build_tarfile gcc-java-${RELEASE} ${JAVA_DIRS}
314 maybe_build_tarfile gcc-objc-${RELEASE} ${OBJECTIVEC_DIRS}
315 maybe_build_tarfile gcc-testsuite-${RELEASE} ${TESTSUITE_DIRS}
317 # The core is everything else.
318 EXCLUDES=""
319 for x in ${ADA_DIRS} ${CPLUSPLUS_DIRS} ${FORTRAN_DIRS} ${FORTRAN95_DIRS}\
320 ${JAVA_DIRS} ${OBJECTIVEC_DIRS} ${TESTSUITE_DIRS}; do
321 EXCLUDES="${EXCLUDES} --exclude $x"
322 done
323 build_tarfile gcc-core-${RELEASE} ${EXCLUDES} \
324 `basename ${SOURCE_DIRECTORY}`
327 # Build .gz files.
328 build_gzip() {
329 for f in ${FILE_LIST}; do
330 target=${f%.bz2}.gz
331 (${BZIP2} -d -c $f | ${GZIP} > ${target}) || error "Could not create ${target}"
332 done
335 # Build diffs against an old release.
336 build_diffs() {
337 old_dir=${1%/*}
338 old_file=${1##*/}
339 old_vers=${old_file%.tar.bz2}
340 old_vers=${old_vers#gcc-}
341 inform "Building diffs against version $old_vers"
342 for f in gcc gcc-ada gcc-g++ gcc-g77 gcc-fortran gcc-java gcc-objc gcc-testsuite gcc-core; do
343 old_tar=${old_dir}/${f}-${old_vers}.tar.bz2
344 new_tar=${WORKING_DIRECTORY}/${f}-${RELEASE}.tar.bz2
345 if [ ! -e $old_tar ]; then
346 inform "$old_tar not found; not generating diff file"
347 elif [ ! -e $new_tar ]; then
348 inform "$new_tar not found; not generating diff file"
349 else
350 build_diff $old_tar gcc-${old_vers} $new_tar gcc-${RELEASE} \
351 ${f}-${old_vers}-${RELEASE}.diff.bz2
353 done
356 # Build an individual diff.
357 build_diff() {
358 changedir "${WORKING_DIRECTORY}"
359 tmpdir=gccdiff.$$
360 mkdir $tmpdir || error "Could not create directory $tmpdir"
361 changedir $tmpdir
362 (${BZIP2} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs"
363 (${BZIP2} -d -c $3 | ${TAR} xf - ) || error "Could not unpack $3 for diffs"
364 ${DIFF} $2 $4 > ../${5%.bz2}
365 if [ $? -eq 2 ]; then
366 error "Trouble making diffs from $1 to $3"
368 ${BZIP2} ../${5%.bz2} || error "Could not generate ../$5"
369 changedir ..
370 rm -rf $tmpdir
371 FILE_LIST="${FILE_LIST} $5"
374 # Upload the files to the FTP server.
375 upload_files() {
376 inform "Uploading files"
378 changedir "${WORKING_DIRECTORY}"
380 # Make sure the directory exists on the server.
381 if [ $LOCAL -eq 0 ]; then
382 ${SSH} -l ${GCC_USERNAME} ${GCC_HOSTNAME} \
383 mkdir -p "${FTP_PATH}/diffs"
384 UPLOAD_PATH="${GCC_USERNAME}@${GCC_HOSTNAME}:${FTP_PATH}"
385 else
386 mkdir -p "${FTP_PATH}/diffs" \
387 || error "Could not create \`${FTP_PATH}'"
388 UPLOAD_PATH=${FTP_PATH}
391 # Then copy files to their respective (sub)directories.
392 for x in gcc*.gz gcc*.bz2; do
393 if [ -e ${x} ]; then
394 # Make sure the file will be readable on the server.
395 chmod a+r ${x}
396 # Copy it.
397 case ${x} in
398 *.diff.*)
399 SUBDIR="diffs/";
402 SUBDIR="";
403 esac
404 ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \
405 || error "Could not upload ${x}"
407 done
410 #Print description if snapshot exists
411 snapshot_print() {
412 if [ -e ${RELEASE}/$1 ]; then
413 printf "%-38s%s\n\n" "$1" "$2" >> ${SNAPSHOT_README}
414 echo " <tr><td><a href=\"$1\">$1</a></td>" >> ${SNAPSHOT_INDEX}
415 echo " <td>$2</td></tr>" >> ${SNAPSHOT_INDEX}
419 # Announce a snapshot, both on the web and via mail.
420 announce_snapshot() {
421 inform "Updating links and READMEs on the FTP server"
423 TEXT_DATE=`date --date=$DATE +%B\ %d,\ %Y`
424 SNAPSHOT_README=${RELEASE}/README
425 SNAPSHOT_INDEX=${RELEASE}/index.html
427 changedir "${SNAPSHOTS_DIR}"
428 echo \
429 "Snapshot gcc-"${RELEASE}" is now available on
430 ftp://gcc.gnu.org/pub/gcc/snapshots/"${RELEASE}"/
431 and on various mirrors, see http://gcc.gnu.org/mirrors.html for details.
433 This snapshot has been generated from the GCC "${BRANCH}" CVS branch
434 with the following options: "${EXPORTTAG} ${EXPORTDATE}"
436 You'll find:
437 " > ${SNAPSHOT_README}
439 echo \
440 "<html>
442 <head>
443 <title>GCC "${RELEASE}" Snapshot</title>
444 </head>
446 <body>
447 <h1>GCC "${RELEASE}" Snapshot</h1>
449 <p>The <a href =\"http://gcc.gnu.org/\">GCC Project</a> makes
450 periodic snapshots of the GCC source tree available to the public
451 for testing purposes.</p>
453 <p>If you are planning to download and use one of our snapshots, then
454 we highly recommend you join the GCC developers list. Details for
455 how to sign up can be found on the GCC project home page.</p>
457 <p>This snapshot has been generated from the GCC "${BRANCH}" CVS branch
458 with the following options: <code>"${EXPORTTAG} ${EXPORTDATE}"</code></p>
460 <table>" > ${SNAPSHOT_INDEX}
462 snapshot_print gcc-${RELEASE}.tar.bz2 "Complete GCC (includes all of below)"
463 snapshot_print gcc-core-${RELEASE}.tar.bz2 "C front end and core compiler"
464 snapshot_print gcc-ada-${RELEASE}.tar.bz2 "Ada front end and runtime"
465 snapshot_print gcc-fortran-${RELEASE}.tar.bz2 "Fortran front end and runtime"
466 snapshot_print gcc-g++-${RELEASE}.tar.bz2 "C++ front end and runtime"
467 snapshot_print gcc-g77-${RELEASE}.tar.bz2 "Fortran 77 front end and runtime"
468 snapshot_print gcc-java-${RELEASE}.tar.bz2 "Java front end and runtime"
469 snapshot_print gcc-objc-${RELEASE}.tar.bz2 "Objective-C front end and runtime"
470 snapshot_print gcc-testsuite-${RELEASE}.tar.bz2 "The GCC testsuite"
472 echo \
473 "Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the diffs/ subdirectory.
475 When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
476 link is updated and a message is sent to the gcc list. Please do not use
477 a snapshot before it has been announced that way." >> ${SNAPSHOT_README}
479 echo \
480 "</table>
481 <p>Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the
482 <a href=\"diffs/\">diffs/ subdirectory</a>.</p>
484 <p>When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
485 link is updated and a message is sent to the gcc list. Please do not use
486 a snapshot before it has been announced that way.</p>
488 <hr />
490 <address>
491 <a href=\"mailto:gcc@gcc.gnu.org\">gcc@gcc.gnu.org</a>
492 <br />
493 Last modified "${TEXT_DATE}"
494 </address>
495 </body>
497 </html>" >> ${SNAPSHOT_INDEX}
499 rm -f LATEST-${BRANCH}
500 ln -s ${RELEASE} LATEST-${BRANCH}
502 inform "Sending mail"
504 export QMAILHOST=gcc.gnu.org
505 mail -s "gcc-${RELEASE} is now available" gcc@gcc.gnu.org < ${SNAPSHOT_README}
508 ########################################################################
509 # Initialization
510 ########################################################################
512 # Today's date.
513 DATE=`date "+%Y%m%d"`
514 LONG_DATE=`date "+%Y-%m-%d"`
516 # The CVS server containing the GCC repository.
517 CVS_SERVER="gcc.gnu.org"
518 # The path to the repository on that server.
519 CVS_REPOSITORY="/cvs/gcc"
520 # The CVS protocol to use.
521 CVS_PROTOCOL="ext"
522 # The username to use when connecting to the server.
523 CVS_USERNAME="${USER}"
525 # The machine to which files will be uploaded.
526 GCC_HOSTNAME="gcc.gnu.org"
527 # The name of the account on the machine to which files are uploaded.
528 GCC_USERNAME="gccadmin"
529 # The directory in which the files will be placed (do not use ~user syntax).
530 FTP_PATH=/var/ftp/pub/gcc
531 # The directory in which snapshots will be placed.
532 SNAPSHOTS_DIR=${FTP_PATH}/snapshots
534 # The major number for the release. For release `3.0.2' this would be
535 # `3'
536 RELEASE_MAJOR=""
537 # The minor number for the release. For release `3.0.2' this would be
538 # `0'.
539 RELEASE_MINOR=""
540 # The revision number for the release. For release `3.0.2' this would
541 # be `2'.
542 RELEASE_REVISION=""
543 # The complete name of the release.
544 RELEASE=""
546 # The name of the branch from which the release should be made, in a
547 # user-friendly form.
548 BRANCH=""
550 # The name of the branch from which the release should be made, as used
551 # for our version control system.
552 CVSBRANCH=""
554 # The tag to apply to the sources used for the release.
555 TAG=""
557 # The old tarballs from which to generate diffs.
558 OLD_TARS=""
560 # The directory that will be used to construct the release. The
561 # release itself will be placed in a subdirectory of this diretory.
562 DESTINATION=${HOME}
563 # The subdirectory.
564 WORKING_DIRECTORY=""
565 # The directory that will contain the GCC sources.
566 SOURCE_DIRECTORY=""
568 # The directories that should be part of the various language-specific
569 # tar files. These are all relative to the top of the source tree.
570 ADA_DIRS="gcc/ada libada"
571 CPLUSPLUS_DIRS="gcc/cp libstdc++-v3"
572 FORTRAN_DIRS="gcc/f libf2c"
573 FORTRAN95_DIRS="gcc/fortran libgfortran"
574 JAVA_DIRS="gcc/java libjava libffi fastjar zlib boehm-gc"
575 OBJECTIVEC_DIRS="gcc/objc libobjc"
576 TESTSUITE_DIRS="gcc/testsuite"
578 # Non-zero if this is the final release, rather than a prerelease.
579 FINAL=0
581 # Non-zero if we are building a snapshot, and don't build gcc or
582 # include generated files.
583 SNAPSHOT=0
585 # Non-zero if we are running locally on gcc.gnu.org, and use local CVS
586 # and copy directly to the FTP directory.
587 LOCAL=0
589 # Major operation modes.
590 MODE_GZIP=0
591 MODE_DIFFS=0
592 MODE_SOURCES=0
593 MODE_TARFILES=0
594 MODE_UPLOAD=0
596 # List of archive files generated; used to create .gz files from .bz2.
597 FILE_LIST=""
599 # Programs we use.
601 BZIP2="${BZIP2:-bzip2}"
602 CVS="${CVS:-cvs -f -Q -z9}"
603 DIFF="${DIFF:-diff -Nrcpad}"
604 ENV="${ENV:-env}"
605 GZIP="${GZIP:-gzip --best}"
606 SCP="${SCP:-scp -p}"
607 SSH="${SSH:-ssh}"
608 TAR="${TAR:-tar}"
610 ########################################################################
611 # Command Line Processing
612 ########################################################################
614 # Parse the options.
615 while getopts "d:fr:u:t:p:s:l" ARG; do
616 case $ARG in
617 d) DESTINATION="${OPTARG}";;
618 r) RELEASE="${OPTARG}";;
619 t) TAG="${OPTARG}";;
620 u) CVS_USERNAME="${OPTARG}";;
621 f) FINAL=1;;
622 s) SNAPSHOT=1
623 BRANCH=${OPTARG%:*}
624 CVSBRANCH=${OPTARG#*:}
626 l) LOCAL=1
627 SCP=cp
628 PATH=~:/usr/local/bin:$PATH;;
629 p) OLD_TARS="${OLD_TARS} ${OPTARG}"
630 if [ ! -f ${OPTARG} ]; then
631 error "-p argument must name a tarball"
632 fi;;
633 \?) usage;;
634 esac
635 done
636 shift `expr ${OPTIND} - 1`
638 # Handle the major modes.
639 while [ $# -ne 0 ]; do
640 case $1 in
641 diffs) MODE_DIFFS=1;;
642 gzip) MODE_GZIP=1;;
643 sources) MODE_SOURCES=1;;
644 tarfiles) MODE_TARFILES=1;;
645 upload) MODE_UPLOAD=1;;
646 all) MODE_SOURCES=1; MODE_TARFILES=1; MODE_DIFFS=1; MODE_UPLOAD=1;
647 if [ $SNAPSHOT -ne 1 ]; then
648 # Only for releases and pre-releases.
649 MODE_GZIP=1;
652 *) error "Unknown mode $1";;
653 esac
654 shift
655 done
657 # Perform consistency checking.
658 if [ ${LOCAL} -eq 0 ] && [ -z ${CVS_USERNAME} ]; then
659 error "No username specified"
662 if [ ! -d ${DESTINATION} ]; then
663 error "\`${DESTINATION}' is not a directory"
666 if [ $SNAPSHOT -eq 0 ]; then
667 if [ -z ${RELEASE} ]; then
668 error "No release number specified"
671 # Compute the major and minor release numbers.
672 RELEASE_MAJOR=`echo $RELEASE | awk --assign FS=. '{ print $1; }'`
673 RELEASE_MINOR=`echo $RELEASE | awk --assign FS=. '{ print $2; }'`
674 RELEASE_REVISION=`echo $RELEASE | awk --assign FS=. '{ print $3; }'`
676 if [ -z "${RELEASE_MAJOR}" ] || [ -z "${RELEASE_MINOR}" ]; then
677 error "Release number \`${RELEASE}' is invalid"
680 # Compute the full name of the release.
681 if [ -z "${RELEASE_REVISION}" ]; then
682 RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}"
683 else
684 RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}.${RELEASE_REVISION}"
687 # Compute the name of the branch, which is based solely on the major
688 # and minor release numbers.
689 CVSBRANCH="gcc-${RELEASE_MAJOR}_${RELEASE_MINOR}-branch"
691 # If this is not a final release, set various parameters acordingly.
692 if [ ${FINAL} -ne 1 ]; then
693 RELEASE="${RELEASE}-${DATE}"
694 FTP_PATH="${FTP_PATH}/prerelease-${RELEASE}/"
695 else
696 FTP_PATH="${FTP_PATH}/releases/gcc-${RELEASE}/"
698 else
699 RELEASE=${BRANCH}-${DATE}
700 FTP_PATH="${FTP_PATH}/snapshots/${RELEASE}"
701 if [ ${CVSBRANCH} != "HEAD" ]; then
702 TAG=gcc-ss-`echo ${RELEASE} | tr '.' '_'`
705 # If diffs are requested when building locally on gcc.gnu.org, we (usually)
706 # know what the last snapshot date was and take the corresponding tarballs,
707 # unless the user specified tarballs explictly.
708 if [ $MODE_DIFFS -ne 0 ] && [ $LOCAL -ne 0 ] && [ -z "${OLD_TARS}" ]; then
709 LAST_DATE=`cat ~/.snapshot_date-${BRANCH}`
710 OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.bz2
714 # Compute the name of the WORKING_DIRECTORY and the SOURCE_DIRECTORY.
715 WORKING_DIRECTORY="${DESTINATION}/gcc-${RELEASE}"
716 SOURCE_DIRECTORY="${WORKING_DIRECTORY}/gcc-${RELEASE}"
718 # Recompute the names of all the language-specific directories,
719 # relative to the WORKING_DIRECTORY.
720 ADA_DIRS=`adjust_dirs ${ADA_DIRS}`
721 CPLUSPLUS_DIRS=`adjust_dirs ${CPLUSPLUS_DIRS}`
722 FORTRAN_DIRS=`adjust_dirs ${FORTRAN_DIRS}`
723 FORTRAN95_DIRS=`adjust_dirs ${FORTRAN95_DIRS}`
724 JAVA_DIRS=`adjust_dirs ${JAVA_DIRS}`
725 OBJECTIVEC_DIRS=`adjust_dirs ${OBJECTIVEC_DIRS}`
726 TESTSUITE_DIRS=`adjust_dirs ${TESTSUITE_DIRS}`
728 # Set up CVSROOT.
729 if [ $LOCAL -eq 0 ]; then
730 CVSROOT=":${CVS_PROTOCOL}:${CVS_USERNAME}@"
731 CVSROOT="${CVSROOT}${CVS_SERVER}:${CVS_REPOSITORY}"
732 else
733 CVSROOT="${CVS_REPOSITORY}"
735 export CVSROOT
737 ########################################################################
738 # Main Program
739 ########################################################################
741 # Set the timezone to UTC
742 TZ="UTC0"
743 export TZ
745 # Build the source directory.
747 if [ $MODE_SOURCES -ne 0 ]; then
748 build_sources
751 # Build the tar files.
753 if [ $MODE_TARFILES -ne 0 ]; then
754 build_tarfiles
757 # Build diffs
759 if [ $MODE_DIFFS -ne 0 ]; then
760 # Possibly build diffs.
761 if [ -n "$OLD_TARS" ]; then
762 for old_tar in $OLD_TARS; do
763 build_diffs $old_tar
764 done
768 # Build gzip files
769 if [ $MODE_GZIP -ne 0 ]; then
770 build_gzip
773 # Upload them to the FTP server.
775 if [ $MODE_UPLOAD -ne 0 ]; then
776 upload_files
778 # For snapshots, make some further updates.
779 if [ $SNAPSHOT -ne 0 ] && [ $LOCAL -ne 0 ]; then
780 announce_snapshot
782 # Update snapshot date file.
783 changedir ~
784 echo $DATE > .snapshot_date-${BRANCH}
786 # Remove working directory
787 rm -rf ${WORKING_DIRECTORY}