#!/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
setvar BZIPPROG = 'bzip2'
setvar GZIPPROG = 'gzip'
setvar XZPROG = 'xz'
setvar MD5PROG = 'md5sum'
setvar MAKE = 'make'
setvar CC = 'gcc'
setvar CXX = "g++"
# Default to avoid splitting info files by setting the threshold high.
setvar MAKEINFOFLAGS = "--split-size=5000000"
#
# Support for building net releases
# Files in devo used in any net release.
setvar 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.
setvar 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 {
setvar 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 {
setvar package = "$1"
setvar ver = "$2"
setvar tool = "$3"
setvar 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
setvar 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)
setvar 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
}
setvar 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 {
setvar package = "$1"
setvar 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 {
setvar package = "$1"
setvar 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 {
setvar package = "$1"
setvar 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 {
setvar package = "$1"
setvar 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 {
setvar package = "$1"
setvar ver = "$2"
setvar compressors = "$3"
for comp in $compressors {
case (comp) {
bz2 {
do_bz2 $package $ver}
gz {
do_gz $package $ver}
xz {
do_xz $package $ver}
* {
echo "Unknown compression method: $comp" && exit 1}
}
}
}
# Add djunpack.bat the tarball
proc do_djunpack {
setvar package = "$1"
setvar 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 {
setvar package = "$1"
setvar tool = "$2"
setvar support_files = "$3"
setvar compressors = "$4"
setvar verdir = ${5:-$tool}
setvar 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 {
setvar package = "$1"
setvar tool = "$2"
setvar support_files = "$3"
setvar compressors = "$4"
setvar 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.
setvar BINUTILS_SUPPORT_DIRS = ""bfd gas include libiberty opcodes ld elfcpp gold gprof intl setup.com makefile.vms cpu zlib""
proc binutils_release {
setvar compressors = "$1"
setvar package = 'binutils'
setvar tool = 'binutils'
tar_compress $package $tool $BINUTILS_SUPPORT_DIRS $compressors
}
setvar GAS_SUPPORT_DIRS = ""bfd include libiberty opcodes intl setup.com makefile.vms zlib""
proc gas_release {
setvar compressors = "$1"
setvar package = 'gas'
setvar tool = 'gas'
tar_compress $package $tool $GAS_SUPPORT_DIRS $compressors
}
setvar GDB_SUPPORT_DIRS = ""bfd include libiberty opcodes readline sim intl libdecnumber cpu zlib""
proc gdb_release {
setvar compressors = "$1"
setvar package = 'gdb'
setvar tool = 'gdb'
gdb_tar_compress $package $tool $GDB_SUPPORT_DIRS $compressors
}
# Corresponding to the CVS "sim" module.
setvar SIM_SUPPORT_DIRS = ""bfd opcodes libiberty include intl gdb/version.in gdb/common/create-version.sh makefile.vms zlib""
proc sim_release {
setvar compressors = "$1"
setvar package = 'sim'
setvar 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 {
setvar release = "$1"
setvar compressors = "$2"
case (release) {
binutils {
binutils_release $compressors}
gas {
gas_release $compressors}
gdb {
gdb_release $compressors}
sim {
sim_release $compressors}
* {
echo "Unknown release name: $release" && usage}
}
}
setvar compressors = """"
while getopts ":gbx" opt {
case (opt) {
b {
setvar compressors = ""$compressors bz2""}
g {
setvar compressors = ""$compressors gz""}
x {
setvar compressors = ""$compressors xz""}
\? {
echo "Invalid option: -$OPTARG" && usage}
}
}
shift $((OPTIND -1))
setvar release = "$1"
build_release $release $compressors