#!/usr/bin/env bash # compile ldns for windows cdir="$(echo ldns.win.$$)" tmpdir=$(pwd) mkdir "$cdir" cd "$cdir" #configure="mingw32-configure" #strip="i686-w64-mingw32-strip" #warch="i686" configure="mingw64-configure" strip="x86_64-w64-mingw32-strip" warch="x86_64" WINSSL="$HOME/Downloads/openssl-1.1.0h.tar.gz" cross_flag="" cross_flag_nonstatic="" RC="no" SNAPSHOT="no" CHECKOUT="" # the destination is a zipfile in the start directory ldns-a.b.c.zip # the start directory is a git repository, and it is copied to build from. info () { echo "info: $1" } error_cleanup () { echo "$1" cd "$tmpdir" rm -rf "$cdir" 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." } # Parse command line arguments while [ "$1" ]; do case "$1" in "-h") echo "Compile a zip file with static executables, and" echo "dynamic library, static library, include dir and" echo "manual pages." echo "" echo " -h This usage information." echo " -s snapshot, current date appended to version" echo " -rc release candidate, the number is added to version" echo " ldns-rc." echo " -c Checkout this tag or branch, (defaults to current" echo " branch)." echo " -wssl Pass openssl.tar.gz file, use absolute path." echo "" exit 1 ;; "-c") CHECKOUT="$2" shift ;; "-s") SNAPSHOT="yes" ;; "-rc") RC="$2" shift ;; "-wssl") WINSSL="$2" shift ;; *) error_cleanup "Unrecognized argument -- $1" ;; esac shift done if [ -z "$CHECKOUT" ] then if [ "$RC" = "no" ] then CHECKOUT=$( (git status | head -n 1 | awk '{print$3}') || echo master) else CHECKOUT=$( (git status | head -n 1 | awk '{print$3}') || echo develop) fi fi # this script creates a temp directory $cdir. # this directory contains subdirectories: # ldns/ : ldns source compiled # openssl-a.b.c/ : the openSSL source compiled # ldnsinstall/ : install of ldns here. # sslinstall/ : install of ssl here. # file/ : directory to gather the components of the zipfile distribution # ldns-nonstatic/ : ldns source compiled nonstatic # ldnsinstall-nonstatic/ : install of ldns nonstatic compile # openssl-nonstatic/ : nonstatic openssl source compiled # sslinstall-nonstatic/ : install of nonstatic openssl compile info "exporting source into $cdir/ldns" git clone git://git.nlnetlabs.nl/ldns/ ldns || error_cleanup "git command failed" (cd ldns; git checkout "$CHECKOUT") || error_cleanup "Could not checkout $CHECKOUT" #svn export . $cdir/ldns info "exporting source into $cdir/ldns-nonstatic" git clone git://git.nlnetlabs.nl/ldns/ ldns-nonstatic || error_cleanup "git command failed" (cd ldns-nonstatic; git checkout "$CHECKOUT") || error_cleanup "Could not checkout $CHECKOUT" #svn export . $cdir/ldns-nonstatic # Fix up the version number if necessary (cd ldns; if test ! -f install-sh -a -f ../../install-sh; then cp ../../install-sh . ; fi; libtoolize -ci; autoreconf -fi) version=$(./ldns/configure --version | head -1 | awk '{ print $3 }') || \ error_cleanup "Cannot determine version number." info "LDNS version: $version" if [ "$RC" != "no" ]; then info "Building LDNS release candidate $RC." version2="${version}-rc$RC" info "Version number: $version2" replace_text "ldns/configure.ac" "AC_INIT(ldns, $version" "AC_INIT(ldns, $version2" replace_text "ldns-nonstatic/configure.ac" "AC_INIT(ldns, $version" "AC_INIT(ldns, $version2" version="$version2" fi if [ "$SNAPSHOT" = "yes" ]; then info "Building LDNS snapshot." version2="${version}_$(date +%Y%m%d)" info "Snapshot version number: $version2" replace_text "ldns/configure.ac" "AC_INIT(ldns, $version" "AC_INIT(ldns, $version2" replace_text "ldns-nonstatic/configure.ac" "AC_INIT(ldns, $version" "AC_INIT(ldns, $version2" version="$version2" fi # Build OpenSSL 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" if test $configure = "mingw64-configure"; then sslflags="no-shared no-asm -DOPENSSL_NO_CAPIENG mingw64" else sslflags="no-shared no-asm -DOPENSSL_NO_CAPIENG mingw" fi info "winssl: Configure $sslflags" CC="${warch}-w64-mingw32-gcc" AR="${warch}-w64-mingw32-ar" RANLIB="${warch}-w64-mingw32-ranlib" WINDRES="${warch}-w64-mingw32-windres" ./Configure --prefix="$sslinstall" "$sslflags" || error_cleanup "OpenSSL Configure failed" info "winssl: make" make || error_cleanup "make failed for $WINSSL" info "winssl: make install_sw" make install_sw || error_cleanup "OpenSSL install failed" cross_flag="$cross_flag --with-ssl=$sslinstall" cd .. # Build ldns ldnsinstall="$(pwd)/ldnsinstall" cd ldns info "ldns: autoconf" # cp install-sh because one at ../.. means libtoolize won't install it for us. if test ! -f install-sh -a -f ../../install-sh; then cp ../../install-sh . ; fi libtoolize -ci autoreconf -fi ldns_flag="--with-examples --with-drill" info "ldns: Configure $cross_flag $ldns_flag" $configure "$cross_flag" "$ldns_flag" || error_cleanup "ldns configure failed" info "ldns: make" make || error_cleanup "ldns make failed" # do not strip debug symbols, could be useful for stack traces # $strip lib/*.dll || error_cleanup "cannot strip ldns dll" make doc || error_cleanup "ldns make doc failed" DESTDIR=$ldnsinstall make install || error_cleanup "ldns make install failed" cd .. # Build OpenSSL nonstatic sslinstallnonstatic="$(pwd)/sslinstallnonstatic" mkdir openssl-nonstatic cd openssl-nonstatic # remove openssl-a.b.c/ and put in openssl-nonstatic directory gzip -cd "$WINSSL" | tar xf - --strip-components=1 || error_cleanup "tar unpack of $WINSSL failed" if test "$configure" = "mingw64-configure"; then sslflags_nonstatic="shared no-asm -DOPENSSL_NO_CAPIENG mingw64" else sslflags_nonstatic="shared no-asm -DOPENSSL_NO_CAPIENG mingw" fi info "winsslnonstatic: Configure $sslflags_nonstatic" CC="${warch}-w64-mingw32-gcc" AR="${warch}-w64-mingw32-ar" RANLIB="${warch}-w64-mingw32-ranlib" WINDRES="${warch}-w64-mingw32-windres" ./Configure --prefix="$sslinstallnonstatic" "$sslflags_nonstatic" || error_cleanup "OpenSSL Configure failed" info "winsslnonstatic: make" make || error_cleanup "make failed for $WINSSL" info "winsslnonstatic: make install_sw" make install_sw || error_cleanup "OpenSSL install failed" cross_flag_nonstatic="$cross_flag_nonstatic --with-ssl=$sslinstallnonstatic" cd .. # Build ldns nonstatic ldnsinstallnonstatic="$(pwd)/ldnsinstall-nonstatic" cd ldns-nonstatic info "ldnsnonstatic: autoconf" # cp install-sh because one at ../.. means libtoolize won't install it for us. if test ! -f install-sh -a -f ../../install-sh; then cp ../../install-sh . ; fi libtoolize -ci autoreconf -fi ldns_flag_nonstatic="--with-examples --with-drill" info "ldnsnonstatic: Configure $cross_flag_nonstatic $ldns_flag_nonstatic" $configure "$cross_flag_nonstatic" "$ldns_flag_nonstatic" || error_cleanup "ldns configure failed" info "ldnsnonstatic: make" make || error_cleanup "ldns make failed" # do not strip debug symbols, could be useful for stack traces # $strip lib/*.dll || error_cleanup "cannot strip ldns dll" make doc || error_cleanup "ldns make doc failed" DESTDIR=$ldnsinstallnonstatic make install || error_cleanup "ldns make install failed" cd .. # create zipfile file="ldns-$version.zip" rm -f "$file" info "Creating $file" mkdir file cd file installplace="$ldnsinstall/usr/$warch-w64-mingw32/sys-root/mingw" installplacenonstatic="$ldnsinstallnonstatic/usr/$warch-w64-mingw32/sys-root/mingw" cp "$installplace"/lib/libldns.a . cp "$installplacenonstatic"/lib/libldns.dll.a . cp "$installplacenonstatic"/bin/*.dll . cp "$sslinstallnonstatic"/lib/*.dll.a . cp "$sslinstallnonstatic"/bin/*.dll . cp "$sslinstallnonstatic"/lib/engines-*/*.dll . cp ../ldns/LICENSE . cp ../ldns/README . cp ../ldns/Changelog . info "copy static exe" for x in "$installplace"/bin/* ; do cp "$x" "$(basename "$x").exe" done # but the shell script stays a script file mv ldns-config.exe ldns-config info "copy include" mkdir include mkdir include/ldns cp "$installplace"/include/ldns/*.h include/ldns/. info "copy man1" mkdir man1 cp "$installplace"/share/man/man1/* man1/. info "copy man3" mkdir man3 cp "$installplace"/share/man/man3/* man3/. info "create cat1" mkdir cat1 for x in man1/*.1; do groff -man -Tascii -Z "$x" | grotty -cbu > cat1/"$(basename "$x" .1).txt"; done info "create cat3" mkdir cat3 for x in man3/*.3; do groff -man -Tascii -Z "$x" | grotty -cbu > cat3/"$(basename "$x" .3).txt"; done rm -f "../../$file" info "$file contents" # show contents of directory we are zipping up. du -s ./* # zip it info "zip $file" zip -r ../../"$file" LICENSE README libldns.a *.dll *.dll.a Changelog *.exe include man1 man3 cat1 cat3 info "Testing $file" (cd ../.. ; zip -T "$file" ) || error_cleanup "errors in zipfile $file" cd .. # cleanup before exit cd "$tmpdir" rm -rf "$cdir" echo "done" # display ls -lG "$file"