#!/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 < Build a release candidate, the given string will be added to the version number (which will then be unbound-rc) -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"