11debfc3dSmrg#! /bin/sh 21debfc3dSmrg 31debfc3dSmrg######################################################################## 41debfc3dSmrg# 51debfc3dSmrg# File: gcc_release 61debfc3dSmrg# Author: Jeffrey Law, Bernd Schmidt, Mark Mitchell 71debfc3dSmrg# Date: 2001-05-25 81debfc3dSmrg# 91debfc3dSmrg# Contents: 101debfc3dSmrg# Script to create a GCC release. 111debfc3dSmrg# 12c0a68be4Smrg# Copyright (c) 2001-2020 Free Software Foundation. 131debfc3dSmrg# 141debfc3dSmrg# This file is part of GCC. 151debfc3dSmrg# 161debfc3dSmrg# GCC is free software; you can redistribute it and/or modify 171debfc3dSmrg# it under the terms of the GNU General Public License as published by 181debfc3dSmrg# the Free Software Foundation; either version 3, or (at your option) 191debfc3dSmrg# any later version. 201debfc3dSmrg# 211debfc3dSmrg# GCC is distributed in the hope that it will be useful, 221debfc3dSmrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 231debfc3dSmrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 241debfc3dSmrg# GNU General Public License for more details. 251debfc3dSmrg# 261debfc3dSmrg# You should have received a copy of the GNU General Public License 271debfc3dSmrg# along with GCC; see the file COPYING3. If not see 281debfc3dSmrg# <http://www.gnu.org/licenses/>. 291debfc3dSmrg# 301debfc3dSmrg######################################################################## 311debfc3dSmrg 321debfc3dSmrg######################################################################## 331debfc3dSmrg# Notes 341debfc3dSmrg######################################################################## 351debfc3dSmrg 361debfc3dSmrg# Here is an example usage of this script, to create a GCC 3.0.2 371debfc3dSmrg# prerelease: 381debfc3dSmrg# 391debfc3dSmrg# gcc_release -r 3.0.2 401debfc3dSmrg# 411debfc3dSmrg# This script will automatically use the head of the release branch 421debfc3dSmrg# to generate the release. 431debfc3dSmrg 441debfc3dSmrg######################################################################## 451debfc3dSmrg# Functions 461debfc3dSmrg######################################################################## 471debfc3dSmrg 48a2dc1f3fSmrg# Issue the error message given by $@ and exit with a non-zero 491debfc3dSmrg# exit code. 501debfc3dSmrg 511debfc3dSmrgerror() { 52a2dc1f3fSmrg echo "gcc_release: error: $@" 531debfc3dSmrg exit 1 541debfc3dSmrg} 551debfc3dSmrg 56a2dc1f3fSmrg# Issue the informational message given by $@. 571debfc3dSmrg 581debfc3dSmrginform() { 59a2dc1f3fSmrg echo "gcc_release: $@" 601debfc3dSmrg} 611debfc3dSmrg 621debfc3dSmrg# Issue a usage message explaining how to use this script. 631debfc3dSmrg 641debfc3dSmrgusage() { 651debfc3dSmrgcat <<EOF 661debfc3dSmrggcc_release -r release [-f] [further options] 67a2dc1f3fSmrggcc_release -s name:gitbranch [further options] 681debfc3dSmrg 691debfc3dSmrgOptions: 701debfc3dSmrg 711debfc3dSmrg -r release Version of the form X.Y or X.Y.Z. 72a2dc1f3fSmrg -s name:gitbranch Create a snapshot, not a real release. 731debfc3dSmrg 741debfc3dSmrg -d destination Local working directory where we will build the release 751debfc3dSmrg (default=${HOME}). 761debfc3dSmrg -f Create a final release (and update ChangeLogs,...). 771debfc3dSmrg -l Indicate that we are running on gcc.gnu.org. 781debfc3dSmrg -p previous-tarball Location of a previous tarball (to generate diff files). 79a2dc1f3fSmrg -t tag Tag to mark the release in git. 801debfc3dSmrg -u username Username for upload operations. 81c0a68be4Smrg -b local-git-repo Local git repository to speed up cloning. 821debfc3dSmrgEOF 831debfc3dSmrg exit 1 841debfc3dSmrg} 851debfc3dSmrg 861debfc3dSmrg# Change to the directory given by $1. 871debfc3dSmrg 881debfc3dSmrgchangedir() { 891debfc3dSmrg cd $1 || \ 901debfc3dSmrg error "Could not change directory to $1" 911debfc3dSmrg} 921debfc3dSmrg 931debfc3dSmrg# Build the source tree that will be the basis for the release 941debfc3dSmrg# in ${WORKING_DIRECTORY}/gcc-${RELEASE}. 951debfc3dSmrg 961debfc3dSmrgbuild_sources() { 971debfc3dSmrg # If the WORKING_DIRECTORY already exists, do not risk destroying it. 981debfc3dSmrg if [ -r ${WORKING_DIRECTORY} ]; then 991debfc3dSmrg error "\`${WORKING_DIRECTORY}' already exists" 1001debfc3dSmrg fi 1011debfc3dSmrg # Create the WORKING_DIRECTORY. 1021debfc3dSmrg mkdir "${WORKING_DIRECTORY}" \ 1031debfc3dSmrg || error "Could not create \`${WORKING_DIRECTORY}'" 1041debfc3dSmrg changedir "${WORKING_DIRECTORY}" 1051debfc3dSmrg 106a2dc1f3fSmrg # Check out the sources. 107c0a68be4Smrg if [ -n "${GIT_REFERENCE}" ]; then 108c0a68be4Smrg ${GIT} clone -q --dissociate --reference "${GIT_REFERENCE}" \ 109c0a68be4Smrg -b "${GITBRANCH}" "${GITROOT}" "`basename ${SOURCE_DIRECTORY}`" || \ 110c0a68be4Smrg error "Could not check out release sources" 111c0a68be4Smrg else 112a2dc1f3fSmrg ${GIT} clone -q -b "${GITBRANCH}" "${GITROOT}" "`basename ${SOURCE_DIRECTORY}`" || \ 113a2dc1f3fSmrg error "Could not check out release sources" 114c0a68be4Smrg fi 115a2dc1f3fSmrg 1161debfc3dSmrg # If this is a final release, make sure that the ChangeLogs 1171debfc3dSmrg # and version strings are updated. 1181debfc3dSmrg if [ ${FINAL} -ne 0 ]; then 1191debfc3dSmrg inform "Updating ChangeLogs and version files" 1201debfc3dSmrg 121a2dc1f3fSmrg grep -q "gcc-${RELEASE_MAJOR}/index.html gcc-${RELEASE_MAJOR}/changes.html" \ 122a2dc1f3fSmrg ${SOURCE_DIRECTORY}/contrib/gennews ||\ 123a2dc1f3fSmrg error "New release not listed in contrib/gennews" 124a2dc1f3fSmrg 125a2dc1f3fSmrg ${SOURCE_DIRECTORY}/contrib/gennews > NEWS ||\ 126a2dc1f3fSmrg error "Could not regenerate NEWS files" 127a2dc1f3fSmrg 128a2dc1f3fSmrg grep -q "no releases of GCC ${RELEASE_MAJOR} have yet been made" NEWS &&\ 129a2dc1f3fSmrg error "gcc-${RELEASE_MAJOR}/index.html has not been updated yet" 130a2dc1f3fSmrg 131a2dc1f3fSmrg grep -q "GCC ${RELEASE_MAJOR} has not been released yet" NEWS &&\ 132a2dc1f3fSmrg error "gcc-${RELEASE_MAJOR}/changes.html has not been updated yet" 133a2dc1f3fSmrg 134a2dc1f3fSmrg thisindex="http:\/\/gcc.gnu.org\/gcc-${RELEASE_MAJOR}\/index.html" 135a2dc1f3fSmrg thischanges="http:\/\/gcc.gnu.org\/gcc-${RELEASE_MAJOR}\/changes.html" 136a2dc1f3fSmrg previndex="http:\/\/gcc.gnu.org\/gcc-`expr ${RELEASE_MAJOR} - 1`\/index.html" 137a2dc1f3fSmrg sed -n -e "/^${thisindex}/,/^${thischanges}/p" NEWS |\ 138a2dc1f3fSmrg sed -n -e "/Release History/,/References and Acknowledgments/p" |\ 139a2dc1f3fSmrg grep -q "^[[:blank:]]*GCC ${RELEASE_MAJOR}.${RELEASE_MINOR}" ||\ 140a2dc1f3fSmrg error "GCC ${RELEASE_MAJOR}.${RELEASE_MINOR} not mentioned "\ 141a2dc1f3fSmrg "in gcc-${RELEASE_MAJOR}/index.html" 142a2dc1f3fSmrg 143a2dc1f3fSmrg sed -n -e "/^${thischanges}/,/^${previndex}/p" NEWS |\ 144a2dc1f3fSmrg grep -q "^[[:blank:]]*GCC ${RELEASE_MAJOR}.${RELEASE_MINOR}" ||\ 145a2dc1f3fSmrg error "GCC ${RELEASE_MAJOR}.${RELEASE_MINOR} not mentioned "\ 146a2dc1f3fSmrg "in gcc-${RELEASE_MAJOR}/changes.html" 147a2dc1f3fSmrg 148a2dc1f3fSmrg rm -f NEWS 149a2dc1f3fSmrg 150a2dc1f3fSmrg commit_files="" 1511debfc3dSmrg for x in `changedir ${SOURCE_DIRECTORY} && \ 1521debfc3dSmrg find . -name ChangeLog`; do 1531debfc3dSmrg # Update this ChangeLog file only if it does not yet contain the 1541debfc3dSmrg # entry we are going to add. (This is a safety net for repeated 1551debfc3dSmrg # runs of this script for the same release.) 1561debfc3dSmrg if ! grep "GCC ${RELEASE} released." ${SOURCE_DIRECTORY}/${x} > /dev/null ; then 1571debfc3dSmrg cat - ${SOURCE_DIRECTORY}/${x} > ${SOURCE_DIRECTORY}/${x}.new <<EOF 1581debfc3dSmrg${LONG_DATE} Release Manager 1591debfc3dSmrg 1601debfc3dSmrg * GCC ${RELEASE} released. 1611debfc3dSmrg 1621debfc3dSmrgEOF 1631debfc3dSmrg mv ${SOURCE_DIRECTORY}/${x}.new ${SOURCE_DIRECTORY}/${x} \ 1641debfc3dSmrg || error "Could not update ${x}" 165a2dc1f3fSmrg commit_files="${commit_files} ${x}" 1661debfc3dSmrg fi 1671debfc3dSmrg done 1681debfc3dSmrg 1691debfc3dSmrg # Update gcc/DEV-PHASE. 1701debfc3dSmrg 1711debfc3dSmrg if [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` != ${RELEASE} ]; then 1721debfc3dSmrg [ ${RELEASE_MAJOR} -lt 5 ] && \ 1731debfc3dSmrg error "Release number ${RELEASE} does not match BASE-VER" 1741debfc3dSmrg if [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` \ 1751debfc3dSmrg = ${RELEASE_MAJOR}.`expr ${RELEASE_MINOR} - 1`.1 \ 1761debfc3dSmrg -a x${RELEASE_REVISION} = x0 ]; then 1771debfc3dSmrg (changedir ${SOURCE_DIRECTORY}/gcc && \ 1781debfc3dSmrg echo ${RELEASE} > BASE-VER) || \ 1791debfc3dSmrg error "Could not update BASE-VER" 180a2dc1f3fSmrg commit_files="${commit_files} gcc/BASE-VER" 1811debfc3dSmrg else 1821debfc3dSmrg error "Release number ${RELEASE} does not immediately follow BASE-VER" 1831debfc3dSmrg fi 1841debfc3dSmrg fi 1851debfc3dSmrg (changedir ${SOURCE_DIRECTORY}/gcc && \ 1861debfc3dSmrg : > DEV-PHASE) || \ 1871debfc3dSmrg error "Could not update DEV-PHASE" 188a2dc1f3fSmrg commit_files="${commit_files} gcc/DEV-PHASE" 1891debfc3dSmrg 1901debfc3dSmrg (changedir ${SOURCE_DIRECTORY} && \ 191a2dc1f3fSmrg ${GIT} commit -q -m 'Update ChangeLog and version files for release' ${commit_files} && \ 192a2dc1f3fSmrg ${GIT} push) || \ 1931debfc3dSmrg error "Could not commit ChangeLog and version file updates" 1941debfc3dSmrg 1951debfc3dSmrg # Make sure we tag the sources for a final release. 196a2dc1f3fSmrg TAG="releases/gcc-${RELEASE}" 1971debfc3dSmrg fi 1981debfc3dSmrg 1991debfc3dSmrg # Tag the sources. 2001debfc3dSmrg if [ -n "${TAG}" ]; then 2011debfc3dSmrg inform "Tagging sources as ${TAG}" 2021debfc3dSmrg # We don't want to overwrite an existing tag. So, if the tag 2031debfc3dSmrg # already exists, issue an error message; the release manager can 2041debfc3dSmrg # manually remove the tag if appropriate. 205a2dc1f3fSmrg if (changedir ${SOURCE_DIRECTORY} && \ 206a2dc1f3fSmrg ${GIT} rev-parse "refs/tags/${TAG}" > /dev/null 2>&1); then 2071debfc3dSmrg error "Tag ${TAG} already exists" 2081debfc3dSmrg fi 209a2dc1f3fSmrg (changedir ${SOURCE_DIRECTORY} && \ 210a2dc1f3fSmrg ${GIT} tag -s -m "GCC ${RELEASE} release" "${TAG}" && \ 211a2dc1f3fSmrg ${GIT} push origin tag "${TAG}") || \ 2121debfc3dSmrg error "Could not tag sources" 213a2dc1f3fSmrg GITBRANCH=${TAG} 2141debfc3dSmrg fi 2151debfc3dSmrg 216a2dc1f3fSmrg GITREV=`cd ${SOURCE_DIRECTORY} && ${GIT} rev-parse HEAD` 217a2dc1f3fSmrg inform "Sources are commit ${GITREV}" 2181debfc3dSmrg 219a2dc1f3fSmrg # Make sure there are no uncommitted changes in the sources. 220a2dc1f3fSmrg status=${WORKING_DIRECTORY}/gitstatus.$$ 221a2dc1f3fSmrg (changedir ${SOURCE_DIRECTORY} && \ 222a2dc1f3fSmrg ${GIT} status --porcelain --ignored > "$status") || \ 223a2dc1f3fSmrg error "Could not get source directory status" 224a2dc1f3fSmrg if [ -s "$status" ]; then 225a2dc1f3fSmrg cat "$status" 226a2dc1f3fSmrg error "Source directory has unexpected changes" 227a2dc1f3fSmrg fi 228a2dc1f3fSmrg rm "$status" 229a2dc1f3fSmrg 230a2dc1f3fSmrg # Remove .git from the sources. 231a2dc1f3fSmrg rm -rf "${SOURCE_DIRECTORY}/.git" || \ 232a2dc1f3fSmrg error "Could not remove .git from sources" 2331debfc3dSmrg 2341debfc3dSmrg # Run gcc_update on them to set up the timestamps nicely, and (re)write 235a2dc1f3fSmrg # the LAST_UPDATED file containing the git tag/revision used. 2361debfc3dSmrg changedir "gcc-${RELEASE}" 2371debfc3dSmrg contrib/gcc_update --touch 238a2dc1f3fSmrg echo "Obtained from git: ${GITBRANCH} revision ${GITREV}" > LAST_UPDATED 2391debfc3dSmrg 2401debfc3dSmrg # For a prerelease or real release, we need to generate additional 241a2dc1f3fSmrg # files not present in git. 2421debfc3dSmrg changedir "${SOURCE_DIRECTORY}" 2431debfc3dSmrg if [ $SNAPSHOT -ne 1 ]; then 2441debfc3dSmrg # Generate the documentation. 2451debfc3dSmrg inform "Building install docs" 2461debfc3dSmrg SOURCEDIR=${SOURCE_DIRECTORY}/gcc/doc 2471debfc3dSmrg DESTDIR=${SOURCE_DIRECTORY}/INSTALL 2481debfc3dSmrg export SOURCEDIR 2491debfc3dSmrg export DESTDIR 2501debfc3dSmrg ${SOURCE_DIRECTORY}/gcc/doc/install.texi2html 2511debfc3dSmrg 2521debfc3dSmrg # Regenerate the NEWS file. 2531debfc3dSmrg contrib/gennews > NEWS || \ 2541debfc3dSmrg error "Could not regenerate NEWS files" 2551debfc3dSmrg 2561debfc3dSmrg # Now, we must build the compiler in order to create any generated 2571debfc3dSmrg # files that are supposed to go in the source directory. This is 2581debfc3dSmrg # also a good sanity check to make sure that the release builds 2591debfc3dSmrg # on at least one platform. 2601debfc3dSmrg inform "Building compiler" 2611debfc3dSmrg OBJECT_DIRECTORY=../objdir 262a2dc1f3fSmrg num_cpus=1 263a2dc1f3fSmrg if type -p getconf 2>/dev/null; then 264a2dc1f3fSmrg num_cpus=`getconf _NPROCESSORS_ONLN 2>/dev/null` 265a2dc1f3fSmrg case "$num_cpus" in 266a2dc1f3fSmrg '' | 0* | *[!0-9]*) num_cpus=1;; 267a2dc1f3fSmrg esac 268a2dc1f3fSmrg fi 2691debfc3dSmrg contrib/gcc_build -d ${SOURCE_DIRECTORY} -o ${OBJECT_DIRECTORY} \ 270a2dc1f3fSmrg -c "--enable-generated-files-in-srcdir --disable-multilib" \ 271a2dc1f3fSmrg -m "-j$num_cpus" build || \ 2721debfc3dSmrg error "Could not rebuild GCC" 2731debfc3dSmrg fi 2741debfc3dSmrg 2751debfc3dSmrg # Move message catalogs to source directory. 2761debfc3dSmrg mv ../objdir/gcc/po/*.gmo gcc/po/ 2771debfc3dSmrg [ -f libcpp/po/cpplib.pot ] && mv ../objdir/libcpp/po/*.gmo libcpp/po/ 2781debfc3dSmrg 2791debfc3dSmrg # Create a "MD5SUMS" file to use for checking the validity of the release. 2801debfc3dSmrg echo \ 2811debfc3dSmrg"# This file contains the MD5 checksums of the files in the 2821debfc3dSmrg# gcc-"${RELEASE}".tar.xz tarball. 2831debfc3dSmrg# 2841debfc3dSmrg# Besides verifying that all files in the tarball were correctly expanded, 2851debfc3dSmrg# it also can be used to determine if any files have changed since the 2861debfc3dSmrg# tarball was expanded or to verify that a patchfile was correctly applied. 2871debfc3dSmrg# 2881debfc3dSmrg# Suggested usage: 2891debfc3dSmrg# md5sum -c MD5SUMS | grep -v \"OK$\" 2901debfc3dSmrg#" > MD5SUMS 2911debfc3dSmrg 2921debfc3dSmrg find . -type f | 2931debfc3dSmrg sed -e 's:^\./::' -e '/MD5SUMS/d' | 2941debfc3dSmrg sort | 2951debfc3dSmrg xargs md5sum >>MD5SUMS 2961debfc3dSmrg} 2971debfc3dSmrg 2981debfc3dSmrg# Build a single tarfile. The first argument is the name of the tarfile 2991debfc3dSmrg# to build, without any suffixes. They will be added automatically. The 3001debfc3dSmrg# rest of the arguments are files or directories to include, and possibly 3011debfc3dSmrg# other arguments to tar. 3021debfc3dSmrg 3031debfc3dSmrgbuild_tarfile() { 3041debfc3dSmrg # Get the name of the destination tar file. 3051debfc3dSmrg TARFILE="$1.tar.xz" 3061debfc3dSmrg shift 3071debfc3dSmrg 3081debfc3dSmrg # Build the tar file itself. 3091debfc3dSmrg (${TAR} cf - "$@" | ${XZ} > ${TARFILE}) || \ 3101debfc3dSmrg error "Could not build tarfile" 3111debfc3dSmrg FILE_LIST="${FILE_LIST} ${TARFILE}" 3121debfc3dSmrg} 3131debfc3dSmrg 3141debfc3dSmrg# Build the various tar files for the release. 3151debfc3dSmrg 3161debfc3dSmrgbuild_tarfiles() { 3171debfc3dSmrg inform "Building tarfiles" 3181debfc3dSmrg 3191debfc3dSmrg changedir "${WORKING_DIRECTORY}" 3201debfc3dSmrg 3211debfc3dSmrg # The GNU Coding Standards specify that all files should 3221debfc3dSmrg # world readable. 3231debfc3dSmrg chmod -R a+r ${SOURCE_DIRECTORY} 3241debfc3dSmrg # And that all directories have mode 755. 3251debfc3dSmrg find ${SOURCE_DIRECTORY} -type d -exec chmod 755 {} \; 3261debfc3dSmrg 3271debfc3dSmrg # Build one huge tarfile for the entire distribution. 3281debfc3dSmrg build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}` 3291debfc3dSmrg} 3301debfc3dSmrg 3311debfc3dSmrg# Build .gz files. 3321debfc3dSmrgbuild_gzip() { 3331debfc3dSmrg for f in ${FILE_LIST}; do 3341debfc3dSmrg target=${f%.xz}.gz 3351debfc3dSmrg (${XZ} -d -c $f | ${GZIP} > ${target}) || error "Could not create ${target}" 3361debfc3dSmrg done 3371debfc3dSmrg} 3381debfc3dSmrg 3391debfc3dSmrg# Build diffs against an old release. 3401debfc3dSmrgbuild_diffs() { 3411debfc3dSmrg old_dir=${1%/*} 3421debfc3dSmrg old_file=${1##*/} 3431debfc3dSmrg case "$old_file" in 3441debfc3dSmrg *.tar.xz) old_vers=${old_file%.tar.xz};; 3451debfc3dSmrg *) old_vers=${old_file%.tar.bz2};; 3461debfc3dSmrg esac 3471debfc3dSmrg old_vers=${old_vers#gcc-} 3481debfc3dSmrg inform "Building diffs against version $old_vers" 3491debfc3dSmrg for f in gcc; do 3501debfc3dSmrg if [ -e ${old_dir}/${f}-${old_vers}.tar.xz ]; then 3511debfc3dSmrg old_tar=${old_dir}/${f}-${old_vers}.tar.xz 3521debfc3dSmrg else 3531debfc3dSmrg old_tar=${old_dir}/${f}-${old_vers}.tar.bz2 3541debfc3dSmrg fi 3551debfc3dSmrg new_tar=${WORKING_DIRECTORY}/${f}-${RELEASE}.tar.xz 3561debfc3dSmrg if [ ! -e $old_tar ]; then 3571debfc3dSmrg inform "$old_tar not found; not generating diff file" 3581debfc3dSmrg elif [ ! -e $new_tar ]; then 3591debfc3dSmrg inform "$new_tar not found; not generating diff file" 3601debfc3dSmrg else 3611debfc3dSmrg build_diff $old_tar gcc-${old_vers} $new_tar gcc-${RELEASE} \ 3621debfc3dSmrg ${f}-${old_vers}-${RELEASE}.diff.xz 3631debfc3dSmrg fi 3641debfc3dSmrg done 3651debfc3dSmrg} 3661debfc3dSmrg 3671debfc3dSmrg# Build an individual diff. 3681debfc3dSmrgbuild_diff() { 3691debfc3dSmrg changedir "${WORKING_DIRECTORY}" 3701debfc3dSmrg tmpdir=gccdiff.$$ 3711debfc3dSmrg mkdir $tmpdir || error "Could not create directory $tmpdir" 3721debfc3dSmrg changedir $tmpdir 3731debfc3dSmrg case "$1" in 3741debfc3dSmrg *.tar.bz2) 3751debfc3dSmrg (${BZIP2} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs" 3761debfc3dSmrg ;; 3771debfc3dSmrg *.tar.xz) 3781debfc3dSmrg (${XZ} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs" 3791debfc3dSmrg ;; 3801debfc3dSmrg esac 3811debfc3dSmrg (${XZ} -d -c $3 | ${TAR} xf - ) || error "Could not unpack $3 for diffs" 3821debfc3dSmrg ${DIFF} $2 $4 > ../${5%.xz} 3831debfc3dSmrg if [ $? -eq 2 ]; then 3841debfc3dSmrg error "Trouble making diffs from $1 to $3" 3851debfc3dSmrg fi 3861debfc3dSmrg ${XZ} ../${5%.xz} || error "Could not generate ../$5" 3871debfc3dSmrg changedir .. 3881debfc3dSmrg rm -rf $tmpdir 3891debfc3dSmrg FILE_LIST="${FILE_LIST} $5" 3901debfc3dSmrg} 3911debfc3dSmrg 3921debfc3dSmrg# Upload the files to the FTP server. 3931debfc3dSmrgupload_files() { 3941debfc3dSmrg inform "Uploading files" 3951debfc3dSmrg 3961debfc3dSmrg changedir "${WORKING_DIRECTORY}" 3971debfc3dSmrg 3981debfc3dSmrg # Make sure the directory exists on the server. 3991debfc3dSmrg if [ $LOCAL -eq 0 ]; then 4001debfc3dSmrg ${SSH} -l ${GCC_USERNAME} ${GCC_HOSTNAME} \ 401*8feb0f0bSmrg mkdir -m 755 -p "${FTP_PATH}/diffs" 4021debfc3dSmrg UPLOAD_PATH="${GCC_USERNAME}@${GCC_HOSTNAME}:${FTP_PATH}" 4031debfc3dSmrg else 4041debfc3dSmrg mkdir -p "${FTP_PATH}/diffs" \ 4051debfc3dSmrg || error "Could not create \`${FTP_PATH}'" 4061debfc3dSmrg UPLOAD_PATH=${FTP_PATH} 4071debfc3dSmrg fi 4081debfc3dSmrg 4091debfc3dSmrg # Then copy files to their respective (sub)directories. 4101debfc3dSmrg for x in gcc*.gz gcc*.xz; do 4111debfc3dSmrg if [ -e ${x} ]; then 4121debfc3dSmrg # Make sure the file will be readable on the server. 4131debfc3dSmrg chmod a+r ${x} 4141debfc3dSmrg # Copy it. 4151debfc3dSmrg case ${x} in 4161debfc3dSmrg *.diff.*) 4171debfc3dSmrg SUBDIR="diffs/"; 4181debfc3dSmrg ;; 4191debfc3dSmrg *) 4201debfc3dSmrg SUBDIR=""; 4211debfc3dSmrg esac 4221debfc3dSmrg ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \ 4231debfc3dSmrg || error "Could not upload ${x}" 4241debfc3dSmrg fi 4251debfc3dSmrg done 4261debfc3dSmrg} 4271debfc3dSmrg 4281debfc3dSmrg# Print description if snapshot exists. 4291debfc3dSmrgsnapshot_print() { 4301debfc3dSmrg if [ -e ${RELEASE}/$1 ]; then 4311debfc3dSmrg hash=`openssl sha256 ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'` 4321debfc3dSmrg hash2=`openssl sha1 ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'` 4331debfc3dSmrg 4341debfc3dSmrg printf " %-37s%s\n\n %s\n %s\n\n" "$1" "$2" "$hash" "$hash2" \ 4351debfc3dSmrg >> ${SNAPSHOT_README} 4361debfc3dSmrg 4371debfc3dSmrg echo " <tr><td><a href=\"$1\">$1</a></td>" >> ${SNAPSHOT_INDEX} 4381debfc3dSmrg echo " <td>$2</td></tr>" >> ${SNAPSHOT_INDEX} 4391debfc3dSmrg fi 4401debfc3dSmrg} 4411debfc3dSmrg 4421debfc3dSmrg# Announce a snapshot, both on the web and via mail. 4431debfc3dSmrgannounce_snapshot() { 4441debfc3dSmrg inform "Updating links and READMEs on the FTP server" 4451debfc3dSmrg 4461debfc3dSmrg TEXT_DATE=`date --date=$DATE +%B\ %d,\ %Y` 4471debfc3dSmrg SNAPSHOT_README=${RELEASE}/README 4481debfc3dSmrg SNAPSHOT_INDEX=${RELEASE}/index.html 4491debfc3dSmrg 4501debfc3dSmrg changedir "${SNAPSHOTS_DIR}" 4511debfc3dSmrg echo \ 4521debfc3dSmrg"Snapshot gcc-"${RELEASE}" is now available on 453a2dc1f3fSmrg https://gcc.gnu.org/pub/gcc/snapshots/"${RELEASE}"/ 4541debfc3dSmrgand on various mirrors, see http://gcc.gnu.org/mirrors.html for details. 4551debfc3dSmrg 456a2dc1f3fSmrgThis snapshot has been generated from the GCC "${BRANCH}" git branch 457a2dc1f3fSmrgwith the following options: "git://gcc.gnu.org/git/gcc.git branch ${GITBRANCH} revision ${GITREV}" 4581debfc3dSmrg 4591debfc3dSmrgYou'll find: 4601debfc3dSmrg" > ${SNAPSHOT_README} 4611debfc3dSmrg 4621debfc3dSmrg echo \ 4631debfc3dSmrg"<html> 4641debfc3dSmrg 4651debfc3dSmrg<head> 4661debfc3dSmrg<title>GCC "${RELEASE}" Snapshot</title> 4671debfc3dSmrg</head> 4681debfc3dSmrg 4691debfc3dSmrg<body> 4701debfc3dSmrg<h1>GCC "${RELEASE}" Snapshot</h1> 4711debfc3dSmrg 4721debfc3dSmrg<p>The <a href =\"http://gcc.gnu.org/\">GCC Project</a> makes 4731debfc3dSmrgperiodic snapshots of the GCC source tree available to the public 4741debfc3dSmrgfor testing purposes.</p> 4751debfc3dSmrg 4761debfc3dSmrg<p>If you are planning to download and use one of our snapshots, then 4771debfc3dSmrgwe highly recommend you join the GCC developers list. Details for 4781debfc3dSmrghow to sign up can be found on the GCC project home page.</p> 4791debfc3dSmrg 480a2dc1f3fSmrg<p>This snapshot has been generated from the GCC "${BRANCH}" git branch 481a2dc1f3fSmrgwith the following options: <code>"git://gcc.gnu.org/git/gcc.git branch ${GITBRANCH} revision ${GITREV}"</code></p> 4821debfc3dSmrg 4831debfc3dSmrg<table>" > ${SNAPSHOT_INDEX} 4841debfc3dSmrg 4851debfc3dSmrg snapshot_print gcc-${RELEASE}.tar.xz "Complete GCC" 4861debfc3dSmrg 4871debfc3dSmrg echo \ 4881debfc3dSmrg"Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the diffs/ subdirectory. 4891debfc3dSmrg 4901debfc3dSmrgWhen a particular snapshot is ready for public consumption the LATEST-"${BRANCH}" 4911debfc3dSmrglink is updated and a message is sent to the gcc list. Please do not use 4921debfc3dSmrga snapshot before it has been announced that way." >> ${SNAPSHOT_README} 4931debfc3dSmrg 4941debfc3dSmrg echo \ 4951debfc3dSmrg"</table> 4961debfc3dSmrg<p>Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the 4971debfc3dSmrg<a href=\"diffs/\">diffs/ subdirectory</a>.</p> 4981debfc3dSmrg 4991debfc3dSmrg<p>When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}" 5001debfc3dSmrglink is updated and a message is sent to the gcc list. Please do not use 5011debfc3dSmrga snapshot before it has been announced that way.</p> 5021debfc3dSmrg 5031debfc3dSmrg<hr /> 5041debfc3dSmrg 5051debfc3dSmrg<address> 5061debfc3dSmrg<a href=\"mailto:gcc@gcc.gnu.org\">gcc@gcc.gnu.org</a> 5071debfc3dSmrg<br /> 5081debfc3dSmrgLast modified "${TEXT_DATE}" 5091debfc3dSmrg</address> 5101debfc3dSmrg</body> 5111debfc3dSmrg 5121debfc3dSmrg</html>" >> ${SNAPSHOT_INDEX} 5131debfc3dSmrg 5141debfc3dSmrg rm -f LATEST-${BRANCH} 5151debfc3dSmrg ln -s ${RELEASE} LATEST-${BRANCH} 5161debfc3dSmrg 5171debfc3dSmrg inform "Sending mail" 5181debfc3dSmrg 5191debfc3dSmrg export QMAILHOST=gcc.gnu.org 5201debfc3dSmrg mail -s "gcc-${RELEASE} is now available" gcc@gcc.gnu.org < ${SNAPSHOT_README} 5211debfc3dSmrg} 5221debfc3dSmrg 5231debfc3dSmrg######################################################################## 5241debfc3dSmrg# Initialization 5251debfc3dSmrg######################################################################## 5261debfc3dSmrg 5271debfc3dSmrgLC_ALL=C 5281debfc3dSmrgexport LC_ALL 5291debfc3dSmrg 5301debfc3dSmrg# Today's date. 5311debfc3dSmrgDATE=`date "+%Y%m%d"` 5321debfc3dSmrgLONG_DATE=`date "+%Y-%m-%d"` 5331debfc3dSmrg 534a2dc1f3fSmrgGIT=${GIT:-git} 535a2dc1f3fSmrg# The server containing the GCC repository. 536a2dc1f3fSmrgGIT_SERVER="gcc.gnu.org" 5371debfc3dSmrg# The path to the repository on that server. 538a2dc1f3fSmrgGIT_REPOSITORY="/git/gcc.git" 5391debfc3dSmrg# The username to use when connecting to the server. 540a2dc1f3fSmrgGIT_USERNAME="${USER}" 5411debfc3dSmrg 5421debfc3dSmrg# The machine to which files will be uploaded. 5431debfc3dSmrgGCC_HOSTNAME="gcc.gnu.org" 5441debfc3dSmrg# The name of the account on the machine to which files are uploaded. 5451debfc3dSmrgGCC_USERNAME="gccadmin" 5461debfc3dSmrg# The directory in which the files will be placed (do not use ~user syntax). 5471debfc3dSmrgFTP_PATH=/var/ftp/pub/gcc 5481debfc3dSmrg# The directory in which snapshots will be placed. 5491debfc3dSmrgSNAPSHOTS_DIR=${FTP_PATH}/snapshots 5501debfc3dSmrg 5511debfc3dSmrg# The major number for the release. For release `3.0.2' this would be 5521debfc3dSmrg# `3' 5531debfc3dSmrgRELEASE_MAJOR="" 5541debfc3dSmrg# The minor number for the release. For release `3.0.2' this would be 5551debfc3dSmrg# `0'. 5561debfc3dSmrgRELEASE_MINOR="" 5571debfc3dSmrg# The revision number for the release. For release `3.0.2' this would 5581debfc3dSmrg# be `2'. 5591debfc3dSmrgRELEASE_REVISION="" 5601debfc3dSmrg# The complete name of the release. 5611debfc3dSmrgRELEASE="" 5621debfc3dSmrg 5631debfc3dSmrg# The name of the branch from which the release should be made, in a 5641debfc3dSmrg# user-friendly form. 5651debfc3dSmrgBRANCH="" 5661debfc3dSmrg 5671debfc3dSmrg# The name of the branch from which the release should be made, as used 5681debfc3dSmrg# for our version control system. 569a2dc1f3fSmrgGITBRANCH="" 5701debfc3dSmrg 5711debfc3dSmrg# The tag to apply to the sources used for the release. 5721debfc3dSmrgTAG="" 5731debfc3dSmrg 5741debfc3dSmrg# The old tarballs from which to generate diffs. 5751debfc3dSmrgOLD_TARS="" 5761debfc3dSmrg 577c0a68be4Smrg# Local gcc git checkout to speed up git cloning. 578c0a68be4SmrgGIT_REFERENCE="" 579c0a68be4Smrg 5801debfc3dSmrg# The directory that will be used to construct the release. The 5811debfc3dSmrg# release itself will be placed in a subdirectory of this directory. 5821debfc3dSmrgDESTINATION=${HOME} 5831debfc3dSmrg# The subdirectory. 5841debfc3dSmrgWORKING_DIRECTORY="" 5851debfc3dSmrg# The directory that will contain the GCC sources. 5861debfc3dSmrgSOURCE_DIRECTORY="" 5871debfc3dSmrg 5881debfc3dSmrg# Non-zero if this is the final release, rather than a prerelease. 5891debfc3dSmrgFINAL=0 5901debfc3dSmrg 5911debfc3dSmrg# Non-zero if we are building a snapshot, and don't build gcc or 5921debfc3dSmrg# include generated files. 5931debfc3dSmrgSNAPSHOT=0 5941debfc3dSmrg 5951debfc3dSmrg# Non-zero if we are running locally on gcc.gnu.org, and use local CVS 5961debfc3dSmrg# and copy directly to the FTP directory. 5971debfc3dSmrgLOCAL=0 5981debfc3dSmrg 5991debfc3dSmrg# Major operation modes. 6001debfc3dSmrgMODE_GZIP=0 6011debfc3dSmrgMODE_DIFFS=0 6021debfc3dSmrgMODE_SOURCES=0 6031debfc3dSmrgMODE_TARFILES=0 6041debfc3dSmrgMODE_UPLOAD=0 6051debfc3dSmrg 6061debfc3dSmrg# List of archive files generated; used to create .gz files from .xz. 6071debfc3dSmrgFILE_LIST="" 6081debfc3dSmrg 6091debfc3dSmrg# Programs we use. 6101debfc3dSmrg 6111debfc3dSmrgBZIP2="${BZIP2:-bzip2}" 6121debfc3dSmrgXZ="${XZ:-xz --best}" 6131debfc3dSmrgCVS="${CVS:-cvs -f -Q -z9}" 6141debfc3dSmrgDIFF="${DIFF:-diff -Nrcpad}" 6151debfc3dSmrgENV="${ENV:-env}" 6161debfc3dSmrgGZIP="${GZIP:-gzip --best}" 6171debfc3dSmrgSCP="${SCP:-scp -p}" 6181debfc3dSmrgSSH="${SSH:-ssh}" 6191debfc3dSmrgTAR="${TAR:-tar}" 6201debfc3dSmrg 6211debfc3dSmrg######################################################################## 6221debfc3dSmrg# Command Line Processing 6231debfc3dSmrg######################################################################## 6241debfc3dSmrg 6251debfc3dSmrg# Parse the options. 626c0a68be4Smrgwhile getopts "d:fr:u:t:p:s:lb:" ARG; do 6271debfc3dSmrg case $ARG in 6281debfc3dSmrg d) DESTINATION="${OPTARG}";; 6291debfc3dSmrg r) RELEASE="${OPTARG}";; 6301debfc3dSmrg t) TAG="${OPTARG}";; 631a2dc1f3fSmrg u) GIT_USERNAME="${OPTARG}";; 6321debfc3dSmrg f) FINAL=1;; 6331debfc3dSmrg s) SNAPSHOT=1 6341debfc3dSmrg BRANCH=${OPTARG%:*} 635a2dc1f3fSmrg GITBRANCH=${OPTARG#*:} 6361debfc3dSmrg ;; 6371debfc3dSmrg l) LOCAL=1 6381debfc3dSmrg SCP=cp 6391debfc3dSmrg PATH=~:/usr/local/bin:$PATH;; 6401debfc3dSmrg p) OLD_TARS="${OLD_TARS} ${OPTARG}" 6411debfc3dSmrg if [ ! -f ${OPTARG} ]; then 6421debfc3dSmrg error "-p argument must name a tarball" 6431debfc3dSmrg fi;; 644c0a68be4Smrg b) GIT_REFERENCE="${OPTARG}";; 6451debfc3dSmrg \?) usage;; 6461debfc3dSmrg esac 6471debfc3dSmrgdone 6481debfc3dSmrgshift `expr ${OPTIND} - 1` 6491debfc3dSmrg 6501debfc3dSmrg# Handle the major modes. 6511debfc3dSmrgwhile [ $# -ne 0 ]; do 6521debfc3dSmrg case $1 in 6531debfc3dSmrg diffs) MODE_DIFFS=1;; 6541debfc3dSmrg gzip) MODE_GZIP=1;; 6551debfc3dSmrg sources) MODE_SOURCES=1;; 6561debfc3dSmrg tarfiles) MODE_TARFILES=1;; 6571debfc3dSmrg upload) MODE_UPLOAD=1;; 6581debfc3dSmrg all) MODE_SOURCES=1; MODE_TARFILES=1; MODE_DIFFS=1; MODE_UPLOAD=1; 6591debfc3dSmrg if [ $SNAPSHOT -ne 1 ]; then 6601debfc3dSmrg # Only for releases and pre-releases. 6611debfc3dSmrg MODE_GZIP=1; 6621debfc3dSmrg fi 6631debfc3dSmrg ;; 6641debfc3dSmrg *) error "Unknown mode $1";; 6651debfc3dSmrg esac 6661debfc3dSmrg shift 6671debfc3dSmrgdone 6681debfc3dSmrg 6691debfc3dSmrg# Perform consistency checking. 670a2dc1f3fSmrgif [ ${LOCAL} -eq 0 ] && [ -z ${GIT_USERNAME} ]; then 6711debfc3dSmrg error "No username specified" 6721debfc3dSmrgfi 6731debfc3dSmrg 6741debfc3dSmrgif [ ! -d ${DESTINATION} ]; then 6751debfc3dSmrg error "\`${DESTINATION}' is not a directory" 6761debfc3dSmrgfi 6771debfc3dSmrg 6781debfc3dSmrgif [ $SNAPSHOT -eq 0 ]; then 6791debfc3dSmrg if [ -z ${RELEASE} ]; then 6801debfc3dSmrg error "No release number specified" 6811debfc3dSmrg fi 6821debfc3dSmrg 6831debfc3dSmrg # Compute the major and minor release numbers. 6841debfc3dSmrg RELEASE_MAJOR=`echo $RELEASE | awk --assign FS=. '{ print $1; }'` 6851debfc3dSmrg RELEASE_MINOR=`echo $RELEASE | awk --assign FS=. '{ print $2; }'` 6861debfc3dSmrg RELEASE_REVISION=`echo $RELEASE | awk --assign FS=. '{ print $3; }'` 6871debfc3dSmrg 6881debfc3dSmrg if [ -z "${RELEASE_MAJOR}" ] || [ -z "${RELEASE_MINOR}" ]; then 6891debfc3dSmrg error "Release number \`${RELEASE}' is invalid" 6901debfc3dSmrg fi 6911debfc3dSmrg 6921debfc3dSmrg # Compute the full name of the release. 6931debfc3dSmrg if [ -z "${RELEASE_REVISION}" ]; then 6941debfc3dSmrg RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}" 6951debfc3dSmrg else 6961debfc3dSmrg RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}.${RELEASE_REVISION}" 6971debfc3dSmrg fi 6981debfc3dSmrg 6991debfc3dSmrg # Compute the name of the branch, which is based solely on the major 700a2dc1f3fSmrg # release number. 701a2dc1f3fSmrg GITBRANCH="releases/gcc-${RELEASE_MAJOR}" 7021debfc3dSmrg 7031debfc3dSmrg # If this is not a final release, set various parameters accordingly. 7041debfc3dSmrg if [ ${FINAL} -ne 1 ]; then 7051debfc3dSmrg RELEASE="${RELEASE}-RC-${DATE}" 7061debfc3dSmrg FTP_PATH="${SNAPSHOTS_DIR}/${RELEASE}" 7071debfc3dSmrg else 7081debfc3dSmrg FTP_PATH="${FTP_PATH}/releases/gcc-${RELEASE}/" 7091debfc3dSmrg fi 7101debfc3dSmrgelse 7111debfc3dSmrg RELEASE=${BRANCH}-${DATE} 7121debfc3dSmrg FTP_PATH="${FTP_PATH}/snapshots/${RELEASE}" 7131debfc3dSmrg 7141debfc3dSmrg # If diffs are requested when building locally on gcc.gnu.org, we (usually) 7151debfc3dSmrg # know what the last snapshot date was and take the corresponding tarballs, 7161debfc3dSmrg # unless the user specified tarballs explicitly. 7171debfc3dSmrg if [ $MODE_DIFFS -ne 0 ] && [ $LOCAL -ne 0 ] && [ -z "${OLD_TARS}" ]; then 7181debfc3dSmrg LAST_DATE=`cat ~/.snapshot_date-${BRANCH}` 7191debfc3dSmrg OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.bz2 7201debfc3dSmrg if [ ! -e $OLD_TARS ]; then 7211debfc3dSmrg OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.xz 7221debfc3dSmrg fi 7231debfc3dSmrg fi 7241debfc3dSmrgfi 7251debfc3dSmrg 7261debfc3dSmrg# Compute the name of the WORKING_DIRECTORY and the SOURCE_DIRECTORY. 7271debfc3dSmrgWORKING_DIRECTORY="${DESTINATION}/gcc-${RELEASE}" 7281debfc3dSmrgSOURCE_DIRECTORY="${WORKING_DIRECTORY}/gcc-${RELEASE}" 7291debfc3dSmrg 730a2dc1f3fSmrg# Set up GITROOT. 7311debfc3dSmrgif [ $LOCAL -eq 0 ]; then 732a2dc1f3fSmrg GITROOT="git+ssh://${GIT_USERNAME}@${GIT_SERVER}${GIT_REPOSITORY}" 7331debfc3dSmrgelse 734a2dc1f3fSmrg GITROOT="/git/gcc.git" 7351debfc3dSmrgfi 736a2dc1f3fSmrgexport GITROOT 7371debfc3dSmrg 7381debfc3dSmrg######################################################################## 7391debfc3dSmrg# Main Program 7401debfc3dSmrg######################################################################## 7411debfc3dSmrg 7421debfc3dSmrg# Set the timezone to UTC 7431debfc3dSmrgTZ="UTC0" 7441debfc3dSmrgexport TZ 7451debfc3dSmrg 7461debfc3dSmrg# Build the source directory. 7471debfc3dSmrg 7481debfc3dSmrgif [ $MODE_SOURCES -ne 0 ]; then 7491debfc3dSmrg build_sources 7501debfc3dSmrgfi 7511debfc3dSmrg 7521debfc3dSmrg# Build the tar files. 7531debfc3dSmrg 7541debfc3dSmrgif [ $MODE_TARFILES -ne 0 ]; then 7551debfc3dSmrg build_tarfiles 7561debfc3dSmrgfi 7571debfc3dSmrg 7581debfc3dSmrg# Build diffs 7591debfc3dSmrg 7601debfc3dSmrgif [ $MODE_DIFFS -ne 0 ]; then 7611debfc3dSmrg # Possibly build diffs. 7621debfc3dSmrg if [ -n "$OLD_TARS" ]; then 7631debfc3dSmrg for old_tar in $OLD_TARS; do 7641debfc3dSmrg build_diffs $old_tar 7651debfc3dSmrg done 7661debfc3dSmrg fi 7671debfc3dSmrgfi 7681debfc3dSmrg 7691debfc3dSmrg# Build gzip files 7701debfc3dSmrgif [ $MODE_GZIP -ne 0 ]; then 7711debfc3dSmrg build_gzip 7721debfc3dSmrgfi 7731debfc3dSmrg 7741debfc3dSmrg# Upload them to the FTP server. 7751debfc3dSmrgif [ $MODE_UPLOAD -ne 0 ]; then 7761debfc3dSmrg upload_files 7771debfc3dSmrg 7781debfc3dSmrg # For snapshots, make some further updates. 7791debfc3dSmrg if [ $SNAPSHOT -ne 0 ] && [ $LOCAL -ne 0 ]; then 7801debfc3dSmrg announce_snapshot 7811debfc3dSmrg 7821debfc3dSmrg # Update snapshot date file. 7831debfc3dSmrg changedir ~ 7841debfc3dSmrg echo $DATE > .snapshot_date-${BRANCH} 7851debfc3dSmrg 7861debfc3dSmrg # Remove working directory 7871debfc3dSmrg rm -rf ${WORKING_DIRECTORY} 7881debfc3dSmrg fi 7891debfc3dSmrgfi 790