14fee23f9Smrg#! /bin/sh 24fee23f9Smrg 34fee23f9Smrg######################################################################## 44fee23f9Smrg# 54fee23f9Smrg# File: gcc_release 64fee23f9Smrg# Author: Jeffrey Law, Bernd Schmidt, Mark Mitchell 74fee23f9Smrg# Date: 2001-05-25 84fee23f9Smrg# 94fee23f9Smrg# Contents: 104fee23f9Smrg# Script to create a GCC release. 114fee23f9Smrg# 12181254a7Smrg# Copyright (c) 2001-2020 Free Software Foundation. 134fee23f9Smrg# 144fee23f9Smrg# This file is part of GCC. 154fee23f9Smrg# 164fee23f9Smrg# GCC is free software; you can redistribute it and/or modify 174fee23f9Smrg# it under the terms of the GNU General Public License as published by 184fee23f9Smrg# the Free Software Foundation; either version 3, or (at your option) 194fee23f9Smrg# any later version. 204fee23f9Smrg# 214fee23f9Smrg# GCC is distributed in the hope that it will be useful, 224fee23f9Smrg# but WITHOUT ANY WARRANTY; without even the implied warranty of 234fee23f9Smrg# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 244fee23f9Smrg# GNU General Public License for more details. 254fee23f9Smrg# 264fee23f9Smrg# You should have received a copy of the GNU General Public License 274fee23f9Smrg# along with GCC; see the file COPYING3. If not see 284fee23f9Smrg# <http://www.gnu.org/licenses/>. 294fee23f9Smrg# 304fee23f9Smrg######################################################################## 314fee23f9Smrg 324fee23f9Smrg######################################################################## 334fee23f9Smrg# Notes 344fee23f9Smrg######################################################################## 354fee23f9Smrg 364fee23f9Smrg# Here is an example usage of this script, to create a GCC 3.0.2 374fee23f9Smrg# prerelease: 384fee23f9Smrg# 394fee23f9Smrg# gcc_release -r 3.0.2 404fee23f9Smrg# 414fee23f9Smrg# This script will automatically use the head of the release branch 424fee23f9Smrg# to generate the release. 434fee23f9Smrg 444fee23f9Smrg######################################################################## 454fee23f9Smrg# Functions 464fee23f9Smrg######################################################################## 474fee23f9Smrg 48a3e9eb18Smrg# Issue the error message given by $@ and exit with a non-zero 494fee23f9Smrg# exit code. 504fee23f9Smrg 514fee23f9Smrgerror() { 52a3e9eb18Smrg echo "gcc_release: error: $@" 534fee23f9Smrg exit 1 544fee23f9Smrg} 554fee23f9Smrg 56a3e9eb18Smrg# Issue the informational message given by $@. 574fee23f9Smrg 584fee23f9Smrginform() { 59a3e9eb18Smrg echo "gcc_release: $@" 604fee23f9Smrg} 614fee23f9Smrg 624fee23f9Smrg# Issue a usage message explaining how to use this script. 634fee23f9Smrg 644fee23f9Smrgusage() { 654fee23f9Smrgcat <<EOF 664fee23f9Smrggcc_release -r release [-f] [further options] 67a3e9eb18Smrggcc_release -s name:gitbranch [further options] 684fee23f9Smrg 694fee23f9SmrgOptions: 704fee23f9Smrg 714fee23f9Smrg -r release Version of the form X.Y or X.Y.Z. 72a3e9eb18Smrg -s name:gitbranch Create a snapshot, not a real release. 734fee23f9Smrg 744fee23f9Smrg -d destination Local working directory where we will build the release 754fee23f9Smrg (default=${HOME}). 764fee23f9Smrg -f Create a final release (and update ChangeLogs,...). 774fee23f9Smrg -l Indicate that we are running on gcc.gnu.org. 784fee23f9Smrg -p previous-tarball Location of a previous tarball (to generate diff files). 79a3e9eb18Smrg -t tag Tag to mark the release in git. 804fee23f9Smrg -u username Username for upload operations. 81181254a7Smrg -b local-git-repo Local git repository to speed up cloning. 824fee23f9SmrgEOF 834fee23f9Smrg exit 1 844fee23f9Smrg} 854fee23f9Smrg 864fee23f9Smrg# Change to the directory given by $1. 874fee23f9Smrg 884fee23f9Smrgchangedir() { 894fee23f9Smrg cd $1 || \ 904fee23f9Smrg error "Could not change directory to $1" 914fee23f9Smrg} 924fee23f9Smrg 934fee23f9Smrg# Build the source tree that will be the basis for the release 944fee23f9Smrg# in ${WORKING_DIRECTORY}/gcc-${RELEASE}. 954fee23f9Smrg 964fee23f9Smrgbuild_sources() { 974fee23f9Smrg # If the WORKING_DIRECTORY already exists, do not risk destroying it. 984fee23f9Smrg if [ -r ${WORKING_DIRECTORY} ]; then 994fee23f9Smrg error "\`${WORKING_DIRECTORY}' already exists" 1004fee23f9Smrg fi 1014fee23f9Smrg # Create the WORKING_DIRECTORY. 1024fee23f9Smrg mkdir "${WORKING_DIRECTORY}" \ 1034fee23f9Smrg || error "Could not create \`${WORKING_DIRECTORY}'" 1044fee23f9Smrg changedir "${WORKING_DIRECTORY}" 1054fee23f9Smrg 106a3e9eb18Smrg # Check out the sources. 107181254a7Smrg if [ -n "${GIT_REFERENCE}" ]; then 108181254a7Smrg ${GIT} clone -q --dissociate --reference "${GIT_REFERENCE}" \ 109181254a7Smrg -b "${GITBRANCH}" "${GITROOT}" "`basename ${SOURCE_DIRECTORY}`" || \ 110181254a7Smrg error "Could not check out release sources" 111181254a7Smrg else 112a3e9eb18Smrg ${GIT} clone -q -b "${GITBRANCH}" "${GITROOT}" "`basename ${SOURCE_DIRECTORY}`" || \ 113a3e9eb18Smrg error "Could not check out release sources" 114181254a7Smrg fi 115a3e9eb18Smrg 1164fee23f9Smrg # If this is a final release, make sure that the ChangeLogs 1174fee23f9Smrg # and version strings are updated. 1184fee23f9Smrg if [ ${FINAL} -ne 0 ]; then 1194fee23f9Smrg inform "Updating ChangeLogs and version files" 1204fee23f9Smrg 121a3e9eb18Smrg grep -q "gcc-${RELEASE_MAJOR}/index.html gcc-${RELEASE_MAJOR}/changes.html" \ 122a3e9eb18Smrg ${SOURCE_DIRECTORY}/contrib/gennews ||\ 123a3e9eb18Smrg error "New release not listed in contrib/gennews" 124a3e9eb18Smrg 125a3e9eb18Smrg ${SOURCE_DIRECTORY}/contrib/gennews > NEWS ||\ 126a3e9eb18Smrg error "Could not regenerate NEWS files" 127a3e9eb18Smrg 128a3e9eb18Smrg grep -q "no releases of GCC ${RELEASE_MAJOR} have yet been made" NEWS &&\ 129a3e9eb18Smrg error "gcc-${RELEASE_MAJOR}/index.html has not been updated yet" 130a3e9eb18Smrg 131a3e9eb18Smrg grep -q "GCC ${RELEASE_MAJOR} has not been released yet" NEWS &&\ 132a3e9eb18Smrg error "gcc-${RELEASE_MAJOR}/changes.html has not been updated yet" 133a3e9eb18Smrg 134a3e9eb18Smrg thisindex="http:\/\/gcc.gnu.org\/gcc-${RELEASE_MAJOR}\/index.html" 135a3e9eb18Smrg thischanges="http:\/\/gcc.gnu.org\/gcc-${RELEASE_MAJOR}\/changes.html" 136a3e9eb18Smrg previndex="http:\/\/gcc.gnu.org\/gcc-`expr ${RELEASE_MAJOR} - 1`\/index.html" 137a3e9eb18Smrg sed -n -e "/^${thisindex}/,/^${thischanges}/p" NEWS |\ 138a3e9eb18Smrg sed -n -e "/Release History/,/References and Acknowledgments/p" |\ 139a3e9eb18Smrg grep -q "^[[:blank:]]*GCC ${RELEASE_MAJOR}.${RELEASE_MINOR}" ||\ 140a3e9eb18Smrg error "GCC ${RELEASE_MAJOR}.${RELEASE_MINOR} not mentioned "\ 141a3e9eb18Smrg "in gcc-${RELEASE_MAJOR}/index.html" 142a3e9eb18Smrg 143a3e9eb18Smrg sed -n -e "/^${thischanges}/,/^${previndex}/p" NEWS |\ 144a3e9eb18Smrg grep -q "^[[:blank:]]*GCC ${RELEASE_MAJOR}.${RELEASE_MINOR}" ||\ 145a3e9eb18Smrg error "GCC ${RELEASE_MAJOR}.${RELEASE_MINOR} not mentioned "\ 146a3e9eb18Smrg "in gcc-${RELEASE_MAJOR}/changes.html" 147a3e9eb18Smrg 148a3e9eb18Smrg rm -f NEWS 149a3e9eb18Smrg 150a3e9eb18Smrg commit_files="" 151f9a78e0eSmrg for x in `changedir ${SOURCE_DIRECTORY} && \ 152f9a78e0eSmrg find . -name ChangeLog`; do 1534fee23f9Smrg # Update this ChangeLog file only if it does not yet contain the 1544fee23f9Smrg # entry we are going to add. (This is a safety net for repeated 1554fee23f9Smrg # runs of this script for the same release.) 156f9a78e0eSmrg if ! grep "GCC ${RELEASE} released." ${SOURCE_DIRECTORY}/${x} > /dev/null ; then 157f9a78e0eSmrg cat - ${SOURCE_DIRECTORY}/${x} > ${SOURCE_DIRECTORY}/${x}.new <<EOF 1584fee23f9Smrg${LONG_DATE} Release Manager 1594fee23f9Smrg 1604fee23f9Smrg * GCC ${RELEASE} released. 1614fee23f9Smrg 1624fee23f9SmrgEOF 163f9a78e0eSmrg mv ${SOURCE_DIRECTORY}/${x}.new ${SOURCE_DIRECTORY}/${x} \ 164f9a78e0eSmrg || error "Could not update ${x}" 165a3e9eb18Smrg commit_files="${commit_files} ${x}" 1664fee23f9Smrg fi 1674fee23f9Smrg done 1684fee23f9Smrg 1694fee23f9Smrg # Update gcc/DEV-PHASE. 1704fee23f9Smrg 171f9a78e0eSmrg if [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` != ${RELEASE} ]; then 172f9a78e0eSmrg [ ${RELEASE_MAJOR} -lt 5 ] && \ 1734fee23f9Smrg error "Release number ${RELEASE} does not match BASE-VER" 174f9a78e0eSmrg if [ `cat ${SOURCE_DIRECTORY}/gcc/BASE-VER` \ 175f9a78e0eSmrg = ${RELEASE_MAJOR}.`expr ${RELEASE_MINOR} - 1`.1 \ 176f9a78e0eSmrg -a x${RELEASE_REVISION} = x0 ]; then 1774fee23f9Smrg (changedir ${SOURCE_DIRECTORY}/gcc && \ 178f9a78e0eSmrg echo ${RELEASE} > BASE-VER) || \ 179f9a78e0eSmrg error "Could not update BASE-VER" 180a3e9eb18Smrg commit_files="${commit_files} gcc/BASE-VER" 181f9a78e0eSmrg else 182f9a78e0eSmrg error "Release number ${RELEASE} does not immediately follow BASE-VER" 183f9a78e0eSmrg fi 184f9a78e0eSmrg fi 185f9a78e0eSmrg (changedir ${SOURCE_DIRECTORY}/gcc && \ 186f9a78e0eSmrg : > DEV-PHASE) || \ 1874fee23f9Smrg error "Could not update DEV-PHASE" 188a3e9eb18Smrg commit_files="${commit_files} gcc/DEV-PHASE" 189f9a78e0eSmrg 190f9a78e0eSmrg (changedir ${SOURCE_DIRECTORY} && \ 191a3e9eb18Smrg ${GIT} commit -q -m 'Update ChangeLog and version files for release' ${commit_files} && \ 192a3e9eb18Smrg ${GIT} push) || \ 193f9a78e0eSmrg error "Could not commit ChangeLog and version file updates" 1944fee23f9Smrg 1954fee23f9Smrg # Make sure we tag the sources for a final release. 196a3e9eb18Smrg TAG="releases/gcc-${RELEASE}" 1974fee23f9Smrg fi 1984fee23f9Smrg 1994fee23f9Smrg # Tag the sources. 2004fee23f9Smrg if [ -n "${TAG}" ]; then 2014fee23f9Smrg inform "Tagging sources as ${TAG}" 2024fee23f9Smrg # We don't want to overwrite an existing tag. So, if the tag 2034fee23f9Smrg # already exists, issue an error message; the release manager can 2044fee23f9Smrg # manually remove the tag if appropriate. 205a3e9eb18Smrg if (changedir ${SOURCE_DIRECTORY} && \ 206a3e9eb18Smrg ${GIT} rev-parse "refs/tags/${TAG}" > /dev/null 2>&1); then 2074fee23f9Smrg error "Tag ${TAG} already exists" 2084fee23f9Smrg fi 209a3e9eb18Smrg (changedir ${SOURCE_DIRECTORY} && \ 210a3e9eb18Smrg ${GIT} tag -s -m "GCC ${RELEASE} release" "${TAG}" && \ 211a3e9eb18Smrg ${GIT} push origin tag "${TAG}") || \ 2124fee23f9Smrg error "Could not tag sources" 213a3e9eb18Smrg GITBRANCH=${TAG} 2144fee23f9Smrg fi 2154fee23f9Smrg 216a3e9eb18Smrg GITREV=`cd ${SOURCE_DIRECTORY} && ${GIT} rev-parse HEAD` 217a3e9eb18Smrg inform "Sources are commit ${GITREV}" 2184fee23f9Smrg 219a3e9eb18Smrg # Make sure there are no uncommitted changes in the sources. 220a3e9eb18Smrg status=${WORKING_DIRECTORY}/gitstatus.$$ 221a3e9eb18Smrg (changedir ${SOURCE_DIRECTORY} && \ 222a3e9eb18Smrg ${GIT} status --porcelain --ignored > "$status") || \ 223a3e9eb18Smrg error "Could not get source directory status" 224a3e9eb18Smrg if [ -s "$status" ]; then 225a3e9eb18Smrg cat "$status" 226a3e9eb18Smrg error "Source directory has unexpected changes" 227a3e9eb18Smrg fi 228a3e9eb18Smrg rm "$status" 229a3e9eb18Smrg 230a3e9eb18Smrg # Remove .git from the sources. 231a3e9eb18Smrg rm -rf "${SOURCE_DIRECTORY}/.git" || \ 232a3e9eb18Smrg error "Could not remove .git from sources" 2334fee23f9Smrg 2344fee23f9Smrg # Run gcc_update on them to set up the timestamps nicely, and (re)write 235a3e9eb18Smrg # the LAST_UPDATED file containing the git tag/revision used. 2364fee23f9Smrg changedir "gcc-${RELEASE}" 2374fee23f9Smrg contrib/gcc_update --touch 238a3e9eb18Smrg echo "Obtained from git: ${GITBRANCH} revision ${GITREV}" > LAST_UPDATED 2394fee23f9Smrg 2404fee23f9Smrg # For a prerelease or real release, we need to generate additional 241a3e9eb18Smrg # files not present in git. 2424fee23f9Smrg changedir "${SOURCE_DIRECTORY}" 2434fee23f9Smrg if [ $SNAPSHOT -ne 1 ]; then 2444fee23f9Smrg # Generate the documentation. 2454fee23f9Smrg inform "Building install docs" 2464fee23f9Smrg SOURCEDIR=${SOURCE_DIRECTORY}/gcc/doc 2474fee23f9Smrg DESTDIR=${SOURCE_DIRECTORY}/INSTALL 2484fee23f9Smrg export SOURCEDIR 2494fee23f9Smrg export DESTDIR 2504fee23f9Smrg ${SOURCE_DIRECTORY}/gcc/doc/install.texi2html 2514fee23f9Smrg 2524fee23f9Smrg # Regenerate the NEWS file. 2534fee23f9Smrg contrib/gennews > NEWS || \ 2544fee23f9Smrg error "Could not regenerate NEWS files" 2554fee23f9Smrg 2564fee23f9Smrg # Now, we must build the compiler in order to create any generated 2574fee23f9Smrg # files that are supposed to go in the source directory. This is 2584fee23f9Smrg # also a good sanity check to make sure that the release builds 2594fee23f9Smrg # on at least one platform. 2604fee23f9Smrg inform "Building compiler" 2614fee23f9Smrg OBJECT_DIRECTORY=../objdir 262a3e9eb18Smrg num_cpus=1 263a3e9eb18Smrg if type -p getconf 2>/dev/null; then 264a3e9eb18Smrg num_cpus=`getconf _NPROCESSORS_ONLN 2>/dev/null` 265a3e9eb18Smrg case "$num_cpus" in 266a3e9eb18Smrg '' | 0* | *[!0-9]*) num_cpus=1;; 267a3e9eb18Smrg esac 268a3e9eb18Smrg fi 2694fee23f9Smrg contrib/gcc_build -d ${SOURCE_DIRECTORY} -o ${OBJECT_DIRECTORY} \ 270a3e9eb18Smrg -c "--enable-generated-files-in-srcdir --disable-multilib" \ 271a3e9eb18Smrg -m "-j$num_cpus" build || \ 2724fee23f9Smrg error "Could not rebuild GCC" 2734fee23f9Smrg fi 2744fee23f9Smrg 2754fee23f9Smrg # Move message catalogs to source directory. 2764fee23f9Smrg mv ../objdir/gcc/po/*.gmo gcc/po/ 2774fee23f9Smrg [ -f libcpp/po/cpplib.pot ] && mv ../objdir/libcpp/po/*.gmo libcpp/po/ 2784fee23f9Smrg 2794fee23f9Smrg # Create a "MD5SUMS" file to use for checking the validity of the release. 2804fee23f9Smrg echo \ 2814fee23f9Smrg"# This file contains the MD5 checksums of the files in the 282b17d1066Smrg# gcc-"${RELEASE}".tar.xz tarball. 2834fee23f9Smrg# 2844fee23f9Smrg# Besides verifying that all files in the tarball were correctly expanded, 2854fee23f9Smrg# it also can be used to determine if any files have changed since the 2864fee23f9Smrg# tarball was expanded or to verify that a patchfile was correctly applied. 2874fee23f9Smrg# 2884fee23f9Smrg# Suggested usage: 2894fee23f9Smrg# md5sum -c MD5SUMS | grep -v \"OK$\" 2903002e98eSmrg#" > MD5SUMS 2914fee23f9Smrg 2924fee23f9Smrg find . -type f | 2934fee23f9Smrg sed -e 's:^\./::' -e '/MD5SUMS/d' | 2944fee23f9Smrg sort | 2954fee23f9Smrg xargs md5sum >>MD5SUMS 2964fee23f9Smrg} 2974fee23f9Smrg 2984fee23f9Smrg# Build a single tarfile. The first argument is the name of the tarfile 2994fee23f9Smrg# to build, without any suffixes. They will be added automatically. The 3004fee23f9Smrg# rest of the arguments are files or directories to include, and possibly 3014fee23f9Smrg# other arguments to tar. 3024fee23f9Smrg 3034fee23f9Smrgbuild_tarfile() { 3044fee23f9Smrg # Get the name of the destination tar file. 305b17d1066Smrg TARFILE="$1.tar.xz" 3064fee23f9Smrg shift 3074fee23f9Smrg 3084fee23f9Smrg # Build the tar file itself. 309b17d1066Smrg (${TAR} cf - "$@" | ${XZ} > ${TARFILE}) || \ 3104fee23f9Smrg error "Could not build tarfile" 3114fee23f9Smrg FILE_LIST="${FILE_LIST} ${TARFILE}" 3124fee23f9Smrg} 3134fee23f9Smrg 3144fee23f9Smrg# Build the various tar files for the release. 3154fee23f9Smrg 3164fee23f9Smrgbuild_tarfiles() { 3174fee23f9Smrg inform "Building tarfiles" 3184fee23f9Smrg 3194fee23f9Smrg changedir "${WORKING_DIRECTORY}" 3204fee23f9Smrg 3214fee23f9Smrg # The GNU Coding Standards specify that all files should 3224fee23f9Smrg # world readable. 3234fee23f9Smrg chmod -R a+r ${SOURCE_DIRECTORY} 3244fee23f9Smrg # And that all directories have mode 755. 3254fee23f9Smrg find ${SOURCE_DIRECTORY} -type d -exec chmod 755 {} \; 3264fee23f9Smrg 3274fee23f9Smrg # Build one huge tarfile for the entire distribution. 3284fee23f9Smrg build_tarfile gcc-${RELEASE} `basename ${SOURCE_DIRECTORY}` 3294fee23f9Smrg} 3304fee23f9Smrg 3314fee23f9Smrg# Build .gz files. 3324fee23f9Smrgbuild_gzip() { 3334fee23f9Smrg for f in ${FILE_LIST}; do 334b17d1066Smrg target=${f%.xz}.gz 335b17d1066Smrg (${XZ} -d -c $f | ${GZIP} > ${target}) || error "Could not create ${target}" 3364fee23f9Smrg done 3374fee23f9Smrg} 3384fee23f9Smrg 3394fee23f9Smrg# Build diffs against an old release. 3404fee23f9Smrgbuild_diffs() { 3414fee23f9Smrg old_dir=${1%/*} 3424fee23f9Smrg old_file=${1##*/} 343b17d1066Smrg case "$old_file" in 344b17d1066Smrg *.tar.xz) old_vers=${old_file%.tar.xz};; 345b17d1066Smrg *) old_vers=${old_file%.tar.bz2};; 346b17d1066Smrg esac 3474fee23f9Smrg old_vers=${old_vers#gcc-} 3484fee23f9Smrg inform "Building diffs against version $old_vers" 34948fb7bfaSmrg for f in gcc; do 350b17d1066Smrg if [ -e ${old_dir}/${f}-${old_vers}.tar.xz ]; then 351b17d1066Smrg old_tar=${old_dir}/${f}-${old_vers}.tar.xz 352b17d1066Smrg else 3534fee23f9Smrg old_tar=${old_dir}/${f}-${old_vers}.tar.bz2 354b17d1066Smrg fi 355b17d1066Smrg new_tar=${WORKING_DIRECTORY}/${f}-${RELEASE}.tar.xz 3564fee23f9Smrg if [ ! -e $old_tar ]; then 3574fee23f9Smrg inform "$old_tar not found; not generating diff file" 3584fee23f9Smrg elif [ ! -e $new_tar ]; then 3594fee23f9Smrg inform "$new_tar not found; not generating diff file" 3604fee23f9Smrg else 3614fee23f9Smrg build_diff $old_tar gcc-${old_vers} $new_tar gcc-${RELEASE} \ 362b17d1066Smrg ${f}-${old_vers}-${RELEASE}.diff.xz 3634fee23f9Smrg fi 3644fee23f9Smrg done 3654fee23f9Smrg} 3664fee23f9Smrg 3674fee23f9Smrg# Build an individual diff. 3684fee23f9Smrgbuild_diff() { 3694fee23f9Smrg changedir "${WORKING_DIRECTORY}" 3704fee23f9Smrg tmpdir=gccdiff.$$ 3714fee23f9Smrg mkdir $tmpdir || error "Could not create directory $tmpdir" 3724fee23f9Smrg changedir $tmpdir 373b17d1066Smrg case "$1" in 374b17d1066Smrg *.tar.bz2) 3754fee23f9Smrg (${BZIP2} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs" 376b17d1066Smrg ;; 377b17d1066Smrg *.tar.xz) 378b17d1066Smrg (${XZ} -d -c $1 | ${TAR} xf - ) || error "Could not unpack $1 for diffs" 379b17d1066Smrg ;; 380b17d1066Smrg esac 381b17d1066Smrg (${XZ} -d -c $3 | ${TAR} xf - ) || error "Could not unpack $3 for diffs" 382b17d1066Smrg ${DIFF} $2 $4 > ../${5%.xz} 3834fee23f9Smrg if [ $? -eq 2 ]; then 3844fee23f9Smrg error "Trouble making diffs from $1 to $3" 3854fee23f9Smrg fi 386b17d1066Smrg ${XZ} ../${5%.xz} || error "Could not generate ../$5" 3874fee23f9Smrg changedir .. 3884fee23f9Smrg rm -rf $tmpdir 3894fee23f9Smrg FILE_LIST="${FILE_LIST} $5" 3904fee23f9Smrg} 3914fee23f9Smrg 3924fee23f9Smrg# Upload the files to the FTP server. 3934fee23f9Smrgupload_files() { 3944fee23f9Smrg inform "Uploading files" 3954fee23f9Smrg 3964fee23f9Smrg changedir "${WORKING_DIRECTORY}" 3974fee23f9Smrg 3984fee23f9Smrg # Make sure the directory exists on the server. 3994fee23f9Smrg if [ $LOCAL -eq 0 ]; then 4004fee23f9Smrg ${SSH} -l ${GCC_USERNAME} ${GCC_HOSTNAME} \ 401*fb8a8121Smrg mkdir -m 755 -p "${FTP_PATH}/diffs" 4024fee23f9Smrg UPLOAD_PATH="${GCC_USERNAME}@${GCC_HOSTNAME}:${FTP_PATH}" 4034fee23f9Smrg else 4044fee23f9Smrg mkdir -p "${FTP_PATH}/diffs" \ 4054fee23f9Smrg || error "Could not create \`${FTP_PATH}'" 4064fee23f9Smrg UPLOAD_PATH=${FTP_PATH} 4074fee23f9Smrg fi 4084fee23f9Smrg 4094fee23f9Smrg # Then copy files to their respective (sub)directories. 410b17d1066Smrg for x in gcc*.gz gcc*.xz; do 4114fee23f9Smrg if [ -e ${x} ]; then 4124fee23f9Smrg # Make sure the file will be readable on the server. 4134fee23f9Smrg chmod a+r ${x} 4144fee23f9Smrg # Copy it. 4154fee23f9Smrg case ${x} in 4164fee23f9Smrg *.diff.*) 4174fee23f9Smrg SUBDIR="diffs/"; 4184fee23f9Smrg ;; 4194fee23f9Smrg *) 4204fee23f9Smrg SUBDIR=""; 4214fee23f9Smrg esac 4224fee23f9Smrg ${SCP} ${x} ${UPLOAD_PATH}/${SUBDIR} \ 4234fee23f9Smrg || error "Could not upload ${x}" 4244fee23f9Smrg fi 4254fee23f9Smrg done 4264fee23f9Smrg} 4274fee23f9Smrg 4284fee23f9Smrg# Print description if snapshot exists. 4294fee23f9Smrgsnapshot_print() { 4304fee23f9Smrg if [ -e ${RELEASE}/$1 ]; then 431b17d1066Smrg hash=`openssl sha256 ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'` 43248fb7bfaSmrg hash2=`openssl sha1 ${RELEASE}/$1 | sed -e 's#(.*)##' -e 's# *= *#=#'` 43348fb7bfaSmrg 43448fb7bfaSmrg printf " %-37s%s\n\n %s\n %s\n\n" "$1" "$2" "$hash" "$hash2" \ 43548fb7bfaSmrg >> ${SNAPSHOT_README} 43648fb7bfaSmrg 4374fee23f9Smrg echo " <tr><td><a href=\"$1\">$1</a></td>" >> ${SNAPSHOT_INDEX} 4384fee23f9Smrg echo " <td>$2</td></tr>" >> ${SNAPSHOT_INDEX} 4394fee23f9Smrg fi 4404fee23f9Smrg} 4414fee23f9Smrg 4424fee23f9Smrg# Announce a snapshot, both on the web and via mail. 4434fee23f9Smrgannounce_snapshot() { 4444fee23f9Smrg inform "Updating links and READMEs on the FTP server" 4454fee23f9Smrg 4464fee23f9Smrg TEXT_DATE=`date --date=$DATE +%B\ %d,\ %Y` 4474fee23f9Smrg SNAPSHOT_README=${RELEASE}/README 4484fee23f9Smrg SNAPSHOT_INDEX=${RELEASE}/index.html 4494fee23f9Smrg 4504fee23f9Smrg changedir "${SNAPSHOTS_DIR}" 4514fee23f9Smrg echo \ 4524fee23f9Smrg"Snapshot gcc-"${RELEASE}" is now available on 453a3e9eb18Smrg https://gcc.gnu.org/pub/gcc/snapshots/"${RELEASE}"/ 4544fee23f9Smrgand on various mirrors, see http://gcc.gnu.org/mirrors.html for details. 4554fee23f9Smrg 456a3e9eb18SmrgThis snapshot has been generated from the GCC "${BRANCH}" git branch 457a3e9eb18Smrgwith the following options: "git://gcc.gnu.org/git/gcc.git branch ${GITBRANCH} revision ${GITREV}" 4584fee23f9Smrg 4594fee23f9SmrgYou'll find: 4604fee23f9Smrg" > ${SNAPSHOT_README} 4614fee23f9Smrg 4624fee23f9Smrg echo \ 4634fee23f9Smrg"<html> 4644fee23f9Smrg 4654fee23f9Smrg<head> 4664fee23f9Smrg<title>GCC "${RELEASE}" Snapshot</title> 4674fee23f9Smrg</head> 4684fee23f9Smrg 4694fee23f9Smrg<body> 4704fee23f9Smrg<h1>GCC "${RELEASE}" Snapshot</h1> 4714fee23f9Smrg 4724fee23f9Smrg<p>The <a href =\"http://gcc.gnu.org/\">GCC Project</a> makes 4734fee23f9Smrgperiodic snapshots of the GCC source tree available to the public 4744fee23f9Smrgfor testing purposes.</p> 4754fee23f9Smrg 4764fee23f9Smrg<p>If you are planning to download and use one of our snapshots, then 4774fee23f9Smrgwe highly recommend you join the GCC developers list. Details for 4784fee23f9Smrghow to sign up can be found on the GCC project home page.</p> 4794fee23f9Smrg 480a3e9eb18Smrg<p>This snapshot has been generated from the GCC "${BRANCH}" git branch 481a3e9eb18Smrgwith the following options: <code>"git://gcc.gnu.org/git/gcc.git branch ${GITBRANCH} revision ${GITREV}"</code></p> 4824fee23f9Smrg 4834fee23f9Smrg<table>" > ${SNAPSHOT_INDEX} 4844fee23f9Smrg 485b17d1066Smrg snapshot_print gcc-${RELEASE}.tar.xz "Complete GCC" 4864fee23f9Smrg 4874fee23f9Smrg echo \ 4884fee23f9Smrg"Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the diffs/ subdirectory. 4894fee23f9Smrg 4904fee23f9SmrgWhen a particular snapshot is ready for public consumption the LATEST-"${BRANCH}" 4914fee23f9Smrglink is updated and a message is sent to the gcc list. Please do not use 4924fee23f9Smrga snapshot before it has been announced that way." >> ${SNAPSHOT_README} 4934fee23f9Smrg 4944fee23f9Smrg echo \ 4954fee23f9Smrg"</table> 4964fee23f9Smrg<p>Diffs from "${BRANCH}"-"${LAST_DATE}" are available in the 4974fee23f9Smrg<a href=\"diffs/\">diffs/ subdirectory</a>.</p> 4984fee23f9Smrg 4994fee23f9Smrg<p>When a particular snapshot is ready for public consumption the LATEST-"${BRANCH}" 5004fee23f9Smrglink is updated and a message is sent to the gcc list. Please do not use 5014fee23f9Smrga snapshot before it has been announced that way.</p> 5024fee23f9Smrg 5034fee23f9Smrg<hr /> 5044fee23f9Smrg 5054fee23f9Smrg<address> 5064fee23f9Smrg<a href=\"mailto:gcc@gcc.gnu.org\">gcc@gcc.gnu.org</a> 5074fee23f9Smrg<br /> 5084fee23f9SmrgLast modified "${TEXT_DATE}" 5094fee23f9Smrg</address> 5104fee23f9Smrg</body> 5114fee23f9Smrg 5124fee23f9Smrg</html>" >> ${SNAPSHOT_INDEX} 5134fee23f9Smrg 5144fee23f9Smrg rm -f LATEST-${BRANCH} 5154fee23f9Smrg ln -s ${RELEASE} LATEST-${BRANCH} 5164fee23f9Smrg 5174fee23f9Smrg inform "Sending mail" 5184fee23f9Smrg 5194fee23f9Smrg export QMAILHOST=gcc.gnu.org 5204fee23f9Smrg mail -s "gcc-${RELEASE} is now available" gcc@gcc.gnu.org < ${SNAPSHOT_README} 5214fee23f9Smrg} 5224fee23f9Smrg 5234fee23f9Smrg######################################################################## 5244fee23f9Smrg# Initialization 5254fee23f9Smrg######################################################################## 5264fee23f9Smrg 5274fee23f9SmrgLC_ALL=C 5284fee23f9Smrgexport LC_ALL 5294fee23f9Smrg 5304fee23f9Smrg# Today's date. 5314fee23f9SmrgDATE=`date "+%Y%m%d"` 5324fee23f9SmrgLONG_DATE=`date "+%Y-%m-%d"` 5334fee23f9Smrg 534a3e9eb18SmrgGIT=${GIT:-git} 535a3e9eb18Smrg# The server containing the GCC repository. 536a3e9eb18SmrgGIT_SERVER="gcc.gnu.org" 5374fee23f9Smrg# The path to the repository on that server. 538a3e9eb18SmrgGIT_REPOSITORY="/git/gcc.git" 5394fee23f9Smrg# The username to use when connecting to the server. 540a3e9eb18SmrgGIT_USERNAME="${USER}" 5414fee23f9Smrg 5424fee23f9Smrg# The machine to which files will be uploaded. 5434fee23f9SmrgGCC_HOSTNAME="gcc.gnu.org" 5444fee23f9Smrg# The name of the account on the machine to which files are uploaded. 5454fee23f9SmrgGCC_USERNAME="gccadmin" 5464fee23f9Smrg# The directory in which the files will be placed (do not use ~user syntax). 5474fee23f9SmrgFTP_PATH=/var/ftp/pub/gcc 5484fee23f9Smrg# The directory in which snapshots will be placed. 5494fee23f9SmrgSNAPSHOTS_DIR=${FTP_PATH}/snapshots 5504fee23f9Smrg 5514fee23f9Smrg# The major number for the release. For release `3.0.2' this would be 5524fee23f9Smrg# `3' 5534fee23f9SmrgRELEASE_MAJOR="" 5544fee23f9Smrg# The minor number for the release. For release `3.0.2' this would be 5554fee23f9Smrg# `0'. 5564fee23f9SmrgRELEASE_MINOR="" 5574fee23f9Smrg# The revision number for the release. For release `3.0.2' this would 5584fee23f9Smrg# be `2'. 5594fee23f9SmrgRELEASE_REVISION="" 5604fee23f9Smrg# The complete name of the release. 5614fee23f9SmrgRELEASE="" 5624fee23f9Smrg 5634fee23f9Smrg# The name of the branch from which the release should be made, in a 5644fee23f9Smrg# user-friendly form. 5654fee23f9SmrgBRANCH="" 5664fee23f9Smrg 5674fee23f9Smrg# The name of the branch from which the release should be made, as used 5684fee23f9Smrg# for our version control system. 569a3e9eb18SmrgGITBRANCH="" 5704fee23f9Smrg 5714fee23f9Smrg# The tag to apply to the sources used for the release. 5724fee23f9SmrgTAG="" 5734fee23f9Smrg 5744fee23f9Smrg# The old tarballs from which to generate diffs. 5754fee23f9SmrgOLD_TARS="" 5764fee23f9Smrg 577181254a7Smrg# Local gcc git checkout to speed up git cloning. 578181254a7SmrgGIT_REFERENCE="" 579181254a7Smrg 5804fee23f9Smrg# The directory that will be used to construct the release. The 5814fee23f9Smrg# release itself will be placed in a subdirectory of this directory. 5824fee23f9SmrgDESTINATION=${HOME} 5834fee23f9Smrg# The subdirectory. 5844fee23f9SmrgWORKING_DIRECTORY="" 5854fee23f9Smrg# The directory that will contain the GCC sources. 5864fee23f9SmrgSOURCE_DIRECTORY="" 5874fee23f9Smrg 5884fee23f9Smrg# Non-zero if this is the final release, rather than a prerelease. 5894fee23f9SmrgFINAL=0 5904fee23f9Smrg 5914fee23f9Smrg# Non-zero if we are building a snapshot, and don't build gcc or 5924fee23f9Smrg# include generated files. 5934fee23f9SmrgSNAPSHOT=0 5944fee23f9Smrg 5954fee23f9Smrg# Non-zero if we are running locally on gcc.gnu.org, and use local CVS 5964fee23f9Smrg# and copy directly to the FTP directory. 5974fee23f9SmrgLOCAL=0 5984fee23f9Smrg 5994fee23f9Smrg# Major operation modes. 6004fee23f9SmrgMODE_GZIP=0 6014fee23f9SmrgMODE_DIFFS=0 6024fee23f9SmrgMODE_SOURCES=0 6034fee23f9SmrgMODE_TARFILES=0 6044fee23f9SmrgMODE_UPLOAD=0 6054fee23f9Smrg 606b17d1066Smrg# List of archive files generated; used to create .gz files from .xz. 6074fee23f9SmrgFILE_LIST="" 6084fee23f9Smrg 6094fee23f9Smrg# Programs we use. 6104fee23f9Smrg 6114fee23f9SmrgBZIP2="${BZIP2:-bzip2}" 612b17d1066SmrgXZ="${XZ:-xz --best}" 6134fee23f9SmrgCVS="${CVS:-cvs -f -Q -z9}" 6144fee23f9SmrgDIFF="${DIFF:-diff -Nrcpad}" 6154fee23f9SmrgENV="${ENV:-env}" 6164fee23f9SmrgGZIP="${GZIP:-gzip --best}" 6174fee23f9SmrgSCP="${SCP:-scp -p}" 6184fee23f9SmrgSSH="${SSH:-ssh}" 6194fee23f9SmrgTAR="${TAR:-tar}" 6204fee23f9Smrg 6214fee23f9Smrg######################################################################## 6224fee23f9Smrg# Command Line Processing 6234fee23f9Smrg######################################################################## 6244fee23f9Smrg 6254fee23f9Smrg# Parse the options. 626181254a7Smrgwhile getopts "d:fr:u:t:p:s:lb:" ARG; do 6274fee23f9Smrg case $ARG in 6284fee23f9Smrg d) DESTINATION="${OPTARG}";; 6294fee23f9Smrg r) RELEASE="${OPTARG}";; 6304fee23f9Smrg t) TAG="${OPTARG}";; 631a3e9eb18Smrg u) GIT_USERNAME="${OPTARG}";; 6324fee23f9Smrg f) FINAL=1;; 6334fee23f9Smrg s) SNAPSHOT=1 6344fee23f9Smrg BRANCH=${OPTARG%:*} 635a3e9eb18Smrg GITBRANCH=${OPTARG#*:} 6364fee23f9Smrg ;; 6374fee23f9Smrg l) LOCAL=1 6384fee23f9Smrg SCP=cp 6394fee23f9Smrg PATH=~:/usr/local/bin:$PATH;; 6404fee23f9Smrg p) OLD_TARS="${OLD_TARS} ${OPTARG}" 6414fee23f9Smrg if [ ! -f ${OPTARG} ]; then 6424fee23f9Smrg error "-p argument must name a tarball" 6434fee23f9Smrg fi;; 644181254a7Smrg b) GIT_REFERENCE="${OPTARG}";; 6454fee23f9Smrg \?) usage;; 6464fee23f9Smrg esac 6474fee23f9Smrgdone 6484fee23f9Smrgshift `expr ${OPTIND} - 1` 6494fee23f9Smrg 6504fee23f9Smrg# Handle the major modes. 6514fee23f9Smrgwhile [ $# -ne 0 ]; do 6524fee23f9Smrg case $1 in 6534fee23f9Smrg diffs) MODE_DIFFS=1;; 6544fee23f9Smrg gzip) MODE_GZIP=1;; 6554fee23f9Smrg sources) MODE_SOURCES=1;; 6564fee23f9Smrg tarfiles) MODE_TARFILES=1;; 6574fee23f9Smrg upload) MODE_UPLOAD=1;; 6584fee23f9Smrg all) MODE_SOURCES=1; MODE_TARFILES=1; MODE_DIFFS=1; MODE_UPLOAD=1; 6594fee23f9Smrg if [ $SNAPSHOT -ne 1 ]; then 6604fee23f9Smrg # Only for releases and pre-releases. 6614fee23f9Smrg MODE_GZIP=1; 6624fee23f9Smrg fi 6634fee23f9Smrg ;; 6644fee23f9Smrg *) error "Unknown mode $1";; 6654fee23f9Smrg esac 6664fee23f9Smrg shift 6674fee23f9Smrgdone 6684fee23f9Smrg 6694fee23f9Smrg# Perform consistency checking. 670a3e9eb18Smrgif [ ${LOCAL} -eq 0 ] && [ -z ${GIT_USERNAME} ]; then 6714fee23f9Smrg error "No username specified" 6724fee23f9Smrgfi 6734fee23f9Smrg 6744fee23f9Smrgif [ ! -d ${DESTINATION} ]; then 6754fee23f9Smrg error "\`${DESTINATION}' is not a directory" 6764fee23f9Smrgfi 6774fee23f9Smrg 6784fee23f9Smrgif [ $SNAPSHOT -eq 0 ]; then 6794fee23f9Smrg if [ -z ${RELEASE} ]; then 6804fee23f9Smrg error "No release number specified" 6814fee23f9Smrg fi 6824fee23f9Smrg 6834fee23f9Smrg # Compute the major and minor release numbers. 6844fee23f9Smrg RELEASE_MAJOR=`echo $RELEASE | awk --assign FS=. '{ print $1; }'` 6854fee23f9Smrg RELEASE_MINOR=`echo $RELEASE | awk --assign FS=. '{ print $2; }'` 6864fee23f9Smrg RELEASE_REVISION=`echo $RELEASE | awk --assign FS=. '{ print $3; }'` 6874fee23f9Smrg 6884fee23f9Smrg if [ -z "${RELEASE_MAJOR}" ] || [ -z "${RELEASE_MINOR}" ]; then 6894fee23f9Smrg error "Release number \`${RELEASE}' is invalid" 6904fee23f9Smrg fi 6914fee23f9Smrg 6924fee23f9Smrg # Compute the full name of the release. 6934fee23f9Smrg if [ -z "${RELEASE_REVISION}" ]; then 6944fee23f9Smrg RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}" 6954fee23f9Smrg else 6964fee23f9Smrg RELEASE="${RELEASE_MAJOR}.${RELEASE_MINOR}.${RELEASE_REVISION}" 6974fee23f9Smrg fi 6984fee23f9Smrg 6994fee23f9Smrg # Compute the name of the branch, which is based solely on the major 700a3e9eb18Smrg # release number. 701a3e9eb18Smrg GITBRANCH="releases/gcc-${RELEASE_MAJOR}" 7024fee23f9Smrg 7034fee23f9Smrg # If this is not a final release, set various parameters accordingly. 7044fee23f9Smrg if [ ${FINAL} -ne 1 ]; then 7054fee23f9Smrg RELEASE="${RELEASE}-RC-${DATE}" 7064fee23f9Smrg FTP_PATH="${SNAPSHOTS_DIR}/${RELEASE}" 7074fee23f9Smrg else 7084fee23f9Smrg FTP_PATH="${FTP_PATH}/releases/gcc-${RELEASE}/" 7094fee23f9Smrg fi 7104fee23f9Smrgelse 7114fee23f9Smrg RELEASE=${BRANCH}-${DATE} 7124fee23f9Smrg FTP_PATH="${FTP_PATH}/snapshots/${RELEASE}" 7134fee23f9Smrg 7144fee23f9Smrg # If diffs are requested when building locally on gcc.gnu.org, we (usually) 7154fee23f9Smrg # know what the last snapshot date was and take the corresponding tarballs, 7164fee23f9Smrg # unless the user specified tarballs explicitly. 7174fee23f9Smrg if [ $MODE_DIFFS -ne 0 ] && [ $LOCAL -ne 0 ] && [ -z "${OLD_TARS}" ]; then 7184fee23f9Smrg LAST_DATE=`cat ~/.snapshot_date-${BRANCH}` 7194fee23f9Smrg OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.bz2 720b17d1066Smrg if [ ! -e $OLD_TARS ]; then 721b17d1066Smrg OLD_TARS=${SNAPSHOTS_DIR}/${BRANCH}-${LAST_DATE}/gcc-${BRANCH}-${LAST_DATE}.tar.xz 722b17d1066Smrg fi 7234fee23f9Smrg fi 7244fee23f9Smrgfi 7254fee23f9Smrg 7264fee23f9Smrg# Compute the name of the WORKING_DIRECTORY and the SOURCE_DIRECTORY. 7274fee23f9SmrgWORKING_DIRECTORY="${DESTINATION}/gcc-${RELEASE}" 7284fee23f9SmrgSOURCE_DIRECTORY="${WORKING_DIRECTORY}/gcc-${RELEASE}" 7294fee23f9Smrg 730a3e9eb18Smrg# Set up GITROOT. 7314fee23f9Smrgif [ $LOCAL -eq 0 ]; then 732a3e9eb18Smrg GITROOT="git+ssh://${GIT_USERNAME}@${GIT_SERVER}${GIT_REPOSITORY}" 7334fee23f9Smrgelse 734a3e9eb18Smrg GITROOT="/git/gcc.git" 7354fee23f9Smrgfi 736a3e9eb18Smrgexport GITROOT 7374fee23f9Smrg 7384fee23f9Smrg######################################################################## 7394fee23f9Smrg# Main Program 7404fee23f9Smrg######################################################################## 7414fee23f9Smrg 7424fee23f9Smrg# Set the timezone to UTC 7434fee23f9SmrgTZ="UTC0" 7444fee23f9Smrgexport TZ 7454fee23f9Smrg 7464fee23f9Smrg# Build the source directory. 7474fee23f9Smrg 7484fee23f9Smrgif [ $MODE_SOURCES -ne 0 ]; then 7494fee23f9Smrg build_sources 7504fee23f9Smrgfi 7514fee23f9Smrg 7524fee23f9Smrg# Build the tar files. 7534fee23f9Smrg 7544fee23f9Smrgif [ $MODE_TARFILES -ne 0 ]; then 7554fee23f9Smrg build_tarfiles 7564fee23f9Smrgfi 7574fee23f9Smrg 7584fee23f9Smrg# Build diffs 7594fee23f9Smrg 7604fee23f9Smrgif [ $MODE_DIFFS -ne 0 ]; then 7614fee23f9Smrg # Possibly build diffs. 7624fee23f9Smrg if [ -n "$OLD_TARS" ]; then 7634fee23f9Smrg for old_tar in $OLD_TARS; do 7644fee23f9Smrg build_diffs $old_tar 7654fee23f9Smrg done 7664fee23f9Smrg fi 7674fee23f9Smrgfi 7684fee23f9Smrg 7694fee23f9Smrg# Build gzip files 7704fee23f9Smrgif [ $MODE_GZIP -ne 0 ]; then 7714fee23f9Smrg build_gzip 7724fee23f9Smrgfi 7734fee23f9Smrg 7744fee23f9Smrg# Upload them to the FTP server. 7754fee23f9Smrgif [ $MODE_UPLOAD -ne 0 ]; then 7764fee23f9Smrg upload_files 7774fee23f9Smrg 7784fee23f9Smrg # For snapshots, make some further updates. 7794fee23f9Smrg if [ $SNAPSHOT -ne 0 ] && [ $LOCAL -ne 0 ]; then 7804fee23f9Smrg announce_snapshot 7814fee23f9Smrg 7824fee23f9Smrg # Update snapshot date file. 7834fee23f9Smrg changedir ~ 7844fee23f9Smrg echo $DATE > .snapshot_date-${BRANCH} 7854fee23f9Smrg 7864fee23f9Smrg # Remove working directory 7874fee23f9Smrg rm -rf ${WORKING_DIRECTORY} 7884fee23f9Smrg fi 7894fee23f9Smrgfi 790