]> git.ipfire.org Git - thirdparty/gcc.git/blame - maintainer-scripts/gcc_release
(top level)
[thirdparty/gcc.git] / maintainer-scripts / gcc_release
CommitLineData
b4075f6b
JM
1#! /bin/sh
2
3########################################################################
4#
5# File: gcc_release
6# Author: Jeffrey Law, Bernd Schmidt, Mark Mitchell
7# Date: 2001-05-25
8#
9# Contents:
10# Script to create a GCC release.
11#
b8f93352 12# Copyright (c) 2001, 2002 Free Software Foundation.
b4075f6b 13#
567bfee8 14# This file is part of GCC.
b4075f6b 15#
567bfee8 16# GCC is free software; you can redistribute it and/or modify
b4075f6b
JM
17# it under the terms of the GNU General Public License as published by
18# the Free Software Foundation; either version 2, or (at your option)
19# any later version.
20#
567bfee8 21# GCC is distributed in the hope that it will be useful,
b4075f6b
JM
22# but WITHOUT ANY WARRANTY; without even the implied warranty of
23# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24# GNU General Public License for more details.
25#
26# You should have received a copy of the GNU General Public License
567bfee8 27# along with GCC; see the file COPYING. If not, write to
b4075f6b
JM
28# the Free Software Foundation, 59 Temple Place - Suite 330,
29# Boston, MA 02111-1307, USA.
30#
31########################################################################
32
33########################################################################
34# Notes
35########################################################################
36
37# Here is an example usage of this script, to create a GCC 3.0.2
38# prerelease:
39#
40# gcc_release -r 3.0.2
41#
42# This script will automatically use the head of the release branch
43# to generate the release.
44
45########################################################################
46# Functions
47########################################################################
48
49# Issue the error message given by $1 and exit with a non-zero
50# exit code.
51
52error() {
53 echo "gcc_release: error: $1"
54 exit 1
55}
56
57# Issue the informational message given by $1.
58
59inform() {
60 echo "gcc_release: $1"
61}
62
63# Issue a usage message explaining how to use this script.
64
65usage() {
66cat <<EOF
1f9d6256
GP
67gcc_release -r release [-f] [further options]
68gcc_release -s name:cvsbranch [further options]
c627639b
GP
69
70Options:
71
72 -r release Version of the form X.Y or X.Y.Z.
1f9d6256 73 -s name:cvsbranch Create a snapshot, not a real release.
c627639b
GP
74
75 -d destination Local working directory where we will build the release
76 (default=${HOME}).
77 -f Create a final release (and update ChangeLogs,...).
78 -l Indicate that we are running on gcc.gnu.org.
79 -p previous-tarball Location of a previous tarball (to generate diff files).
80 -t tag Tag to mark the release in CVS.
81 -u username Username for upload operations.
b4075f6b
JM
82EOF
83 exit 1
84}
85
86# Change to the directory given by $1.
87
88changedir() {
89 cd $1 || \
90 error "Could not change directory to $1"
91}
92
93# Each of the arguments is a directory name, relative to the top
94# of the source tree. Return another name for that directory, relative
95# to the working directory.
96
97adjust_dirs() {
98 for x in $@; do
99 echo `basename ${SOURCE_DIRECTORY}`/$x
100 done
101}
102
103# Build the source tree that will be the basis for the release
104# in ${WORKING_DIRECTORY}/gcc-${RELEASE}.
105
106build_sources() {
107 # If the WORKING_DIRECTORY already exists, do not risk destroying it.
108 if [ -r ${WORKING_DIRECTORY} ]; then
109 error "\`${WORKING_DIRECTORY}' already exists"
110 fi
111 # Create the WORKING_DIRECTORY.
112 mkdir "${WORKING_DIRECTORY}" \
113 || error "Could not create \`${WORKING_DIRECTORY}'"
114 changedir "${WORKING_DIRECTORY}"
115
116 # If this is a final release, make sure that the ChangeLogs
117 # and version strings are updated.
118 if [ ${FINAL} -ne 0 ]; then
119 inform "Updating ChangeLogs and version files"
120
121 ${CVS} co -d "`basename ${SOURCE_DIRECTORY}`" \
b69cd3cf 122 -r ${CVSBRANCH} gcc || \
b4075f6b
JM
123 error "Could not check out release sources"
124 for x in `find ${SOURCE_DIRECTORY} -name ChangeLog`; do
4494cdde
GP
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
b4075f6b
JM
130${LONG_DATE} Release Manager
131
4494cdde 132 * GCC ${RELEASE} released.
b4075f6b
JM
133
134EOF
4494cdde
GP
135 mv ${x}.new ${x} || \
136 error "Could not update ${x}"
137 (changedir `dirname ${x}` && \
138 ${CVS} ci -m 'Mark ChangeLog' `basename ${x}`) || \
139 error "Could not commit ${x}"
140 fi
b4075f6b
JM
141 done
142
b4f94ac1 143 # Update `gcc/version.c'.
b4075f6b
JM
144 for x in gcc/version.c; do
145 y=`basename ${x}`
146 (changedir `dirname ${SOURCE_DIRECTORY}/${x}` && \
7daaf8fa 147 sed -e 's|version_string\[\] = \".*\"|version_string\[\] = \"'${RELEASE}'\"|g' < ${y} > ${y}.new && \
b4075f6b
JM
148 mv ${y}.new ${y} && \
149 ${CVS} ci -m 'Update version' ${y}) || \
150 error "Could not update ${x}"
151 done
b4075f6b
JM
152
153 # Make sure we tag the sources for a final release.
154 TAG="gcc_`echo ${RELEASE} | tr . _`_release"
155
156 rm -rf ${SOURCE_DIRECTORY}
157 fi
158
159 # Tag the sources.
2e55bbc1 160 EXPORTDATE=""
b4075f6b 161 if [ -n "${TAG}" ]; then
6124d3bd 162 inform "Tagging sources as ${TAG}"
8e48104d
MM
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 || \
6124d3bd 167 error "Could not tag sources"
ae7a5439 168 EXPORTTAG="-r${TAG}"
ae7a5439
GP
169 else
170 if [ ${CVSBRANCH} != "HEAD" ]; then
171 EXPORTTAG="-r${CVSBRANCH}"
2e55bbc1
MM
172 # It does not work to use both "-r" and "-D" with
173 # "cvs export" so EXPORTDATE is not set here.
ae7a5439
GP
174 else
175 # HEAD is the default branch, no need to specify it.
176 EXPORTTAG=""
2e55bbc1 177 EXPORTDATE="-D`date -u +"%Y-%m-%d %H:%M"` UTC"
ae7a5439 178 fi
b4075f6b
JM
179 fi
180
181 # Export the current sources.
ae7a5439
GP
182 inform "Retrieving sources (cvs export ${EXPORTTAG} ${EXPORTDATE} gcc)"
183
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"
194 fi
b4075f6b 195
4fdbb1de
GP
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.
b4075f6b
JM
198 changedir "gcc-${RELEASE}"
199 contrib/gcc_update --touch
4fdbb1de 200 echo "Obtained from CVS: ${EXPORTTAG} ${EXPORTDATE}" > LAST_UPDATED
b4075f6b
JM
201
202 # Obtain some documentation files from the wwwdocs module.
203 inform "Retrieving HTML documentation"
204 changedir "${WORKING_DIRECTORY}"
36067e59 205 for x in bugs faq; do
b4075f6b
JM
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
211
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) || \
36067e59 219 error "Could not generate text-only version of ${file}"
b4075f6b
JM
220 done
221
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
233
234 # Regenerate the NEWS file.
722962a6 235 contrib/gennews > NEWS || \
b4075f6b
JM
236 error "Could not regenerate NEWS files"
237
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
e9b3872d
KC
244 contrib/gcc_build -d ${SOURCE_DIRECTORY} -o ${OBJECT_DIRECTORY} \
245 -c "--enable-generated-files-in-srcdir" build || \
b4075f6b 246 error "Could not rebuild GCC"
b4075f6b
JM
247 fi
248
249 # Move message catalogs to source directory.
250 mv ../objdir/gcc/po/*.gmo gcc/po/
0ca8e815 251 [ -f libcpp/po/cpplib.pot ] && mv ../objdir/libcpp/po/*.gmo libcpp/po/
b4075f6b 252
2f701185 253 # Create a "MD5SUMS" file to use for checking the validity of the release.
f120a34c
KC
254 echo \
255"# This file contains the MD5 checksums of the files in the
256# gcc-"${RELEASE}".tar.bz2 tarball.
257#
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.
261#
262# Suggested usage:
263# md5sum -c MD5SUMS | grep -v \"OK$\"
264" > MD5SUMS
265
266 find . -type f |
267 sed -e 's:^\./::' -e '/MD5SUMS/d' |
268 sort |
269 xargs md5sum >>MD5SUMS
b4075f6b
JM
270}
271
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
d6f3f261 275# directories to include, and possibly other arguments to tar.
b4075f6b
JM
276
277build_tarfile() {
278 # Get the name of the destination tar file.
44d952b3 279 TARFILE="$1.tar.bz2"
b4075f6b
JM
280 shift
281
282 # Build the tar file itself.
44d952b3 283 (${TAR} cf - "$@" | ${BZIP2} > ${TARFILE}) || \
b4075f6b
JM
284 error "Could not build tarfile"
285 FILE_LIST="${FILE_LIST} ${TARFILE}"
286}
287
d6f3f261
JM
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).
291maybe_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
298 fi
299 done
300 if [ $dir_exists = 1 ]; then
301 build_tarfile "$dest" "$@"
302 else
303 echo "Not building $dest tarfile"
304 fi
305}
306
b4075f6b
JM
307# Build the various tar files for the release.
308
309build_tarfiles() {
310 inform "Building tarfiles"
311
312 changedir "${WORKING_DIRECTORY}"
313
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 {} \;
319
320 # Build one huge tarfile for the entire distribution.
321 build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}`
322
323 # Now, build one for each of the languages.
d6f3f261
JM
324 maybe_build_tarfile gcc-ada-${RELEASE} ${ADA_DIRS}
325 maybe_build_tarfile gcc-g++-${RELEASE} ${CPLUSPLUS_DIRS}
cc440d71 326 maybe_build_tarfile gcc-g77-${RELEASE} ${FORTRAN_DIRS}
d6f3f261
JM
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}
b4075f6b
JM
331
332 # The core is everything else.
333 EXCLUDES=""
cc440d71 334 for x in ${ADA_DIRS} ${CPLUSPLUS_DIRS} ${FORTRAN_DIRS} ${FORTRAN95_DIRS}\
dbff21c5 335 ${JAVA_DIRS} ${OBJECTIVEC_DIRS} ${TESTSUITE_DIRS}; do
b4075f6b
JM
336 EXCLUDES="${EXCLUDES} --exclude $x"
337 done
338 build_tarfile gcc-core-${RELEASE} ${EXCLUDES} \
339 `basename ${SOURCE_DIRECTORY}`
1c0d0c3e 340}
b4075f6b 341
44d952b3
GP
342# Build .gz files.
343build_gzip() {
b4075f6b 344 for f in ${FILE_LIST}; do
44d952b3
GP
345 target=${f%.bz2}.gz
346 (${BZIP2} -d -c $f | ${GZIP} > ${target}) || error "Could not create ${target}"
b4075f6b
JM
347 done
348}
349
350# Build diffs against an old release.
351build_diffs() {
e776237d 352 old_dir=${1%/*}
b4075f6b 353 old_file=${1##*/}
44d952b3 354 old_vers=${old_file%.tar.bz2}
b4075f6b
JM
355 old_vers=${old_vers#gcc-}
356 inform "Building diffs against version $old_vers"
6de9cd9a 357 for f in gcc gcc-ada gcc-g++ gcc-g77 gcc-fortran gcc-java gcc-objc gcc-testsuite gcc-core; do
44d952b3
GP
358 old_tar=${old_dir}/${f}-${old_vers}.tar.bz2
359 new_tar=${WORKING_DIRECTORY}/${f}-${RELEASE}.tar.bz2
0a1c5051
GP
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
b4075f6b 365 build_diff $old_tar gcc-${old_vers} $new_tar gcc-${RELEASE} \
44d952b3 366 ${f}-${old_vers}-${RELEASE}.diff.bz2
b4075f6b
JM
367 fi
368 done
369}
370
371# Build an individual diff.
372build_diff() {
373 changedir "${WORKING_DIRECTORY}"
374 tmpdir=gccdiff.$$
375 mkdir $tmpdir || error "Could not create directory $tmpdir"
376 changedir $tmpdir
44d952b3
GP
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}
b4075f6b
JM
380 if [ $? -eq 2 ]; then
381 error "Trouble making diffs from $1 to $3"
382 fi
44d952b3 383 ${BZIP2} ../${5%.bz2} || error "Could not generate ../$5"
b4075f6b
JM
384 changedir ..
385 rm -rf $tmpdir
386 FILE_LIST="${FILE_LIST} $5"
387}
388
389# Upload the files to the FTP server.
b4075f6b
JM
390upload_files() {
391 inform "Uploading files"
392
393 changedir "${WORKING_DIRECTORY}"
394
e776237d
JM
395 # Make sure the directory exists on the server.
396 if [ $LOCAL -eq 0 ]; then
8d4d9d19
GP
397 ${SSH} -l ${GCC_USERNAME} ${GCC_HOSTNAME} \
398 mkdir -p "${FTP_PATH}/diffs"
1971aca7 399 UPLOAD_PATH="${GCC_USERNAME}@${GCC_HOSTNAME}:${FTP_PATH}"
e776237d 400 else
8d4d9d19 401 mkdir -p "${FTP_PATH}/diffs" \
b4075f6b 402 || error "Could not create \`${FTP_PATH}'"
1971aca7 403 UPLOAD_PATH=${FTP_PATH}
b4075f6b
JM
404 fi
405
8d4d9d19 406 # Then copy files to their respective (sub)directories.
b4075f6b
JM
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.
8d4d9d19
GP
412 case ${x} in
413 *.diff.*)
414 SUBDIR="diffs/";
415 ;;
416 *)
417 SUBDIR="";
418 esac
419 ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \
420 || error "Could not upload ${x}"
b4075f6b
JM
421 fi
422 done
423}
424
2e847896
KC
425#Print description if snapshot exists
426snapshot_print() {
155cb616
KC
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}
2e847896
KC
431 fi
432}
433
b348a598
GP
434# Announce a snapshot, both on the web and via mail.
435announce_snapshot() {
436 inform "Updating links and READMEs on the FTP server"
437
438 TEXT_DATE=`date --date=$DATE +%B\ %d,\ %Y`
2e847896
KC
439 SNAPSHOT_README=${RELEASE}/README
440 SNAPSHOT_INDEX=${RELEASE}/index.html
441
238f2fef 442 changedir "${SNAPSHOTS_DIR}"
155cb616
KC
443 echo \
444"Snapshot gcc-"${RELEASE}" is now available on
445 ftp://gcc.gnu.org/pub/gcc/snapshots/"${RELEASE}"/
446and on various mirrors, see http://gcc.gnu.org/mirrors.html for details.
447
448This snapshot has been generated from the GCC "${BRANCH}" CVS branch
449with the following options: "${EXPORTTAG} ${EXPORTDATE}"
450
451You'll find:
452" > ${SNAPSHOT_README}
453
454 echo \
455"<html>
456
457<head>
458<title>GCC "${RELEASE}" Snapshot</title>
459</head>
460
461<body>
462<h1>GCC "${RELEASE}" Snapshot</h1>
463
464<p>The <a href =\"http://gcc.gnu.org/\">GCC Project</a> makes
465periodic snapshots of the GCC source tree available to the public
466for testing purposes.</p>
467
468<p>If you are planning to download and use one of our snapshots, then
469we highly recommend you join the GCC developers list. Details for
470how to sign up can be found on the GCC project home page.</p>
471
472<p>This snapshot has been generated from the GCC "${BRANCH}" CVS branch
473with the following options: <code>"${EXPORTTAG} ${EXPORTDATE}"</code></p>
474
475<table>" > ${SNAPSHOT_INDEX}
2e847896 476
155cb616
KC
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"
486
487 echo \
488"Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the diffs/ subdirectory.
489
490When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
491link is updated and a message is sent to the gcc list. Please do not use
492a snapshot before it has been announced that way." >> ${SNAPSHOT_README}
493
494 echo \
495"</table>
496<p>Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the
497<a href=\"diffs/\">diffs/ subdirectory</a>.</p>
498
499<p>When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}"
500link is updated and a message is sent to the gcc list. Please do not use
501a snapshot before it has been announced that way.</p>
502
503<hr />
504
505<address>
506<a href=\"mailto:gcc@gcc.gnu.org\">gcc@gcc.gnu.org</a>
507<br />
508Last modified "${TEXT_DATE}"
509</address>
510</body>
511
512</html>" >> ${SNAPSHOT_INDEX}
2e847896
KC
513
514 rm -f LATEST-${BRANCH}
515 ln -s ${RELEASE} LATEST-${BRANCH}
b348a598
GP
516
517 inform "Sending mail"
518
519 export QMAILHOST=gcc.gnu.org
2e847896 520 mail -s "gcc-${RELEASE} is now available" gcc@gcc.gnu.org < ${SNAPSHOT_README}
b348a598
GP
521}
522
b4075f6b
JM
523########################################################################
524# Initialization
525########################################################################
526
527# Today's date.
528DATE=`date "+%Y%m%d"`
529LONG_DATE=`date "+%Y-%m-%d"`
530
531# The CVS server containing the GCC repository.
532CVS_SERVER="gcc.gnu.org"
533# The path to the repository on that server.
534CVS_REPOSITORY="/cvs/gcc"
535# The CVS protocol to use.
536CVS_PROTOCOL="ext"
537# The username to use when connecting to the server.
538CVS_USERNAME="${USER}"
539
b8f93352
MM
540# The machine to which files will be uploaded.
541GCC_HOSTNAME="gcc.gnu.org"
542# The name of the account on the machine to which files are uploaded.
543GCC_USERNAME="gccadmin"
32f4b1ed
GP
544# The directory in which the files will be placed (do not use ~user syntax).
545FTP_PATH=/var/ftp/pub/gcc
238f2fef
GP
546# The directory in which snapshots will be placed.
547SNAPSHOTS_DIR=${FTP_PATH}/snapshots
b4075f6b
JM
548
549# The major number for the release. For release `3.0.2' this would be
550# `3'
551RELEASE_MAJOR=""
552# The minor number for the release. For release `3.0.2' this would be
553# `0'.
554RELEASE_MINOR=""
555# The revision number for the release. For release `3.0.2' this would
556# be `2'.
557RELEASE_REVISION=""
558# The complete name of the release.
559RELEASE=""
560
b69cd3cf
GP
561# The name of the branch from which the release should be made, in a
562# user-friendly form.
b4075f6b
JM
563BRANCH=""
564
b69cd3cf
GP
565# The name of the branch from which the release should be made, as used
566# for our version control system.
567CVSBRANCH=""
568
b4075f6b
JM
569# The tag to apply to the sources used for the release.
570TAG=""
571
572# The old tarballs from which to generate diffs.
573OLD_TARS=""
574
575# The directory that will be used to construct the release. The
576# release itself will be placed in a subdirectory of this diretory.
577DESTINATION=${HOME}
578# The subdirectory.
579WORKING_DIRECTORY=""
580# The directory that will contain the GCC sources.
581SOURCE_DIRECTORY=""
582
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.
0e315ffc 585ADA_DIRS="gcc/ada libada"
b4075f6b 586CPLUSPLUS_DIRS="gcc/cp libstdc++-v3"
cc440d71 587FORTRAN_DIRS="gcc/f libf2c"
6de9cd9a 588FORTRAN95_DIRS="gcc/fortran libgfortran"
b4075f6b
JM
589JAVA_DIRS="gcc/java libjava libffi fastjar zlib boehm-gc"
590OBJECTIVEC_DIRS="gcc/objc libobjc"
591TESTSUITE_DIRS="gcc/testsuite"
592
593# Non-zero if this is the final release, rather than a prerelease.
594FINAL=0
595
596# Non-zero if we are building a snapshot, and don't build gcc or
597# include generated files.
598SNAPSHOT=0
599
600# Non-zero if we are running locally on gcc.gnu.org, and use local CVS
601# and copy directly to the FTP directory.
602LOCAL=0
603
604# Major operation modes.
44d952b3 605MODE_GZIP=0
b8f93352 606MODE_DIFFS=0
b4075f6b
JM
607MODE_SOURCES=0
608MODE_TARFILES=0
609MODE_UPLOAD=0
610
44d952b3 611# List of archive files generated; used to create .gz files from .bz2.
b4075f6b
JM
612FILE_LIST=""
613
614# Programs we use.
615
616BZIP2="${BZIP2:-bzip2}"
617CVS="${CVS:-cvs -f -Q -z9}"
78ff5eea 618DIFF="${DIFF:-diff -Nrcpad}"
b4075f6b
JM
619ENV="${ENV:-env}"
620GZIP="${GZIP:-gzip --best}"
621SCP="${SCP:-scp -p}"
b8f93352 622SSH="${SSH:-ssh}"
b4075f6b
JM
623TAR="${TAR:-tar}"
624
625########################################################################
626# Command Line Processing
627########################################################################
628
629# Parse the options.
1f9d6256 630while getopts "d:fr:u:t:p:s:l" ARG; do
b4075f6b
JM
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;;
1f9d6256
GP
637 s) SNAPSHOT=1
638 BRANCH=${OPTARG%:*}
639 CVSBRANCH=${OPTARG#*:}
640 ;;
b4075f6b
JM
641 l) LOCAL=1
642 SCP=cp
f83fd9ae 643 PATH=~:/usr/local/bin:$PATH;;
e776237d 644 p) OLD_TARS="${OLD_TARS} ${OPTARG}"
aaaf25eb 645 if [ ! -f ${OPTARG} ]; then
e776237d
JM
646 error "-p argument must name a tarball"
647 fi;;
b4075f6b
JM
648 \?) usage;;
649 esac
650done
651shift `expr ${OPTIND} - 1`
652
2cd5026f
GP
653# Handle the major modes.
654while [ $# -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;
665 fi
666 ;;
667 *) error "Unknown mode $1";;
668 esac
669 shift
670done
671
b4075f6b 672# Perform consistency checking.
b47a72ea 673if [ ${LOCAL} -eq 0 ] && [ -z ${CVS_USERNAME} ]; then
b4075f6b
JM
674 error "No username specified"
675fi
676
677if [ ! -d ${DESTINATION} ]; then
678 error "\`${DESTINATION}' is not a directory"
679fi
680
681if [ $SNAPSHOT -eq 0 ]; then
682 if [ -z ${RELEASE} ]; then
683 error "No release number specified"
684 fi
685
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; }'`
690
691 if [ -z "${RELEASE_MAJOR}" ] || [ -z "${RELEASE_MINOR}" ]; then
692 error "Release number \`${RELEASE}' is invalid"
693 fi
694
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}"
700 fi
701
702 # Compute the name of the branch, which is based solely on the major
703 # and minor release numbers.
b69cd3cf 704 CVSBRANCH="gcc-${RELEASE_MAJOR}_${RELEASE_MINOR}-branch"
b4075f6b
JM
705
706 # If this is not a final release, set various parameters acordingly.
707 if [ ${FINAL} -ne 1 ]; then
708 RELEASE="${RELEASE}-${DATE}"
7daaf8fa 709 FTP_PATH="${FTP_PATH}/prerelease-${RELEASE}/"
b4075f6b 710 else
b8f93352 711 FTP_PATH="${FTP_PATH}/releases/gcc-${RELEASE}/"
b4075f6b
JM
712 fi
713else
b99f39de
GP
714 RELEASE=${BRANCH}-${DATE}
715 FTP_PATH="${FTP_PATH}/snapshots/${RELEASE}"
1f9d6256
GP
716 if [ ${CVSBRANCH} != "HEAD" ]; then
717 TAG=gcc-ss-`echo ${RELEASE} | tr '.' '_'`
718 fi
b4075f6b 719
aaaf25eb
GP
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
b69cd3cf 724 LAST_DATE=`cat ~/.snapshot_date-${BRANCH}`
238f2fef 725 OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.bz2
b4075f6b
JM
726 fi
727fi
728
729# Compute the name of the WORKING_DIRECTORY and the SOURCE_DIRECTORY.
730WORKING_DIRECTORY="${DESTINATION}/gcc-${RELEASE}"
731SOURCE_DIRECTORY="${WORKING_DIRECTORY}/gcc-${RELEASE}"
732
733# Recompute the names of all the language-specific directories,
734# relative to the WORKING_DIRECTORY.
dbff21c5 735ADA_DIRS=`adjust_dirs ${ADA_DIRS}`
b4075f6b 736CPLUSPLUS_DIRS=`adjust_dirs ${CPLUSPLUS_DIRS}`
cc440d71 737FORTRAN_DIRS=`adjust_dirs ${FORTRAN_DIRS}`
6de9cd9a 738FORTRAN95_DIRS=`adjust_dirs ${FORTRAN95_DIRS}`
b4075f6b
JM
739JAVA_DIRS=`adjust_dirs ${JAVA_DIRS}`
740OBJECTIVEC_DIRS=`adjust_dirs ${OBJECTIVEC_DIRS}`
741TESTSUITE_DIRS=`adjust_dirs ${TESTSUITE_DIRS}`
742
743# Set up CVSROOT.
744if [ $LOCAL -eq 0 ]; then
745 CVSROOT=":${CVS_PROTOCOL}:${CVS_USERNAME}@"
746 CVSROOT="${CVSROOT}${CVS_SERVER}:${CVS_REPOSITORY}"
747else
748 CVSROOT="${CVS_REPOSITORY}"
749fi
750export CVSROOT
751
752########################################################################
753# Main Program
754########################################################################
755
1f1760d3
KC
756# Set the timezone to UTC
757TZ="UTC0"
758export TZ
759
b4075f6b
JM
760# Build the source directory.
761
762if [ $MODE_SOURCES -ne 0 ]; then
763 build_sources
764fi
765
766# Build the tar files.
767
768if [ $MODE_TARFILES -ne 0 ]; then
769 build_tarfiles
770fi
771
b8f93352
MM
772# Build diffs
773
774if [ $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
780 fi
781fi
782
44d952b3
GP
783# Build gzip files
784if [ $MODE_GZIP -ne 0 ]; then
785 build_gzip
1c0d0c3e
JM
786fi
787
b4075f6b
JM
788# Upload them to the FTP server.
789
790if [ $MODE_UPLOAD -ne 0 ]; then
791 upload_files
792
793 # For snapshots, make some further updates.
794 if [ $SNAPSHOT -ne 0 ] && [ $LOCAL -ne 0 ]; then
b348a598 795 announce_snapshot
b4075f6b
JM
796
797 # Update snapshot date file.
798 changedir ~
b69cd3cf 799 echo $DATE > .snapshot_date-${BRANCH}
b4075f6b 800
b4075f6b
JM
801 # Remove working directory
802 rm -rf ${WORKING_DIRECTORY}
803 fi
804fi