xref: /freebsd/contrib/ldns/makewin.sh (revision 5afab0e5e56fe90a378fb57249600e7924e1cab2)
1*5afab0e5SDag-Erling Smørgrav#!/usr/bin/env bash
2*5afab0e5SDag-Erling Smørgrav
3*5afab0e5SDag-Erling Smørgrav# compile ldns for windows
4*5afab0e5SDag-Erling Smørgravcdir="$(echo ldns.win.$$)"
5*5afab0e5SDag-Erling Smørgravtmpdir=$(pwd)
6*5afab0e5SDag-Erling Smørgravmkdir "$cdir"
7*5afab0e5SDag-Erling Smørgravcd "$cdir"
8*5afab0e5SDag-Erling Smørgrav#configure="mingw32-configure"
9*5afab0e5SDag-Erling Smørgrav#strip="i686-w64-mingw32-strip"
10*5afab0e5SDag-Erling Smørgrav#warch="i686"
11*5afab0e5SDag-Erling Smørgravconfigure="mingw64-configure"
12*5afab0e5SDag-Erling Smørgravstrip="x86_64-w64-mingw32-strip"
13*5afab0e5SDag-Erling Smørgravwarch="x86_64"
14*5afab0e5SDag-Erling SmørgravWINSSL="$HOME/Downloads/openssl-1.1.0h.tar.gz"
15*5afab0e5SDag-Erling Smørgravcross_flag=""
16*5afab0e5SDag-Erling Smørgravcross_flag_nonstatic=""
17*5afab0e5SDag-Erling SmørgravRC="no"
18*5afab0e5SDag-Erling SmørgravSNAPSHOT="no"
19*5afab0e5SDag-Erling SmørgravCHECKOUT=""
20*5afab0e5SDag-Erling Smørgrav# the destination is a zipfile in the start directory ldns-a.b.c.zip
21*5afab0e5SDag-Erling Smørgrav# the start directory is a git repository, and it is copied to build from.
22*5afab0e5SDag-Erling Smørgrav
23*5afab0e5SDag-Erling Smørgravinfo () {
24*5afab0e5SDag-Erling Smørgrav	echo "info: $1"
25*5afab0e5SDag-Erling Smørgrav}
26*5afab0e5SDag-Erling Smørgrav
27*5afab0e5SDag-Erling Smørgraverror_cleanup () {
28*5afab0e5SDag-Erling Smørgrav	echo "$1"
29*5afab0e5SDag-Erling Smørgrav	cd "$tmpdir"
30*5afab0e5SDag-Erling Smørgrav	rm -rf "$cdir"
31*5afab0e5SDag-Erling Smørgrav	exit 1
32*5afab0e5SDag-Erling Smørgrav}
33*5afab0e5SDag-Erling Smørgrav
34*5afab0e5SDag-Erling Smørgravreplace_text () {
35*5afab0e5SDag-Erling Smørgrav    (cp "$1" "$1".orig && \
36*5afab0e5SDag-Erling Smørgrav        sed -e "s/$2/$3/g" < "$1".orig > "$1" && \
37*5afab0e5SDag-Erling Smørgrav        rm "$1".orig) || error_cleanup "Replacement for $1 failed."
38*5afab0e5SDag-Erling Smørgrav}
39*5afab0e5SDag-Erling Smørgrav
40*5afab0e5SDag-Erling Smørgrav# Parse command line arguments
41*5afab0e5SDag-Erling Smørgravwhile [ "$1" ]; do
42*5afab0e5SDag-Erling Smørgrav    case "$1" in
43*5afab0e5SDag-Erling Smørgrav	"-h")
44*5afab0e5SDag-Erling Smørgrav		echo "Compile a zip file with static executables, and"
45*5afab0e5SDag-Erling Smørgrav		echo "dynamic library, static library, include dir and"
46*5afab0e5SDag-Erling Smørgrav		echo "manual pages."
47*5afab0e5SDag-Erling Smørgrav		echo ""
48*5afab0e5SDag-Erling Smørgrav		echo "	-h		This usage information."
49*5afab0e5SDag-Erling Smørgrav		echo "	-s		snapshot, current date appended to version"
50*5afab0e5SDag-Erling Smørgrav		echo "	-rc <nr>	release candidate, the number is added to version"
51*5afab0e5SDag-Erling Smørgrav		echo "			ldns-<version>rc<nr>."
52*5afab0e5SDag-Erling Smørgrav		echo "	-c <tag/br>	Checkout this tag or branch, (defaults to current"
53*5afab0e5SDag-Erling Smørgrav		echo "			branch)."
54*5afab0e5SDag-Erling Smørgrav		echo "	-wssl <file>	Pass openssl.tar.gz file, use absolute path."
55*5afab0e5SDag-Erling Smørgrav		echo ""
56*5afab0e5SDag-Erling Smørgrav		exit 1
57*5afab0e5SDag-Erling Smørgrav		;;
58*5afab0e5SDag-Erling Smørgrav	"-c")
59*5afab0e5SDag-Erling Smørgrav		CHECKOUT="$2"
60*5afab0e5SDag-Erling Smørgrav		shift
61*5afab0e5SDag-Erling Smørgrav		;;
62*5afab0e5SDag-Erling Smørgrav	"-s")
63*5afab0e5SDag-Erling Smørgrav		SNAPSHOT="yes"
64*5afab0e5SDag-Erling Smørgrav		;;
65*5afab0e5SDag-Erling Smørgrav	"-rc")
66*5afab0e5SDag-Erling Smørgrav		RC="$2"
67*5afab0e5SDag-Erling Smørgrav		shift
68*5afab0e5SDag-Erling Smørgrav		;;
69*5afab0e5SDag-Erling Smørgrav	"-wssl")
70*5afab0e5SDag-Erling Smørgrav		WINSSL="$2"
71*5afab0e5SDag-Erling Smørgrav		shift
72*5afab0e5SDag-Erling Smørgrav		;;
73*5afab0e5SDag-Erling Smørgrav	*)
74*5afab0e5SDag-Erling Smørgrav		error_cleanup "Unrecognized argument -- $1"
75*5afab0e5SDag-Erling Smørgrav		;;
76*5afab0e5SDag-Erling Smørgrav    esac
77*5afab0e5SDag-Erling Smørgrav    shift
78*5afab0e5SDag-Erling Smørgravdone
79*5afab0e5SDag-Erling Smørgravif [ -z "$CHECKOUT" ]
80*5afab0e5SDag-Erling Smørgravthen
81*5afab0e5SDag-Erling Smørgrav        if [ "$RC" = "no" ]
82*5afab0e5SDag-Erling Smørgrav        then
83*5afab0e5SDag-Erling Smørgrav                CHECKOUT=$( (git status | head -n 1 | awk '{print$3}') || echo master)
84*5afab0e5SDag-Erling Smørgrav        else
85*5afab0e5SDag-Erling Smørgrav                CHECKOUT=$( (git status | head -n 1 | awk '{print$3}') || echo develop)
86*5afab0e5SDag-Erling Smørgrav        fi
87*5afab0e5SDag-Erling Smørgravfi
88*5afab0e5SDag-Erling Smørgrav
89*5afab0e5SDag-Erling Smørgrav# this script creates a temp directory $cdir.
90*5afab0e5SDag-Erling Smørgrav# this directory contains subdirectories:
91*5afab0e5SDag-Erling Smørgrav# ldns/ : ldns source compiled
92*5afab0e5SDag-Erling Smørgrav# openssl-a.b.c/ : the openSSL source compiled
93*5afab0e5SDag-Erling Smørgrav# ldnsinstall/ : install of ldns here.
94*5afab0e5SDag-Erling Smørgrav# sslinstall/ : install of ssl here.
95*5afab0e5SDag-Erling Smørgrav# file/ : directory to gather the components of the zipfile distribution
96*5afab0e5SDag-Erling Smørgrav# ldns-nonstatic/ : ldns source compiled nonstatic
97*5afab0e5SDag-Erling Smørgrav# ldnsinstall-nonstatic/ : install of ldns nonstatic compile
98*5afab0e5SDag-Erling Smørgrav# openssl-nonstatic/ : nonstatic openssl source compiled
99*5afab0e5SDag-Erling Smørgrav# sslinstall-nonstatic/ : install of nonstatic openssl compile
100*5afab0e5SDag-Erling Smørgrav
101*5afab0e5SDag-Erling Smørgravinfo "exporting source into $cdir/ldns"
102*5afab0e5SDag-Erling Smørgravgit clone git://git.nlnetlabs.nl/ldns/ ldns || error_cleanup "git command failed"
103*5afab0e5SDag-Erling Smørgrav(cd ldns; git checkout "$CHECKOUT") || error_cleanup "Could not checkout $CHECKOUT"
104*5afab0e5SDag-Erling Smørgrav#svn export . $cdir/ldns
105*5afab0e5SDag-Erling Smørgravinfo "exporting source into $cdir/ldns-nonstatic"
106*5afab0e5SDag-Erling Smørgravgit clone git://git.nlnetlabs.nl/ldns/ ldns-nonstatic || error_cleanup "git command failed"
107*5afab0e5SDag-Erling Smørgrav(cd ldns-nonstatic; git checkout "$CHECKOUT") || error_cleanup "Could not checkout $CHECKOUT"
108*5afab0e5SDag-Erling Smørgrav#svn export . $cdir/ldns-nonstatic
109*5afab0e5SDag-Erling Smørgrav
110*5afab0e5SDag-Erling Smørgrav# Fix up the version number if necessary
111*5afab0e5SDag-Erling Smørgrav(cd ldns; if test ! -f install-sh -a -f ../../install-sh; then cp ../../install-sh . ; fi; libtoolize -ci; autoreconf -fi)
112*5afab0e5SDag-Erling Smørgravversion=$(./ldns/configure --version | head -1 | awk '{ print $3 }') || \
113*5afab0e5SDag-Erling Smørgrav    error_cleanup "Cannot determine version number."
114*5afab0e5SDag-Erling Smørgravinfo "LDNS version: $version"
115*5afab0e5SDag-Erling Smørgravif [ "$RC" != "no" ]; then
116*5afab0e5SDag-Erling Smørgrav	info "Building LDNS release candidate $RC."
117*5afab0e5SDag-Erling Smørgrav	version2="${version}-rc$RC"
118*5afab0e5SDag-Erling Smørgrav	info "Version number: $version2"
119*5afab0e5SDag-Erling Smørgrav	replace_text "ldns/configure.ac" "AC_INIT(ldns, $version" "AC_INIT(ldns, $version2"
120*5afab0e5SDag-Erling Smørgrav	replace_text "ldns-nonstatic/configure.ac" "AC_INIT(ldns, $version" "AC_INIT(ldns, $version2"
121*5afab0e5SDag-Erling Smørgrav	version="$version2"
122*5afab0e5SDag-Erling Smørgravfi
123*5afab0e5SDag-Erling Smørgravif [ "$SNAPSHOT" = "yes" ]; then
124*5afab0e5SDag-Erling Smørgrav	info "Building LDNS snapshot."
125*5afab0e5SDag-Erling Smørgrav	version2="${version}_$(date +%Y%m%d)"
126*5afab0e5SDag-Erling Smørgrav	info "Snapshot version number: $version2"
127*5afab0e5SDag-Erling Smørgrav	replace_text "ldns/configure.ac" "AC_INIT(ldns, $version" "AC_INIT(ldns, $version2"
128*5afab0e5SDag-Erling Smørgrav	replace_text "ldns-nonstatic/configure.ac" "AC_INIT(ldns, $version" "AC_INIT(ldns, $version2"
129*5afab0e5SDag-Erling Smørgrav	version="$version2"
130*5afab0e5SDag-Erling Smørgravfi
131*5afab0e5SDag-Erling Smørgrav
132*5afab0e5SDag-Erling Smørgrav# Build OpenSSL
133*5afab0e5SDag-Erling Smørgravgzip -cd "$WINSSL" | tar xf - || error_cleanup "tar unpack of $WINSSL failed"
134*5afab0e5SDag-Erling Smørgravsslinstall="$(pwd)/sslinstall"
135*5afab0e5SDag-Erling Smørgravcd openssl-* || error_cleanup "no openssl-X dir in tarball"
136*5afab0e5SDag-Erling Smørgravif test $configure = "mingw64-configure"; then
137*5afab0e5SDag-Erling Smørgrav	sslflags="no-shared no-asm -DOPENSSL_NO_CAPIENG mingw64"
138*5afab0e5SDag-Erling Smørgravelse
139*5afab0e5SDag-Erling Smørgrav	sslflags="no-shared no-asm -DOPENSSL_NO_CAPIENG mingw"
140*5afab0e5SDag-Erling Smørgravfi
141*5afab0e5SDag-Erling Smørgravinfo "winssl: Configure $sslflags"
142*5afab0e5SDag-Erling SmørgravCC="${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"
143*5afab0e5SDag-Erling Smørgravinfo "winssl: make"
144*5afab0e5SDag-Erling Smørgravmake || error_cleanup "make failed for $WINSSL"
145*5afab0e5SDag-Erling Smørgravinfo "winssl: make install_sw"
146*5afab0e5SDag-Erling Smørgravmake install_sw || error_cleanup "OpenSSL install failed"
147*5afab0e5SDag-Erling Smørgravcross_flag="$cross_flag --with-ssl=$sslinstall"
148*5afab0e5SDag-Erling Smørgravcd ..
149*5afab0e5SDag-Erling Smørgrav
150*5afab0e5SDag-Erling Smørgrav# Build ldns
151*5afab0e5SDag-Erling Smørgravldnsinstall="$(pwd)/ldnsinstall"
152*5afab0e5SDag-Erling Smørgravcd ldns
153*5afab0e5SDag-Erling Smørgravinfo "ldns: autoconf"
154*5afab0e5SDag-Erling Smørgrav# cp install-sh because one at ../.. means libtoolize won't install it for us.
155*5afab0e5SDag-Erling Smørgravif test ! -f install-sh -a -f ../../install-sh; then cp ../../install-sh . ; fi
156*5afab0e5SDag-Erling Smørgravlibtoolize -ci
157*5afab0e5SDag-Erling Smørgravautoreconf -fi
158*5afab0e5SDag-Erling Smørgravldns_flag="--with-examples --with-drill"
159*5afab0e5SDag-Erling Smørgravinfo "ldns: Configure $cross_flag $ldns_flag"
160*5afab0e5SDag-Erling Smørgrav$configure "$cross_flag" "$ldns_flag" || error_cleanup "ldns configure failed"
161*5afab0e5SDag-Erling Smørgravinfo "ldns: make"
162*5afab0e5SDag-Erling Smørgravmake || error_cleanup "ldns make failed"
163*5afab0e5SDag-Erling Smørgrav# do not strip debug symbols, could be useful for stack traces
164*5afab0e5SDag-Erling Smørgrav# $strip lib/*.dll || error_cleanup "cannot strip ldns dll"
165*5afab0e5SDag-Erling Smørgravmake doc || error_cleanup "ldns make doc failed"
166*5afab0e5SDag-Erling SmørgravDESTDIR=$ldnsinstall make install || error_cleanup "ldns make install failed"
167*5afab0e5SDag-Erling Smørgravcd ..
168*5afab0e5SDag-Erling Smørgrav
169*5afab0e5SDag-Erling Smørgrav# Build OpenSSL nonstatic
170*5afab0e5SDag-Erling Smørgravsslinstallnonstatic="$(pwd)/sslinstallnonstatic"
171*5afab0e5SDag-Erling Smørgravmkdir openssl-nonstatic
172*5afab0e5SDag-Erling Smørgravcd openssl-nonstatic
173*5afab0e5SDag-Erling Smørgrav# remove openssl-a.b.c/ and put in openssl-nonstatic directory
174*5afab0e5SDag-Erling Smørgravgzip -cd "$WINSSL" | tar xf - --strip-components=1 || error_cleanup "tar unpack of $WINSSL failed"
175*5afab0e5SDag-Erling Smørgravif test "$configure" = "mingw64-configure"; then
176*5afab0e5SDag-Erling Smørgrav	sslflags_nonstatic="shared no-asm -DOPENSSL_NO_CAPIENG mingw64"
177*5afab0e5SDag-Erling Smørgravelse
178*5afab0e5SDag-Erling Smørgrav	sslflags_nonstatic="shared no-asm -DOPENSSL_NO_CAPIENG mingw"
179*5afab0e5SDag-Erling Smørgravfi
180*5afab0e5SDag-Erling Smørgravinfo "winsslnonstatic: Configure $sslflags_nonstatic"
181*5afab0e5SDag-Erling SmørgravCC="${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"
182*5afab0e5SDag-Erling Smørgravinfo "winsslnonstatic: make"
183*5afab0e5SDag-Erling Smørgravmake || error_cleanup "make failed for $WINSSL"
184*5afab0e5SDag-Erling Smørgravinfo "winsslnonstatic: make install_sw"
185*5afab0e5SDag-Erling Smørgravmake install_sw || error_cleanup "OpenSSL install failed"
186*5afab0e5SDag-Erling Smørgravcross_flag_nonstatic="$cross_flag_nonstatic --with-ssl=$sslinstallnonstatic"
187*5afab0e5SDag-Erling Smørgravcd ..
188*5afab0e5SDag-Erling Smørgrav
189*5afab0e5SDag-Erling Smørgrav# Build ldns nonstatic
190*5afab0e5SDag-Erling Smørgravldnsinstallnonstatic="$(pwd)/ldnsinstall-nonstatic"
191*5afab0e5SDag-Erling Smørgravcd ldns-nonstatic
192*5afab0e5SDag-Erling Smørgravinfo "ldnsnonstatic: autoconf"
193*5afab0e5SDag-Erling Smørgrav# cp install-sh because one at ../.. means libtoolize won't install it for us.
194*5afab0e5SDag-Erling Smørgravif test ! -f install-sh -a -f ../../install-sh; then cp ../../install-sh . ; fi
195*5afab0e5SDag-Erling Smørgravlibtoolize -ci
196*5afab0e5SDag-Erling Smørgravautoreconf -fi
197*5afab0e5SDag-Erling Smørgravldns_flag_nonstatic="--with-examples --with-drill"
198*5afab0e5SDag-Erling Smørgravinfo "ldnsnonstatic: Configure $cross_flag_nonstatic $ldns_flag_nonstatic"
199*5afab0e5SDag-Erling Smørgrav$configure "$cross_flag_nonstatic" "$ldns_flag_nonstatic" || error_cleanup "ldns configure failed"
200*5afab0e5SDag-Erling Smørgravinfo "ldnsnonstatic: make"
201*5afab0e5SDag-Erling Smørgravmake || error_cleanup "ldns make failed"
202*5afab0e5SDag-Erling Smørgrav# do not strip debug symbols, could be useful for stack traces
203*5afab0e5SDag-Erling Smørgrav# $strip lib/*.dll || error_cleanup "cannot strip ldns dll"
204*5afab0e5SDag-Erling Smørgravmake doc || error_cleanup "ldns make doc failed"
205*5afab0e5SDag-Erling SmørgravDESTDIR=$ldnsinstallnonstatic make install || error_cleanup "ldns make install failed"
206*5afab0e5SDag-Erling Smørgravcd ..
207*5afab0e5SDag-Erling Smørgrav
208*5afab0e5SDag-Erling Smørgrav# create zipfile
209*5afab0e5SDag-Erling Smørgravfile="ldns-$version.zip"
210*5afab0e5SDag-Erling Smørgravrm -f "$file"
211*5afab0e5SDag-Erling Smørgravinfo "Creating $file"
212*5afab0e5SDag-Erling Smørgravmkdir file
213*5afab0e5SDag-Erling Smørgravcd file
214*5afab0e5SDag-Erling Smørgravinstallplace="$ldnsinstall/usr/$warch-w64-mingw32/sys-root/mingw"
215*5afab0e5SDag-Erling Smørgravinstallplacenonstatic="$ldnsinstallnonstatic/usr/$warch-w64-mingw32/sys-root/mingw"
216*5afab0e5SDag-Erling Smørgravcp "$installplace"/lib/libldns.a .
217*5afab0e5SDag-Erling Smørgravcp "$installplacenonstatic"/lib/libldns.dll.a .
218*5afab0e5SDag-Erling Smørgravcp "$installplacenonstatic"/bin/*.dll .
219*5afab0e5SDag-Erling Smørgravcp "$sslinstallnonstatic"/lib/*.dll.a .
220*5afab0e5SDag-Erling Smørgravcp "$sslinstallnonstatic"/bin/*.dll .
221*5afab0e5SDag-Erling Smørgravcp "$sslinstallnonstatic"/lib/engines-*/*.dll .
222*5afab0e5SDag-Erling Smørgravcp ../ldns/LICENSE .
223*5afab0e5SDag-Erling Smørgravcp ../ldns/README .
224*5afab0e5SDag-Erling Smørgravcp ../ldns/Changelog .
225*5afab0e5SDag-Erling Smørgravinfo "copy static exe"
226*5afab0e5SDag-Erling Smørgravfor x in "$installplace"/bin/* ; do
227*5afab0e5SDag-Erling Smørgrav	cp "$x" "$(basename "$x").exe"
228*5afab0e5SDag-Erling Smørgravdone
229*5afab0e5SDag-Erling Smørgrav# but the shell script stays a script file
230*5afab0e5SDag-Erling Smørgravmv ldns-config.exe ldns-config
231*5afab0e5SDag-Erling Smørgravinfo "copy include"
232*5afab0e5SDag-Erling Smørgravmkdir include
233*5afab0e5SDag-Erling Smørgravmkdir include/ldns
234*5afab0e5SDag-Erling Smørgravcp "$installplace"/include/ldns/*.h include/ldns/.
235*5afab0e5SDag-Erling Smørgravinfo "copy man1"
236*5afab0e5SDag-Erling Smørgravmkdir man1
237*5afab0e5SDag-Erling Smørgravcp "$installplace"/share/man/man1/* man1/.
238*5afab0e5SDag-Erling Smørgravinfo "copy man3"
239*5afab0e5SDag-Erling Smørgravmkdir man3
240*5afab0e5SDag-Erling Smørgravcp "$installplace"/share/man/man3/* man3/.
241*5afab0e5SDag-Erling Smørgravinfo "create cat1"
242*5afab0e5SDag-Erling Smørgravmkdir cat1
243*5afab0e5SDag-Erling Smørgravfor x in man1/*.1; do groff -man -Tascii -Z "$x" | grotty -cbu > cat1/"$(basename "$x" .1).txt"; done
244*5afab0e5SDag-Erling Smørgravinfo "create cat3"
245*5afab0e5SDag-Erling Smørgravmkdir cat3
246*5afab0e5SDag-Erling Smørgravfor x in man3/*.3; do groff -man -Tascii -Z "$x" | grotty -cbu > cat3/"$(basename "$x" .3).txt"; done
247*5afab0e5SDag-Erling Smørgravrm -f "../../$file"
248*5afab0e5SDag-Erling Smørgravinfo "$file contents"
249*5afab0e5SDag-Erling Smørgrav# show contents of directory we are zipping up.
250*5afab0e5SDag-Erling Smørgravdu -s ./*
251*5afab0e5SDag-Erling Smørgrav# zip it
252*5afab0e5SDag-Erling Smørgravinfo "zip $file"
253*5afab0e5SDag-Erling Smørgravzip -r ../../"$file" LICENSE README libldns.a *.dll *.dll.a Changelog *.exe include man1 man3 cat1 cat3
254*5afab0e5SDag-Erling Smørgravinfo "Testing $file"
255*5afab0e5SDag-Erling Smørgrav(cd ../.. ; zip -T "$file" ) || error_cleanup "errors in zipfile $file"
256*5afab0e5SDag-Erling Smørgravcd ..
257*5afab0e5SDag-Erling Smørgrav
258*5afab0e5SDag-Erling Smørgrav# cleanup before exit
259*5afab0e5SDag-Erling Smørgravcd "$tmpdir"
260*5afab0e5SDag-Erling Smørgravrm -rf "$cdir"
261*5afab0e5SDag-Erling Smørgravecho "done"
262*5afab0e5SDag-Erling Smørgrav# display
263*5afab0e5SDag-Erling Smørgravls -lG "$file"
264