#!/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