#!/usr/bin/env bash
# Copyright (C) 1990-2014 Free Software Foundation
#
# This file is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#
# This script creates release packages for gdb, binutils, and other
# packages which live in src. It used to be implemented as the src-release
# Makefile and prior to that was part of the top level Makefile, but that
# turned out to be very messy and hard to maintain.
set -e
setglobal BZIPPROG = 'bzip2'
setglobal GZIPPROG = 'gzip'
setglobal XZPROG = 'xz'
setglobal MD5PROG = 'md5sum'
setglobal MAKE = 'make'
setglobal CC = 'gcc'
setglobal CXX = 'g++'
# Default to avoid splitting info files by setting the threshold high.
setglobal MAKEINFOFLAGS = '--split-size=5000000'
#
# Support for building net releases
# Files in devo used in any net release.
setglobal DEVO_SUPPORT = '"README Makefile.in configure configure.ac \
config.guess config.sub config move-if-change \
COPYING COPYING.LIB install-sh config-ml.in symlink-tree \
mkinstalldirs ltmain.sh missing ylwrap \
libtool.m4 ltsugar.m4 ltversion.m4 ltoptions.m4 \
Makefile.def Makefile.tpl src-release.sh config.rpath \
ChangeLog MAINTAINERS README-maintainer-mode \
lt~obsolete.m4 ltgcc.m4 depcomp mkdep compile \
COPYING3 COPYING3.LIB'"
# Files in devo/etc used in any net release.
setglobal ETC_SUPPORT = '"Makefile.in configure configure.in standards.texi \
make-stds.texi standards.info* configure.texi configure.info* \
ChangeLog configbuild.* configdev.* fdl.texi texi2pod.pl gnu-oids.texi'"
# Get the version number of a given tool
proc getver
{
setglobal tool = $1
if grep 'AC_INIT.*BFD_VERSION' $tool/configure.ac >/dev/null !2 > !1 {
bfd/configure --version | sed -n -e '1s,.* ,,p'
} elif test -f $tool/common/create-version.sh {
$tool/common/create-version.sh $tool 'dummy-host' 'dummy-target' VER.tmp
cat VER.tmp | grep 'version\[\]' | sed 's/.*"\([^"]*\)".*/\1/' | sed 's/-cvs$//'
rm -f VER.tmp
} elif test -f $tool/version.in {
head -1 $tool/version.in
} else {
echo VERSION
}
}
# Setup build directory for building release tarball
proc do_proto_toplev
{
setglobal package = $1
setglobal ver = $2
setglobal tool = $3
setglobal support_files = $4
echo "==> Making $package-$ver/"
# Take out texinfo from a few places.
sed -e '/^all\.normal: /s/\all-texinfo //' \
-e '/^ install-texinfo /d' \
tmp
mv -f tmp Makefile.in
#
./configure --target=i386-pc-linux-gnu
$MAKE configure-host configure-target \
ALL_GCC="" ALL_GCC_C="" ALL_GCC_CXX="" \
CC_FOR_TARGET="$CC" CXX_FOR_TARGET="$CXX"
# Make links, and run "make diststuff" or "make info" when needed.
rm -rf proto-toplev
mkdir proto-toplev
setglobal dirs = ""$DEVO_SUPPORT $support_files $tool""
for d in [$dirs] {
if test -d $d {
if test ! -f $d/Makefile {
true
} elif grep '^diststuff:' $d/Makefile >/dev/null {
shell {cd $d ; $MAKE MAKEINFOFLAGS="$MAKEINFOFLAGS" diststuff} \
|| exit 1
} elif grep '^info:' $d/Makefile >/dev/null {
shell {cd $d ; $MAKE MAKEINFOFLAGS="$MAKEINFOFLAGS" info} \
|| exit 1
}
if test -d $d/proto-$d.dir {
ln -s ../$d/proto-$d.dir proto-toplev/$d
} else {
ln -s ../$d proto-toplev/$d
}
} else {
if shell {echo x$d | grep / >/dev/null} {
mkdir -p proto-toplev/$[dirname $d]
setglobal x = $[dirname $d]
ln -s ../$[echo $x/ | sed -e 's,[^/]*/,../,g]$d proto-toplev/$d
} else {
ln -s ../$d proto-toplev/$d
}
}
}
shell {cd etc; $MAKE MAKEINFOFLAGS="$MAKEINFOFLAGS" info}
$MAKE distclean
mkdir proto-toplev/etc
shell {cd proto-toplev/etc;
for i in [$ETC_SUPPORT] {
ln -s ../../etc/$i .
}}
#
# Take out texinfo from configurable dirs
rm proto-toplev/configure.ac
sed -e '/^host_tools=/s/texinfo //' \
proto-toplev/configure.ac
#
mkdir proto-toplev/texinfo
ln -s ../../texinfo/texinfo.tex proto-toplev/texinfo/
if test -r texinfo/util/tex3patch {
mkdir proto-toplev/texinfo/util && \
ln -s ../../../texinfo/util/tex3patch proto-toplev/texinfo/util
} else {
true
}
chmod -R og=u . || chmod og=u $[find . -print]
#
# Create .gmo files from .po files.
for f in [$[find . -name '*.po' -type f -print]] {
msgfmt -o $[echo $f | sed -e 's/\.po$/.gmo/] $f
}
#
rm -f $package-$ver
ln -s proto-toplev $package-$ver
}
setglobal CVS_NAMES = ''-name CVS -o -name .cvsignore''
# Add an md5sum to the built tarball
proc do_md5sum
{
echo "==> Adding md5 checksum to top-level directory"
shell {cd proto-toplev && find * -follow '(' $CVS_NAMES ')' -prune \
-o -type f -print \
| xargs $MD5PROG > ../md5.new}
rm -f proto-toplev/md5.sum
mv md5.new proto-toplev/md5.sum
}
# Build the release tarball
proc do_tar
{
setglobal package = $1
setglobal ver = $2
echo "==> Making $package-$ver.tar"
rm -f $package-$ver.tar
find $package-$ver -follow '(' $CVS_NAMES ')' -prune \
-o -type f -print \
| tar cTfh - $package-$ver.tar
}
# Compress the output with bzip2
proc do_bz2
{
setglobal package = $1
setglobal ver = $2
echo "==> Bzipping $package-$ver.tar.bz2"
rm -f $package-$ver.tar.bz2
$BZIPPROG -k -v -9 $package-$ver.tar
}
# Compress the output with gzip
proc do_gz
{
setglobal package = $1
setglobal ver = $2
echo "==> Gzipping $package-$ver.tar.gz"
rm -f $package-$ver.tar.gz
$GZIPPROG -k -v -9 $package-$ver.tar
}
# Compress the output with xz
proc do_xz
{
setglobal package = $1
setglobal ver = $2
echo "==> Xzipping $package-$ver.tar.xz"
rm -f $package-$ver.tar.xz
$XZPROG -k -v -9 $package-$ver.tar
}
# Compress the output with all selected compresion methods
proc do_compress
{
setglobal package = $1
setglobal ver = $2
setglobal compressors = $3
for comp in [$compressors] {
match $comp {
with bz2
do_bz2 $package $ver
with gz
do_gz $package $ver
with xz
do_xz $package $ver
with *
echo "Unknown compression method: $comp" && exit 1
}
}
}
# Add djunpack.bat the tarball
proc do_djunpack
{
setglobal package = $1
setglobal ver = $2
echo "==> Adding updated djunpack.bat to top-level directory"
echo - 's /gdb-[0-9\.]*/$package-'"$ver"'/'
sed < djunpack.bat > djunpack.new \
-e 's/gdb-[0-9][0-9\.]*/$package-'"$ver"'/< djunpack.bat > djunpack.new \
-e 's/gdb-[0-9][0-9\.]*/$package-'"$ver"'/'
rm -f proto-toplev/djunpack.bat
mv djunpack.new proto-toplev/djunpack.bat
}
# Create a release package, tar it and compress it
proc tar_compress
{
setglobal package = $1
setglobal tool = $2
setglobal support_files = $3
setglobal compressors = $4
setglobal verdir = $(5:-$tool)
setglobal ver = $[getver $verdir]
do_proto_toplev $package $ver $tool $support_files
do_md5sum
do_tar $package $ver
do_compress $package $ver $compressors
}
# Create a gdb release package, tar it and compress it
proc gdb_tar_compress
{
setglobal package = $1
setglobal tool = $2
setglobal support_files = $3
setglobal compressors = $4
setglobal ver = $[getver $tool]
do_proto_toplev $package $ver $tool $support_files
do_md5sum
do_djunpack $package $ver
do_tar $package $ver
do_compress $package $ver $compressors
}
# The FSF "binutils" release includes gprof and ld.
setglobal BINUTILS_SUPPORT_DIRS = '"bfd gas include libiberty opcodes ld elfcpp gold gprof intl setup.com makefile.vms cpu zlib'"
proc binutils_release
{
setglobal compressors = $1
setglobal package = 'binutils'
setglobal tool = 'binutils'
tar_compress $package $tool $BINUTILS_SUPPORT_DIRS $compressors
}
setglobal GAS_SUPPORT_DIRS = '"bfd include libiberty opcodes intl setup.com makefile.vms zlib'"
proc gas_release
{
setglobal compressors = $1
setglobal package = 'gas'
setglobal tool = 'gas'
tar_compress $package $tool $GAS_SUPPORT_DIRS $compressors
}
setglobal GDB_SUPPORT_DIRS = '"bfd include libiberty opcodes readline sim intl libdecnumber cpu zlib'"
proc gdb_release
{
setglobal compressors = $1
setglobal package = 'gdb'
setglobal tool = 'gdb'
gdb_tar_compress $package $tool $GDB_SUPPORT_DIRS $compressors
}
# Corresponding to the CVS "sim" module.
setglobal SIM_SUPPORT_DIRS = '"bfd opcodes libiberty include intl gdb/version.in gdb/common/create-version.sh makefile.vms zlib'"
proc sim_release
{
setglobal compressors = $1
setglobal package = 'sim'
setglobal tool = 'sim'
tar_compress $package $tool $SIM_SUPPORT_DIRS $compressors gdb
}
proc usage
{
echo "src-release.sh "
echo "options:"
echo " -b: Compress with bzip2"
echo " -g: Compress with gzip"
echo " -x: Compress with xz"
exit 1
}
proc build_release
{
setglobal release = $1
setglobal compressors = $2
match $release {
with binutils
binutils_release $compressors
with gas
gas_release $compressors
with gdb
gdb_release $compressors
with sim
sim_release $compressors
with *
echo "Unknown release name: $release" && usage
}
}
setglobal compressors = ''""
while getopts ":gbx" opt {
match $opt {
with b
setglobal compressors = ""$compressors bz2""
with g
setglobal compressors = ""$compressors gz""
with x
setglobal compressors = ""$compressors xz""
with \?
echo "Invalid option: -$OPTARG" && usage
}
}
shift $shExpr('OPTIND -1')
setglobal release = $1
build_release $release $compressors