diff options
Diffstat (limited to 'external/unbound/makedist.sh')
-rwxr-xr-x | external/unbound/makedist.sh | 445 |
1 files changed, 445 insertions, 0 deletions
diff --git a/external/unbound/makedist.sh b/external/unbound/makedist.sh new file mode 100755 index 000000000..6ece32605 --- /dev/null +++ b/external/unbound/makedist.sh @@ -0,0 +1,445 @@ +#!/bin/sh + +# Build unbound distribution tar from the SVN repository. +# +# Copyright (c) 2007, NLnet Labs. All rights reserved. +# +# This software is open source. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# Redistributions of source code must retain the above copyright notice, +# this list of conditions and the following disclaimer. +# +# Redistributions in binary form must reproduce the above copyright notice, +# this list of conditions and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# +# Neither the name of the NLNET LABS nor the names of its contributors may +# be used to endorse or promote products derived from this software without +# specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED +# TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Abort script on unexpected errors. +set -e + +# Remember the current working directory. +cwd=`pwd` + +# Utility functions. +usage () { + cat >&2 <<EOF +Usage $0: [-h] [-s] [-d SVN_root] [-w ...args...] +Generate a distribution tar file for unbound. + + -h This usage information. + -s Build a snapshot distribution file. The current date is + automatically appended to the current unbound version number. + -rc <nr> Build a release candidate, the given string will be added + to the version number + (which will then be unbound-<version>rc<number>) + -d SVN_root Retrieve the unbound source from the specified repository. + Detected from svn working copy if not specified. + -wssl openssl.xx.tar.gz Also build openssl from tarball for windows dist. + -wxp expat.xx.tar.gz Also build expat from tarball for windows dist. + -w ... Build windows binary dist. last args passed to configure. +EOF + exit 1 +} + +info () { + echo "$0: info: $1" +} + +error () { + echo "$0: error: $1" >&2 + exit 1 +} + +question () { + printf "%s (y/n) " "$*" + read answer + case "$answer" in + [Yy]|[Yy][Ee][Ss]) + return 0 + ;; + *) + return 1 + ;; + esac +} + +# Only use cleanup and error_cleanup after generating the temporary +# working directory. +cleanup () { + info "Deleting temporary working directory." + cd $cwd && rm -rf $temp_dir +} + +error_cleanup () { + echo "$0: error: $1" >&2 + cleanup + exit 1 +} + +replace_text () { + (cp "$1" "$1".orig && \ + sed -e "s/$2/$3/g" < "$1".orig > "$1" && \ + rm "$1".orig) || error_cleanup "Replacement for $1 failed." +} + +replace_all () { + info "Updating '$1' with the version number." + replace_text "$1" "@version@" "$version" + info "Updating '$1' with today's date." + replace_text "$1" "@date@" "`date +'%b %e, %Y'`" +} + +replace_version () { + local v1=`echo $2 | sed -e 's/^.*\..*\.//'` + local v2=`echo $3 | sed -e 's/^.*\..*\.//'` + replace_text "$1" "VERSION_MICRO\],\[$v1" "VERSION_MICRO\],\[$v2" +} + +check_svn_root () { + # Check if SVNROOT is specified. + if [ -z "$SVNROOT" ]; then + if svn info 2>&1 | grep "not a working copy" >/dev/null; then + if test -z "$SVNROOT"; then + error "SVNROOT must be specified (using -d)" + fi + else + eval `svn info | grep 'URL:' | sed -e 's/URL: /url=/' | head -1` + SVNROOT="$url" + fi + fi +} + +create_temp_dir () { + # Creating temp directory + info "Creating temporary working directory" + temp_dir=`mktemp -d unbound-dist-XXXXXX` + info "Directory '$temp_dir' created." + cd $temp_dir +} + + +SNAPSHOT="no" +RC="no" +DOWIN="no" +WINSSL="" +WINEXPAT="" + +# Parse the command line arguments. +while [ "$1" ]; do + case "$1" in + "-h") + usage + ;; + "-d") + SVNROOT="$2" + shift + ;; + "-s") + SNAPSHOT="yes" + ;; + "-wssl") + WINSSL="$2" + shift + ;; + "-wxp") + WINEXPAT="$2" + shift + ;; + "-w") + DOWIN="yes" + shift + break + ;; + "-rc") + RC="$2" + shift + ;; + *) + error "Unrecognized argument -- $1" + ;; + esac + shift +done + +if [ "$DOWIN" = "yes" ]; then + # detect crosscompile, from Fedora13 at this point. + if test "`uname`" = "Linux"; then + info "Crosscompile windows dist" + cross="yes" + configure="mingw32-configure" + strip="i686-w64-mingw32-strip" + makensis="makensis" # from mingw32-nsis package + # flags for crosscompiled dependency libraries + cross_flag="" + + check_svn_root + create_temp_dir + + # crosscompile openssl for windows. + if test -n "$WINSSL"; then + info "Cross compile $WINSSL" + info "winssl tar unpack" + (cd ..; gzip -cd $WINSSL) | tar xf - || error_cleanup "tar unpack of $WINSSL failed" + sslinstall="`pwd`/sslinstall" + cd openssl-* || error_cleanup "no openssl-X dir in tarball" + # configure for crosscompile, without CAPI because it fails + # cross-compilation and it is not used anyway + # before 1.0.1i need --cross-compile-prefix=i686-w64-mingw32- + sslflags="no-asm -DOPENSSL_NO_CAPIENG mingw" + info "winssl: Configure $sslflags" + CC=i686-w64-mingw32-gcc AR=i686-w64-mingw32-ar RANLIB=i686-w64-mingw32-ranlib ./Configure --prefix="$sslinstall" $sslflags || error_cleanup "OpenSSL Configure failed" + info "winssl: make" + make || error_cleanup "OpenSSL crosscompile failed" + # only install sw not docs, which take a long time. + info "winssl: make install_sw" + make install_sw || error_cleanup "OpenSSL install failed" + cross_flag="$cross_flag --with-ssl=$sslinstall" + cd .. + fi + + if test -n "$WINEXPAT"; then + info "Cross compile $WINEXPAT" + info "wxp: tar unpack" + (cd ..; gzip -cd $WINEXPAT) | tar xf - || error_cleanup "tar unpack of $WINEXPAT failed" + wxpinstall="`pwd`/wxpinstall" + cd expat-* || error_cleanup "no expat-X dir in tarball" + info "wxp: configure" + mingw32-configure --prefix="$wxpinstall" --exec-prefix="$wxpinstall" --bindir="$wxpinstall/bin" --includedir="$wxpinstall/include" --mandir="$wxpinstall/man" --libdir="$wxpinstall/lib" || error_cleanup "libexpat configure failed" + #info "wxp: make" + #make || error_cleanup "libexpat crosscompile failed" + info "wxp: make installlib" + make installlib || error_cleanup "libexpat install failed" + cross_flag="$cross_flag --with-libexpat=$wxpinstall" + cd .. + fi + + info "Exporting source from SVN." + svn export "$SVNROOT" unbound || error_cleanup "SVN command failed" + cd unbound || error_cleanup "Unbound not exported correctly from SVN" + + # on a re-configure the cache may no longer be valid... + if test -f mingw32-config.cache; then rm mingw32-config.cache; fi + else + cross="no" # mingw and msys + cross_flag="" + configure="./configure" + strip="strip" + makensis="c:/Program Files/NSIS/makensis.exe" # http://nsis.sf.net + fi + + # version gets compiled into source, edit the configure to set it + version=`./configure --version | head -1 | awk '{ print $3 }'` \ + || error_cleanup "Cannot determine version number." + if [ "$RC" != "no" -o "$SNAPSHOT" != "no" ]; then + if [ "$RC" != "no" ]; then + version2=`echo $version | sed -e 's/rc.*$//' -e 's/_20.*$//'` + version2=`echo $version2 | sed -e 's/rc.*//'`"rc$RC" + fi + if [ "$SNAPSHOT" != "no" ]; then + version2=`echo $version | sed -e 's/rc.*$//' -e 's/_20.*$//'` + version2="${version2}_`date +%Y%m%d`" + fi + replace_version "configure.ac" "$version" "$version2" + version="$version2" + info "Rebuilding configure script (autoconf) snapshot." + autoconf || error_cleanup "Autoconf failed." + autoheader || error_cleanup "Autoheader failed." + rm -r autom4te* || echo "ignored" + fi + + # procedure for making unbound installer on mingw. + info "Creating windows dist unbound $version" + info "Calling configure" + echo "$configure"' --enable-debug --enable-static-exe '"$* $cross_flag" + $configure --enable-debug --enable-static-exe $* $cross_flag \ + || error_cleanup "Could not configure" + info "Calling make" + make || error_cleanup "Could not make" + info "Make complete" + + info "Unbound version: $version" + file="unbound-$version.zip" + rm -f $file + info "Creating $file" + mkdir tmp.$$ + $strip unbound.exe + $strip anchor-update.exe + $strip unbound-control.exe + $strip unbound-host.exe + $strip unbound-anchor.exe + $strip unbound-checkconf.exe + $strip unbound-service-install.exe + $strip unbound-service-remove.exe + cd tmp.$$ + cp ../doc/example.conf example.conf + cp ../unbound.exe ../unbound-anchor.exe ../unbound-host.exe ../unbound-control.exe ../unbound-checkconf.exe ../unbound-service-install.exe ../unbound-service-remove.exe ../LICENSE ../winrc/unbound-control-setup.cmd ../winrc/unbound-website.url ../winrc/service.conf ../winrc/README.txt . + # zipfile + zip ../$file LICENSE README.txt unbound.exe unbound-anchor.exe unbound-host.exe unbound-control.exe unbound-checkconf.exe unbound-service-install.exe unbound-service-remove.exe unbound-control-setup.cmd example.conf service.conf unbound-website.url + info "Testing $file" + (cd .. ; zip -T $file ) + # installer + info "Creating installer" + quadversion=`cat ../config.h | grep RSRC_PACKAGE_VERSION | sed -e 's/#define RSRC_PACKAGE_VERSION //' -e 's/,/\\./g'` + cat ../winrc/setup.nsi | sed -e 's/define VERSION.*$/define VERSION "'$version'"/' -e 's/define QUADVERSION.*$/define QUADVERSION "'$quadversion'"/' > ../winrc/setup_ed.nsi + "$makensis" ../winrc/setup_ed.nsi + info "Created installer" + cd .. + rm -rf tmp.$$ + mv winrc/unbound_setup_$version.exe . + if test "$cross" = "yes"; then + mv unbound_setup_$version.exe $cwd/. + mv unbound-$version.zip $cwd/. + cleanup + fi + ls -lG unbound_setup_$version.exe + ls -lG unbound-$version.zip + info "Done" + exit 0 +fi + +check_svn_root + +# Start the packaging process. +info "SVNROOT is $SVNROOT" +info "SNAPSHOT is $SNAPSHOT" + +#question "Do you wish to continue with these settings?" || error "User abort." + +create_temp_dir + +info "Exporting source from SVN." +svn export "$SVNROOT" unbound || error_cleanup "SVN command failed" + +cd unbound || error_cleanup "Unbound not exported correctly from SVN" + +info "Adding libtool utils (libtoolize)." +libtoolize -c --install || libtoolize -c || error_cleanup "Libtoolize failed." + +info "Building configure script (autoreconf)." +autoreconf || error_cleanup "Autoconf failed." + +rm -r autom4te* || error_cleanup "Failed to remove autoconf cache directory." + +info "Building lexer and parser." +echo "#include \"config.h\"" > util/configlexer.c || error_cleanup "Failed to create configlexer" +echo "#include \"util/configyyrename.h\"" >> util/configlexer.c || error_cleanup "Failed to create configlexer" +flex -i -t util/configlexer.lex >> util/configlexer.c || error_cleanup "Failed to create configlexer" +if test -x `which bison` 2>&1; then YACC=bison; else YACC=yacc; fi +$YACC -y -d -o util/configparser.c util/configparser.y || error_cleanup "Failed to create configparser" + +find . -name .c-mode-rc.el -exec rm {} \; +find . -name .cvsignore -exec rm {} \; +rm makedist.sh || error_cleanup "Failed to remove makedist.sh." + +info "Determining Unbound version." +version=`./configure --version | head -1 | awk '{ print $3 }'` || \ + error_cleanup "Cannot determine version number." + +info "Unbound version: $version" + +RECONFIGURE="no" + +if [ "$RC" != "no" ]; then + info "Building Unbound release candidate $RC." + version2="${version}rc$RC" + info "Version number: $version2" + + replace_version "configure.ac" "$version" "$version2" + version="$version2" + RECONFIGURE="yes" +fi + +if [ "$SNAPSHOT" = "yes" ]; then + info "Building Unbound snapshot." + version2="${version}_`date +%Y%m%d`" + info "Snapshot version number: $version2" + + replace_version "configure.ac" "$version" "$version2" + version="$version2" + RECONFIGURE="yes" +fi + +if [ "$RECONFIGURE" = "yes" ]; then + info "Rebuilding configure script (autoconf) snapshot." + autoreconf || error_cleanup "Autoconf failed." + rm -r autom4te* || error_cleanup "Failed to remove autoconf cache directory." +fi + +replace_all doc/README +replace_all doc/unbound.8.in +replace_all doc/unbound.conf.5.in +replace_all doc/unbound-checkconf.8.in +replace_all doc/unbound-control.8.in +replace_all doc/unbound-anchor.8.in +replace_all doc/unbound-host.1.in +replace_all doc/example.conf.in +replace_all doc/libunbound.3.in + +info "Renaming Unbound directory to unbound-$version." +cd .. +mv unbound unbound-$version || error_cleanup "Failed to rename unbound directory." + +tarfile="../unbound-$version.tar.gz" + +if [ -f $tarfile ]; then + (question "The file $tarfile already exists. Overwrite?" \ + && rm -f $tarfile) || error_cleanup "User abort." +fi + +info "Creating tar unbound-$version.tar.gz" +tar czf ../unbound-$version.tar.gz unbound-$version || error_cleanup "Failed to create tar file." + +cleanup + +case $OSTYPE in + linux*) + sha=`sha1sum unbound-$version.tar.gz | awk '{ print $1 }'` + sha256=`sha256sum unbound-$version.tar.gz | awk '{ print $1 }'` + ;; + freebsd*) + sha=`sha1 unbound-$version.tar.gz | awk '{ print $5 }'` + sha256=`sha256 unbound-$version.tar.gz | awk '{ print $5 }'` + ;; + *) + # in case $OSTYPE is gone. + case `uname` in + Linux*) + sha=`sha1sum unbound-$version.tar.gz | awk '{ print $1 }'` + sha256=`sha256sum unbound-$version.tar.gz | awk '{ print $1 }'` + ;; + FreeBSD*) + sha=`sha1 unbound-$version.tar.gz | awk '{ print $5 }'` + sha256=`sha256 unbound-$version.tar.gz | awk '{ print $5 }'` + ;; + *) + sha=`sha1sum unbound-$version.tar.gz | awk '{ print $1 }'` + sha256=`sha256sum unbound-$version.tar.gz | awk '{ print $1 }'` + ;; + esac + ;; +esac +echo $sha > unbound-$version.tar.gz.sha1 +echo $sha256 > unbound-$version.tar.gz.sha256 + +info "Unbound distribution created successfully." +info "SHA1sum: $sha" + |