1#!/usr/bin/env bash 2# Copyright (C) 1990-2020 Free Software Foundation 3# 4# This file is free software; you can redistribute it and/or modify 5# it under the terms of the GNU General Public License as published by 6# the Free Software Foundation; either version 3 of the License, or 7# (at your option) any later version. 8# 9# This program is distributed in the hope that it will be useful, 10# but WITHOUT ANY WARRANTY; without even the implied warranty of 11# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12# GNU General Public License for more details. 13# 14# You should have received a copy of the GNU General Public License 15# along with this program. If not, see <http://www.gnu.org/licenses/>. 16# 17 18# This script creates release packages for gdb, binutils, and other 19# packages which live in src. It used to be implemented as the src-release 20# Makefile and prior to that was part of the top level Makefile, but that 21# turned out to be very messy and hard to maintain. 22 23set -e 24 25BZIPPROG=bzip2 26GZIPPROG=gzip 27LZIPPROG=lzip 28XZPROG=xz 29SHA256PROG=sha256sum 30MAKE=make 31CC=gcc 32CXX=g++ 33release_date= 34 35# Default to avoid splitting info files by setting the threshold high. 36MAKEINFOFLAGS=--split-size=5000000 37 38# 39# Support for building net releases 40 41# Files in root used in any net release. 42DEVO_SUPPORT="ar-lib ChangeLog ChangeLog.git compile config config-ml.in config.guess \ 43 config.rpath config.sub configure configure.ac COPYING COPYING.LIB \ 44 COPYING3 COPYING3.LIB depcomp install-sh libtool.m4 ltgcc.m4 \ 45 ltmain.sh ltoptions.m4 ltsugar.m4 ltversion.m4 lt~obsolete.m4 \ 46 MAINTAINERS Makefile.def Makefile.in Makefile.tpl missing mkdep \ 47 mkinstalldirs move-if-change README README-maintainer-mode \ 48 SECURITY.txt src-release.sh symlink-tree test-driver ylwrap \ 49 multilib.am" 50 51# Files in devo/etc used in any net release. 52ETC_SUPPORT="Makefile.in configure configure.in standards.texi \ 53 make-stds.texi standards.info* configure.texi configure.info* \ 54 ChangeLog configbuild.* configdev.* fdl.texi texi2pod.pl gnu-oids.texi" 55 56# Get the version number of a given tool 57getver() 58{ 59 tool=$1 60 if grep 'AC_INIT.*BFD_VERSION' $tool/configure.ac >/dev/null 2>&1; then 61 bfd/configure --version | sed -n -e '1s,.* ,,p' 62 elif test -f $tool/common/create-version.sh; then 63 $tool/common/create-version.sh $tool 'dummy-host' 'dummy-target' VER.tmp 64 cat VER.tmp | grep 'version\[\]' | sed 's/.*"\([^"]*\)".*/\1/' | sed 's/-git$//' 65 rm -f VER.tmp 66 elif test $tool = "gdb"; then 67 ./gdbsupport/create-version.sh $tool 'dummy-host' 'dummy-target' VER.tmp 68 cat VER.tmp | grep 'version\[\]' | sed 's/.*"\([^"]*\)".*/\1/' | sed 's/-git$//' 69 rm -f VER.tmp 70 elif test -f $tool/version.in; then 71 head -n 1 $tool/version.in 72 else 73 echo VERSION 74 fi 75} 76 77# Setup build directory for building release tarball 78do_proto_toplev() 79{ 80 package=$1 81 ver=$2 82 tool=$3 83 support_files=$4 84 85 echo "==> Cleaning sources." 86 find \( -name "*.orig" -o -name "*.rej" -o -name "*~" -o -name ".#*" -o -name "*~$bkpat" \) -exec rm {} \; 87 88 echo "==> Making $package-$ver/" 89 # Take out texinfo from a few places. 90 sed -e '/^all\.normal: /s/\all-texinfo //' \ 91 -e '/^ install-texinfo /d' \ 92 <Makefile.in >tmp 93 mv -f tmp Makefile.in 94 # configure. --enable-gold is needed to ensure .c/.h from .y are 95 # built in the gold dir. The disables speed the build a little. 96 enables= 97 disables= 98 for dir in binutils gas gdb gold gprof gprofng libsframe ld libctf libdecnumber readline sim; do 99 case " $tool $support_files " in 100 *" $dir "*) enables="$enables --enable-$dir" ;; 101 *) disables="$disables --disable-$dir" ;; 102 esac 103 done 104 echo "==> configure --target=i386-pc-linux-gnu $disables $enables" 105 ./configure --target=i386-pc-linux-gnu $disables $enables 106 $MAKE configure-host configure-target \ 107 ALL_GCC="" ALL_GCC_C="" ALL_GCC_CXX="" \ 108 CC_FOR_TARGET="$CC" CXX_FOR_TARGET="$CXX" 109 # Make links, and run "make diststuff" or "make info" when needed. 110 rm -rf proto-toplev 111 mkdir proto-toplev 112 dirs="$DEVO_SUPPORT $support_files $tool" 113 for d in $dirs ; do 114 if [ -d $d ]; then 115 if [ ! -f $d/Makefile ] ; then 116 true 117 elif grep '^diststuff:' $d/Makefile >/dev/null ; then 118 (cd $d ; $MAKE MAKEINFOFLAGS="$MAKEINFOFLAGS" diststuff) \ 119 || exit 1 120 elif grep '^info:' $d/Makefile >/dev/null ; then 121 (cd $d ; $MAKE MAKEINFOFLAGS="$MAKEINFOFLAGS" info) \ 122 || exit 1 123 fi 124 if [ -d $d/proto-$d.dir ]; then 125 ln -s ../$d/proto-$d.dir proto-toplev/$d 126 else 127 ln -s ../$d proto-toplev/$d 128 fi 129 else 130 if (echo x$d | grep / >/dev/null); then 131 mkdir -p proto-toplev/`dirname $d` 132 x=`dirname $d` 133 ln -s ../`echo $x/ | sed -e 's,[^/]*/,../,g'`$d proto-toplev/$d 134 else 135 ln -s ../$d proto-toplev/$d 136 fi 137 fi 138 done 139 (cd etc; $MAKE MAKEINFOFLAGS="$MAKEINFOFLAGS" info) 140 $MAKE distclean 141 mkdir proto-toplev/etc 142 (cd proto-toplev/etc; 143 for i in $ETC_SUPPORT; do 144 ln -s ../../etc/$i . 145 done) 146 # 147 # Take out texinfo from configurable dirs 148 rm proto-toplev/configure.ac 149 sed -e '/^host_tools=/s/texinfo //' \ 150 <configure.ac >proto-toplev/configure.ac 151 # 152 mkdir proto-toplev/texinfo 153 ln -s ../../texinfo/texinfo.tex proto-toplev/texinfo/ 154 if test -r texinfo/util/tex3patch ; then 155 mkdir proto-toplev/texinfo/util && \ 156 ln -s ../../../texinfo/util/tex3patch proto-toplev/texinfo/util 157 fi 158 chmod -R og=u . || chmod og=u `find . -print` 159 # 160 # Create .gmo files from .po files. 161 for f in `find . -name '*.po' -type f -print`; do 162 msgfmt -o `echo $f | sed -e 's/\.po$/.gmo/'` $f 163 done 164 # 165 rm -f $package-$ver 166 ln -s proto-toplev $package-$ver 167} 168 169CVS_NAMES='-name CVS -o -name .cvsignore' 170 171# Add a sha256sum to the built tarball 172do_sha256sum() 173{ 174 echo "==> Adding sha256 checksum to top-level directory" 175 (cd proto-toplev && find * -follow \( $CVS_NAMES \) -prune \ 176 -o -type f -print \ 177 | xargs $SHA256PROG > ../sha256.new) 178 rm -f proto-toplev/sha256.sum 179 mv sha256.new proto-toplev/sha256.sum 180} 181 182# Build the release tarball 183do_tar() 184{ 185 package=$1 186 ver=$2 187 echo "==> Making $package-$ver.tar" 188 rm -f $package-$ver.tar 189 if test x$release_date == "x" ; then 190 find $package-$ver -follow \( $CVS_NAMES \) -prune -o -type f -print \ 191 | tar cTfh - $package-$ver.tar 192 else 193 # Attempt to create a consistent, reproducible tarball using the 194 # specified date. 195 find $package-$ver -follow \( $CVS_NAMES \) -prune -o -type f -print \ 196 | LC_ALL=C sort \ 197 | tar cTfh - $package-$ver.tar \ 198 --mtime=$release_date --group=0 --owner=0 199 fi 200} 201 202# Compress the output with bzip2 203do_bz2() 204{ 205 package=$1 206 ver=$2 207 echo "==> Bzipping $package-$ver.tar.bz2" 208 rm -f $package-$ver.tar.bz2 209 $BZIPPROG -k -v -9 $package-$ver.tar 210} 211 212# Compress the output with gzip 213do_gz() 214{ 215 package=$1 216 ver=$2 217 echo "==> Gzipping $package-$ver.tar.gz" 218 rm -f $package-$ver.tar.gz 219 $GZIPPROG -k -v -9 $package-$ver.tar 220} 221 222# Compress the output with lzip 223do_lz() 224{ 225 package=$1 226 ver=$2 227 echo "==> Lzipping $package-$ver.tar.lz" 228 rm -f $package-$ver.tar.lz 229 $LZIPPROG -k -v -9 $package-$ver.tar 230} 231 232# Compress the output with xz 233do_xz() 234{ 235 package=$1 236 ver=$2 237 echo "==> Xzipping $package-$ver.tar.xz" 238 rm -f $package-$ver.tar.xz 239 $XZPROG -k -v -9 $package-$ver.tar 240} 241 242# Compress the output with all selected compresion methods 243do_compress() 244{ 245 package=$1 246 ver=$2 247 compressors=$3 248 for comp in $compressors; do 249 case $comp in 250 bz2) 251 do_bz2 $package $ver;; 252 gz) 253 do_gz $package $ver;; 254 lz) 255 do_lz $package $ver;; 256 xz) 257 do_xz $package $ver;; 258 *) 259 echo "Unknown compression method: $comp" && exit 1;; 260 esac 261 done 262} 263 264# Add djunpack.bat the tarball 265do_djunpack() 266{ 267 package=$1 268 ver=$2 269 echo "==> Adding updated djunpack.bat to top-level directory" 270 echo - 's /gdb-[0-9\.]*/$package-'"$ver"'/' 271 sed < djunpack.bat > djunpack.new \ 272 -e 's/gdb-[0-9][0-9\.]*/$package-'"$ver"'/' 273 rm -f proto-toplev/djunpack.bat 274 mv djunpack.new proto-toplev/djunpack.bat 275} 276 277# Create a release package, tar it and compress it 278tar_compress() 279{ 280 package=$1 281 tool=$2 282 support_files=$3 283 compressors=$4 284 verdir=${5:-$tool} 285 ver=$(getver $verdir) 286 do_proto_toplev $package $ver $tool "$support_files" 287 do_sha256sum 288 do_tar $package $ver 289 do_compress $package $ver "$compressors" 290} 291 292# Create a gdb release package, tar it and compress it 293gdb_tar_compress() 294{ 295 package=$1 296 tool=$2 297 support_files=$3 298 compressors=$4 299 ver=$(getver $tool) 300 do_proto_toplev $package $ver $tool "$support_files" 301 do_sha256sum 302 do_djunpack $package $ver 303 do_tar $package $ver 304 do_compress $package $ver "$compressors" 305} 306 307# The FSF "binutils" release includes gprof and ld. 308BINUTILS_SUPPORT_DIRS="libsframe bfd gas include libiberty libctf opcodes ld elfcpp gold gprof gprofng setup.com makefile.vms cpu zlib" 309binutils_release() 310{ 311 compressors=$1 312 package=binutils 313 tool=binutils 314 tar_compress $package $tool "$BINUTILS_SUPPORT_DIRS" "$compressors" 315} 316 317GAS_SUPPORT_DIRS="bfd include libiberty opcodes setup.com makefile.vms zlib" 318gas_release() 319{ 320 compressors=$1 321 package=gas 322 tool=gas 323 tar_compress $package $tool "$GAS_SUPPORT_DIRS" "$compressors" 324} 325 326GDB_SUPPORT_DIRS="libsframe bfd include libiberty libctf opcodes readline sim libdecnumber cpu zlib contrib gnulib gdbsupport gdbserver libbacktrace" 327gdb_release() 328{ 329 compressors=$1 330 package=gdb 331 tool=gdb 332 gdb_tar_compress $package $tool "$GDB_SUPPORT_DIRS" "$compressors" 333} 334 335# Corresponding to the CVS "sim" module. 336SIM_SUPPORT_DIRS="libsframe bfd opcodes libiberty libctf/swap.h include gdb/version.in gdb/common/create-version.sh makefile.vms zlib gnulib" 337sim_release() 338{ 339 compressors=$1 340 package=sim 341 tool=sim 342 tar_compress $package $tool "$SIM_SUPPORT_DIRS" "$compressors" gdb 343} 344 345usage() 346{ 347 echo "src-release.sh <options> <release>" 348 echo "options:" 349 echo " -b: Compress with bzip2" 350 echo " -g: Compress with gzip" 351 echo " -l: Compress with lzip" 352 echo " -x: Compress with xz" 353 echo " -r <date>: Create a reproducible tarball using <date> as the mtime" 354 exit 1 355} 356 357build_release() 358{ 359 release=$1 360 compressors=$2 361 case $release in 362 binutils) 363 binutils_release "$compressors";; 364 gas) 365 gas_release "$compressors";; 366 gdb) 367 gdb_release "$compressors";; 368 sim) 369 sim_release "$compressors";; 370 *) 371 echo "Unknown release name: $release" && usage;; 372 esac 373} 374 375compressors="" 376 377while getopts ":bglr:x" opt; do 378 case $opt in 379 b) 380 compressors="$compressors bz2";; 381 g) 382 compressors="$compressors gz";; 383 l) 384 compressors="$compressors lz";; 385 r) 386 release_date=$OPTARG;; 387 x) 388 compressors="$compressors xz";; 389 \?) 390 echo "Invalid option: -$OPTARG" && usage;; 391 esac 392done 393shift $((OPTIND -1)) 394release=$1 395 396build_release $release "$compressors" 397