source: trunk/gcc/maintainer-scripts/gcc_release@ 2810

Last change on this file since 2810 was 1477, checked in by bird, 21 years ago

This commit was generated by cvs2svn to compensate for changes in r1476,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.3
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 18.3 KB
Line 
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#
12# Copyright (c) 2001, 2002 Free Software Foundation.
13#
14# This file is part of GCC.
15#
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.
20#
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.
25#
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.
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
67gcc_release [-d destination]
68 [-u username]
69 [-r release]
70 [-t tag]
71 [-p previous-tarball]
72 [-s] [-f] [-l]
73EOF
74 exit 1
75}
76
77# Change to the directory given by $1.
78
79changedir() {
80 cd $1 || \
81 error "Could not change directory to $1"
82}
83
84# Each of the arguments is a directory name, relative to the top
85# of the source tree. Return another name for that directory, relative
86# to the working directory.
87
88adjust_dirs() {
89 for x in $@; do
90 echo `basename ${SOURCE_DIRECTORY}`/$x
91 done
92}
93
94# Build the source tree that will be the basis for the release
95# in ${WORKING_DIRECTORY}/gcc-${RELEASE}.
96
97build_sources() {
98 # If the WORKING_DIRECTORY already exists, do not risk destroying it.
99 if [ -r ${WORKING_DIRECTORY} ]; then
100 error "\`${WORKING_DIRECTORY}' already exists"
101 fi
102 # Create the WORKING_DIRECTORY.
103 mkdir "${WORKING_DIRECTORY}" \
104 || error "Could not create \`${WORKING_DIRECTORY}'"
105 changedir "${WORKING_DIRECTORY}"
106
107 # If this is a final release, make sure that the ChangeLogs
108 # and version strings are updated.
109 if [ ${FINAL} -ne 0 ]; then
110 inform "Updating ChangeLogs and version files"
111
112 ${CVS} co -d "`basename ${SOURCE_DIRECTORY}`" \
113 -r ${BRANCH} gcc || \
114 error "Could not check out release sources"
115 for x in `find ${SOURCE_DIRECTORY} -name ChangeLog`; do
116 cat - ${x} > ${x}.new <<EOF
117${LONG_DATE} Release Manager
118
119 * GCC ${RELEASE} Released.
120
121EOF
122 mv ${x}.new ${x} || \
123 error "Could not update ${x}"
124 (changedir `dirname ${x}` && \
125 ${CVS} ci -m 'Mark ChangeLog' `basename ${x}`) || \
126 error "Could not commit ${x}"
127 done
128
129 # Update `gcc/version.c'.
130 for x in gcc/version.c; do
131 y=`basename ${x}`
132 (changedir `dirname ${SOURCE_DIRECTORY}/${x}` && \
133 sed -e 's|version_string\[\] = \".*\"|version_string\[\] = \"'${RELEASE}'\"|g' < ${y} > ${y}.new && \
134 mv ${y}.new ${y} && \
135 ${CVS} ci -m 'Update version' ${y}) || \
136 error "Could not update ${x}"
137 done
138
139 # Make sure we tag the sources for a final release.
140 TAG="gcc_`echo ${RELEASE} | tr . _`_release"
141
142 rm -rf ${SOURCE_DIRECTORY}
143 fi
144
145 # Tag the sources.
146 if [ -n "${TAG}" ]; then
147 inform "Tagging release sources"
148 ${CVS} rtag -r ${BRANCH} -F ${TAG} gcc || \
149 error "Could not tag release sources"
150 BRANCH=$TAG
151 fi
152
153 # Export the current sources.
154 inform "Retrieving release sources"
155 ${CVS} \
156 export -d "`basename ${SOURCE_DIRECTORY}`" \
157 -r ${BRANCH} gcc || \
158 error "Could not retrieve release sources"
159
160 # Run gcc_update on them to set up the timestamps nicely.
161 changedir "gcc-${RELEASE}"
162 contrib/gcc_update --touch
163
164 # Obtain some documentation files from the wwwdocs module.
165 inform "Retrieving HTML documentation"
166 changedir "${WORKING_DIRECTORY}"
167 for x in bugs faq; do
168 (${CVS} export -r HEAD wwwdocs/htdocs/${x}.html && \
169 cp ${WORKING_DIRECTORY}/wwwdocs/htdocs/${x}.html \
170 ${SOURCE_DIRECTORY}) || \
171 error "Could not retrieve ${x}.html"
172 done
173
174 inform "Generating plain-text documentation from HTML"
175 changedir "${SOURCE_DIRECTORY}"
176 for file in *.html; do
177 newfile=`echo $file | sed -e 's/.html//' | tr "[:lower:]" "[:upper:]"`
178 (${ENV} TERM=vt100 lynx -dump $file \
179 | sed -e "s#file://localhost`/bin/pwd`\(.*\)#http://gcc.gnu.org\1#g" \
180 > $newfile) || \
181 error "Could not generate text-only version of ${file}"
182 done
183
184 # For a prerelease or real release, we need to generate additional
185 # files not present in CVS.
186 changedir "${SOURCE_DIRECTORY}"
187 if [ $SNAPSHOT -ne 1 ]; then
188 # Generate the documentation.
189 inform "Building install docs"
190 SOURCEDIR=${SOURCE_DIRECTORY}/gcc/doc
191 DESTDIR=${SOURCE_DIRECTORY}/INSTALL
192 export SOURCEDIR
193 export DESTDIR
194 ${SOURCE_DIRECTORY}/gcc/doc/install.texi2html
195
196 # Regenerate the NEWS file.
197 contrib/gennews > NEWS || \
198 error "Could not regenerate NEWS files"
199
200 # Now, we must build the compiler in order to create any generated
201 # files that are supposed to go in the source directory. This is
202 # also a good sanity check to make sure that the release builds
203 # on at least one platform.
204 inform "Building compiler"
205 OBJECT_DIRECTORY=../objdir
206 contrib/gcc_build -d ${SOURCE_DIRECTORY} -o ${OBJECT_DIRECTORY} build || \
207 error "Could not rebuild GCC"
208
209 # Regenerate the Fotran NEWS and BUGS files.
210 (cd ${OBJECT_DIRECTORY}/gcc && make f77.rebuilt) || \
211 error "Could not regenerate Fortran NEWS and BUGS files"
212 fi
213
214 # Move message catalogs to source directory.
215 mv ../objdir/gcc/po/*.gmo gcc/po/
216
217 # Create a `.brik' file to use for checking the validity of the
218 # release.
219 changedir "${SOURCE_DIRECTORY}"
220 BRIK_FILE=`mktemp /tmp/gcc_release.XXXXXXX`
221 ((find . -type f | sort > $BRIK_FILE) && \
222 brik -Gb -f ${BRIK_FILE} > .brik && \
223 rm ${BRIK_FILE}) || \
224 error "Could not compute brik checksum"
225}
226
227# Buid a single tarfile. The first argument is the name of the name
228# of the tarfile to build, without any suffixes. They will be added
229# automatically. The rest of the arguments are the files or
230# directories to include.
231
232build_tarfile() {
233 # Get the name of the destination tar file.
234 TARFILE="$1.tar.gz"
235 shift
236
237 # Build the tar file itself.
238 (${TAR} cf - "$@" | ${GZIP} > ${TARFILE}) || \
239 error "Could not build tarfile"
240 FILE_LIST="${FILE_LIST} ${TARFILE}"
241}
242
243# Build the various tar files for the release.
244
245build_tarfiles() {
246 inform "Building tarfiles"
247
248 changedir "${WORKING_DIRECTORY}"
249
250 # The GNU Coding Standards specify that all files should
251 # world readable.
252 chmod -R a+r ${SOURCE_DIRECTORY}
253 # And that all directories have mode 777.
254 find ${SOURCE_DIRECTORY} -type d -exec chmod 777 {} \;
255
256 # Build one huge tarfile for the entire distribution.
257 build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}`
258
259 # Now, build one for each of the languages.
260 build_tarfile gcc-ada-${RELEASE} ${ADA_DIRS}
261 build_tarfile gcc-g++-${RELEASE} ${CPLUSPLUS_DIRS}
262 build_tarfile gcc-g77-${RELEASE} ${FORTRAN_DIRS}
263 build_tarfile gcc-java-${RELEASE} ${JAVA_DIRS}
264 build_tarfile gcc-objc-${RELEASE} ${OBJECTIVEC_DIRS}
265 build_tarfile gcc-testsuite-${RELEASE} ${TESTSUITE_DIRS}
266
267 # The core is everything else.
268 EXCLUDES=""
269 for x in ${ADA_DIRS} ${CPLUSPLUS_DIRS} ${FORTRAN_DIRS} \
270 ${JAVA_DIRS} ${OBJECTIVEC_DIRS} ${TESTSUITE_DIRS}; do
271 EXCLUDES="${EXCLUDES} --exclude $x"
272 done
273 build_tarfile gcc-core-${RELEASE} ${EXCLUDES} \
274 `basename ${SOURCE_DIRECTORY}`
275}
276
277# Build .bz2 files.
278build_bzip2() {
279 for f in ${FILE_LIST}; do
280 bzfile=${f%.gz}.bz2
281 (zcat $f | ${BZIP2} > ${bzfile}) || error "Could not create ${bzfile}"
282 done
283}
284
285# Build diffs against an old release.
286build_diffs() {
287 old_dir=${1%/*}
288 old_file=${1##*/}
289 old_vers=${old_file%.tar.gz}
290 old_vers=${old_vers#gcc-}
291 inform "Building diffs against version $old_vers"
292 for f in gcc gcc-ada gcc-g++ gcc-g77 gcc-java gcc-objc gcc-testsuite gcc-core; do
293 old_tar=${old_dir}/${f}-${old_vers}.tar.gz
294 new_tar=${WORKING_DIRECTORY}/${f}-${RELEASE}.tar.gz
295 if [ ! -e $old_tar ]; then
296 inform "$old_tar not found; not generating diff file"
297 elif [ ! -e $new_tar ]; then
298 inform "$new_tar not found; not generating diff file"
299 else
300 build_diff $old_tar gcc-${old_vers} $new_tar gcc-${RELEASE} \
301 ${f}-${old_vers}-${RELEASE}.diff.gz
302 fi
303 done
304}
305
306# Build an individual diff.
307build_diff() {
308 changedir "${WORKING_DIRECTORY}"
309 tmpdir=gccdiff.$$
310 mkdir $tmpdir || error "Could not create directory $tmpdir"
311 changedir $tmpdir
312 tar xfz $1 || error "Could not unpack $1 for diffs"
313 tar xfz $3 || error "Could not unpack $3 for diffs"
314 ${DIFF} $2 $4 > ../${5%.gz}
315 if [ $? -eq 2 ]; then
316 error "Trouble making diffs from $1 to $3"
317 fi
318 ${GZIP} ../${5%.gz} || error "Could not gzip ../${5%.gz}"
319 changedir ..
320 rm -rf $tmpdir
321 FILE_LIST="${FILE_LIST} $5"
322}
323
324# Upload the files to the FTP server.
325
326upload_files() {
327 inform "Uploading files"
328
329 changedir "${WORKING_DIRECTORY}"
330
331 # Make sure the directory exists on the server.
332 if [ $LOCAL -eq 0 ]; then
333 ${SSH} -l ${GCC_USERNAME} ${GCC_HOSTNAME} \
334 mkdir -p "${FTP_PATH}/diffs"
335 UPLOAD_PATH="${GCC_USERNAME}@${GCC_HOSTNAME}:${FTP_PATH}"
336 else
337 mkdir -p "${FTP_PATH}/diffs" \
338 || error "Could not create \`${FTP_PATH}'"
339 UPLOAD_PATH=${FTP_PATH}
340 fi
341
342 # Then copy files to their respective (sub)directories.
343 for x in gcc*.gz gcc*.bz2; do
344 if [ -e ${x} ]; then
345 # Make sure the file will be readable on the server.
346 chmod a+r ${x}
347 # Copy it.
348 case ${x} in
349 *.diff.*)
350 SUBDIR="diffs/";
351 ;;
352 *)
353 SUBDIR="";
354 esac
355 ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \
356 || error "Could not upload ${x}"
357 fi
358 done
359}
360
361########################################################################
362# Initialization
363########################################################################
364
365# Today's date.
366DATE=`date "+%Y%m%d"`
367LONG_DATE=`date "+%Y-%m-%d"`
368
369# The CVS server containing the GCC repository.
370CVS_SERVER="gcc.gnu.org"
371# The path to the repository on that server.
372CVS_REPOSITORY="/cvs/gcc"
373# The CVS protocol to use.
374CVS_PROTOCOL="ext"
375# The username to use when connecting to the server.
376CVS_USERNAME="${USER}"
377
378# The machine to which files will be uploaded.
379GCC_HOSTNAME="gcc.gnu.org"
380# The name of the account on the machine to which files are uploaded.
381GCC_USERNAME="gccadmin"
382# The directory in which the files will be placed.
383FTP_PATH="~ftp/pub/gcc"
384
385# The major number for the release. For release `3.0.2' this would be
386# `3'
387RELEASE_MAJOR=""
388# The minor number for the release. For release `3.0.2' this would be
389# `0'.
390RELEASE_MINOR=""
391# The revision number for the release. For release `3.0.2' this would
392# be `2'.
393RELEASE_REVISION=""
394# The complete name of the release.
395RELEASE=""
396
397# The name of the branch from which the release should be made.
398BRANCH=""
399
400# The tag to apply to the sources used for the release.
401TAG=""
402
403# The old tarballs from which to generate diffs.