]> git.xonotic.org Git - xonotic/xonotic.git/blob - misc/buildsrc/dlls.sh
Merge branch 'bones_was_here/all_no_glx' into 'master'
[xonotic/xonotic.git] / misc / buildsrc / dlls.sh
1 #!/bin/bash
2 #
3 # Xonotic DLL automatic cross-compile script
4 # by z411
5
6 d0=$(pwd)
7
8 require () {
9         if ! dpkg -s "$1" >/dev/null 2>&1 ; then
10                 echo "$1 package is required. Please install it."
11                 exit -1
12         fi
13 }
14
15 prepare () {
16         case $target_arch in
17                 win32)    ARCH="i686" ;;
18                 win64)    ARCH="x86_64" ;;
19                 *)        echo "Invalid arch (win32 or win64)." && exit -1 ;;
20         esac
21
22         # Set directories
23         src_dir="$buildpath/src"
24         work_dir="$buildpath/work/$target_arch"
25         pkg_dir="$buildpath/pkg/$target_arch"
26         out_dir="$buildpath/out/$target_arch"
27
28         # Set arch vars
29         CHOST="$ARCH-w64-mingw32"
30         toolchain_file="$d0/toolchain-$CHOST.cmake"
31
32         # Fix for Debian package missing the Windows resource file
33         zlib1rc_file="$d0/zlib1.rc"
34
35         export LDFLAGS="-L$pkg_dir/lib"
36         export CPPFLAGS="-I$pkg_dir/include"
37
38         # Check dependencies
39         require libtool
40         require mingw-w64
41         require automake
42         require cmake
43         require nasm
44
45         set -ex
46
47         mkdir -p "$src_dir"
48         mkdir -p "$work_dir"
49         mkdir -p "$pkg_dir"
50 }
51
52 get_this_src () {
53         dir=$(find . -maxdepth 1 -type d -print | grep -m1 "^\./$1") || return 1
54         this_src="$src_dir/$dir"
55         this_ver="${dir##*-}"
56 }
57
58 fetch_source () {
59         cd "$src_dir"
60
61         if get_this_src "$1"; then
62                 echo "Source for $1 already exists."
63                 return 1
64         else
65                 echo "Getting source for $1..."
66                 apt source "$1"
67                 get_this_src "$1"
68                 return 0
69         fi
70 }
71
72 verlte () {
73         printf '%s\n%s' "$1" "$2" | sort -C -V
74 }
75
76 verlt () {
77         ! verlte "$2" "$1"
78 }
79
80 mkcd () {
81         mkdir -p "$1"
82         cd "$1"
83 }
84
85 build_zlib () {
86         if fetch_source zlib ; then
87                 echo "Fixing zlib prefix..."
88                 sed -i '/zlib PROPERTIES SUFFIX/i set_target_properties(zlib PROPERTIES PREFIX "")' "$this_src/CMakeLists.txt"
89
90                 # Debian source package is missing the win32 resource file for some reason,
91                 # so we add it ourselves.
92                 echo "Fixing zlib1.rc..."
93                 mkdir -p "$this_src/win32"
94                 cp "$zlib1rc_file" "$this_src/win32"
95         fi
96
97         mkcd "$work_dir/zlib"
98         cmake -DCMAKE_TOOLCHAIN_FILE="$toolchain_file"\
99               -DBUILD_SHARED_LIBS=ON \
100               -DCMAKE_INSTALL_PREFIX="$pkg_dir" \
101               -G"Unix Makefiles" "$this_src"
102         make
103         make install
104 }       
105
106 build_gmp () {
107         fetch_source gmp || true
108
109         mkcd "$work_dir/gmp"
110         "$this_src/configure" --prefix="$pkg_dir" \
111                               --host="$CHOST" \
112                               --with-pic \
113                               --enable-fat \
114                               --disable-static \
115                               --enable-shared
116         make
117         make install
118 }
119
120 build_libd0 () {
121         if [[ -d "$src_dir/d0_blind_id" ]] ; then
122                 echo "Sources already exist."
123         else
124                 echo "Getting git sources for libd0..."
125                 cd "$src_dir"
126                 git clone https://gitlab.com/xonotic/d0_blind_id.git
127                 cd d0_blind_id
128                 ./autogen.sh
129                 sed -i '/libd0_blind_id_la_LDFLAGS/ s/$/ -no-undefined/' Makefile.am
130                 sed -i '/libd0_rijndael_la_LDFLAGS/ s/$/ -no-undefined/' Makefile.am
131         fi
132
133         mkcd "$work_dir/libd0"
134         "$src_dir/d0_blind_id/configure" --with-pic \
135                                          --prefix="$pkg_dir" \
136                                          --host="$CHOST"
137         make
138         make install
139 }
140
141 build_libogg() {
142         if fetch_source libogg ; then
143                 echo "Fixing win32 def files..."
144                 sed -i 's/^LIBRARY ogg$/LIBRARY libogg/' "$this_src/win32/ogg.def"
145         fi
146
147         mkcd "$work_dir/libogg"
148         cmake -DCMAKE_TOOLCHAIN_FILE="$toolchain_file" \
149               -DBUILD_SHARED_LIBS=ON \
150               -DCMAKE_INSTALL_PREFIX="$pkg_dir" \
151               -G"Unix Makefiles" "$this_src"
152         make
153         make install
154 }
155
156 build_libvorbis () {
157         if fetch_source libvorbis ; then
158                 echo "Fixing win32 def files..."
159                 sed -i 's/^LIBRARY$/LIBRARY libvorbis/' "$this_src/win32/vorbis.def"
160                 sed -i 's/^LIBRARY$/LIBRARY libvorbisenc/' "$this_src/win32/vorbisenc.def"
161                 sed -i 's/^LIBRARY$/LIBRARY libvorbisfile/' "$this_src/win32/vorbisfile.def"
162         fi
163
164         mkcd "$work_dir/libvorbis"
165         cmake -DCMAKE_TOOLCHAIN_FILE="$toolchain_file" \
166               -DBUILD_SHARED_LIBS=ON \
167               -DOGG_INCLUDE_DIR="$pkg_dir/include" \
168               -DOGG_LIBRARY="$pkg_dir/lib/libogg.dll.a" \
169               -DCMAKE_INSTALL_PREFIX="$pkg_dir" \
170               -G"Unix Makefiles" "$this_src"
171         make
172         make install
173 }
174
175 build_libtheora () {
176         if fetch_source libtheora ; then
177                 echo "Fixing mingw32 defs..."
178                 sed -i '1iLIBRARY libtheoradec' "$this_src/win32/xmingw32/libtheoradec-all.def"
179                 sed -i '1iLIBRARY libtheoraenc' "$this_src/win32/xmingw32/libtheoraenc-all.def"
180                 sed -i '/TH_VP31_QUANT_INFO/d' "$this_src/win32/xmingw32/libtheoraenc-all.def"
181                 sed -i '/TH_VP31_HUFF_CODES/d' "$this_src/win32/xmingw32/libtheoraenc-all.def"
182         fi
183
184         mkcd "$work_dir/libtheora"
185         "$this_src/autogen.sh"
186         "$this_src/configure" --host="$CHOST" \
187                               --prefix="$pkg_dir" \
188                               --with-ogg="$pkg_dir" \
189                               --with-vorbis="$pkg_dir" \
190                               --enable-shared \
191                               --disable-examples \
192                               --disable-sdltest \
193                               --disable-vorbistest \
194                               --disable-oggtest
195         make
196         make install
197 }
198
199 build_freetype () {
200         fetch_source freetype || true
201
202         mkcd "$work_dir/freetype"
203         cmake -DCMAKE_TOOLCHAIN_FILE="$toolchain_file" \
204               -DBUILD_SHARED_LIBS=ON \
205               -DCMAKE_BUILD_TYPE=Release \
206               -DCMAKE_INSTALL_PREFIX="$pkg_dir" \
207               -G"Unix Makefiles" "$this_src"
208         make
209         make install
210 }
211
212 build_libpng16 () {
213         fetch_source "libpng1.6" || true
214
215         mkcd "$work_dir/libpng1.6"
216         cmake -DCMAKE_TOOLCHAIN_FILE="$toolchain_file" \
217               -DPNG_STATIC=OFF \
218               -DPNG_TESTS=OFF \
219               -DZLIB_INCLUDE_DIR="$pkg_dir/include" \
220               -DZLIB_LIBRARY="$pkg_dir/lib/libzlib.dll.a" \
221               -DCMAKE_INSTALL_PREFIX="$pkg_dir" \
222               -G"Unix Makefiles" "$this_src"
223         make
224         make install
225 }
226
227 build_libjpeg () {
228         fetch_source libjpeg-turbo || true
229
230         mkcd "$work_dir/libjpeg"
231         cmake -DCMAKE_TOOLCHAIN_FILE="$toolchain_file" \
232               -DCMAKE_SYSTEM_PROCESSOR="$ARCH" \
233               -DCMAKE_INSTALL_PREFIX="$pkg_dir" \
234               -DENABLE_SHARED=ON \
235               -DENABLE_STATIC=OFF \
236               -DWITH_TURBOJPEG=OFF \
237               -G"Unix Makefiles" "$this_src"
238         make
239         make install
240 }
241
242 build_curl () {
243         fetch_source curl || true
244
245         # curl versions older than 7.81.0 used CMAKE instead of CURL for
246         # private USE identifiers
247         verlt $this_ver 7.81.0 && PARAM="CMAKE" || PARAM="CURL"
248
249         mkcd "$work_dir/curl"
250         cmake -DCMAKE_TOOLCHAIN_FILE="$toolchain_file" \
251               -DCMAKE_INSTALL_PREFIX="$pkg_dir" \
252               -DZLIB_INCLUDE_DIR="$pkg_dir/include" \
253               -DZLIB_LIBRARY="$pkg_dir/lib/libzlib.dll.a" \
254               -D${PARAM}_USE_SCHANNEL=ON \
255               -DBUILD_SHARED_LIBS=ON \
256               -DBUILD_CURL_EXE=OFF \
257               -DHTTP_ONLY=ON \
258               -G"Unix Makefiles" "$this_src"
259         make
260         make install
261 }
262
263 build_all () {
264         build_zlib
265         build_gmp
266         build_libd0
267         build_libogg
268         build_libvorbis
269         build_libtheora
270         build_freetype
271         build_libpng16
272         build_libjpeg
273         build_curl
274 }
275
276 install () {
277         mkdir -p "$out_dir"
278
279         cp -v "$pkg_dir/bin/libgmp-10.dll" "$out_dir"
280         cp -v "$pkg_dir/bin/libd0_blind_id-0.dll" "$out_dir"
281         cp -v "$pkg_dir/bin/libd0_rijndael-0.dll" "$out_dir"
282         cp -v "$pkg_dir/bin/libogg.dll" "$out_dir"
283         cp -v "$pkg_dir/bin/libvorbis.dll" "$out_dir"
284         cp -v "$pkg_dir/bin/libvorbisenc.dll" "$out_dir"
285         cp -v "$pkg_dir/bin/libvorbisfile.dll" "$out_dir"
286         cp -v "$pkg_dir/bin/libtheora-0.dll" "$out_dir"
287         cp -v "$pkg_dir/bin/libfreetype.dll" "$out_dir/libfreetype-6.dll"
288         cp -v "$pkg_dir/bin/zlib1.dll" "$out_dir"
289         cp -v "$pkg_dir/bin/libpng16.dll" "$out_dir"
290         cp -v "$pkg_dir/bin/libjpeg-62.dll" "$out_dir/libjpeg.dll"
291         cp -v "$pkg_dir/bin/libcurl.dll" "$out_dir/libcurl-4.dll"
292
293         # Required for win32 builds
294         if [ "$ARCH" = "i686" ]; then
295                 cp -v "/usr/lib/gcc/i686-w64-mingw32/10-win32/libgcc_s_dw2-1.dll" "$out_dir"
296         fi
297
298         cd "$out_dir"
299         ${CHOST}-strip -s *.dll
300 }
301
302 clean () {
303         rm -rf "$buildpath/src"
304         rm -rf "$buildpath/work"
305         rm -rf "$buildpath/pkg"
306         rm -rf "$buildpath/out"
307 }
308
309 list () {
310         echo "Compilable libraries:"
311         echo
312         echo gmp
313         echo libd0
314         echo libogg
315         echo libvorbis
316         echo libtheora
317         echo freetype
318         echo zlib
319         echo libpng16
320         echo libjpeg
321         echo curl
322 }
323
324 usage () {
325         echo "Experimental Windows DLL cross-compiling for Xonotic"
326         echo "by z411"
327         echo
328         echo "usage: $0 <step> [build path] [arch]"
329         echo
330         echo "available steps (require arch):"
331         echo "  <library name>: build specified library"
332         echo "  build_all: build all libraries"
333         echo "  install: copy built DLLs into output directory"
334         echo "  all: do all the previous steps in order"
335         echo
336         echo "steps without arch:"
337         echo "  list: list all compilable libraries"
338         echo "  clean: delete all work"
339         echo
340         echo "arch can be:"
341         echo "  win32"
342         echo "  win64"
343 }
344
345 step=$1
346 buildpath=$2
347 target_arch=$3
348
349 case $step in
350         gmp)           prepare && build_gmp ;;
351         libd0)         prepare && build_libd0 ;;
352         libogg)        prepare && build_libogg ;;
353         libvorbis)     prepare && build_libvorbis ;;
354         libtheora)     prepare && build_libtheora ;;
355         freetype)      prepare && build_freetype ;;
356         zlib)          prepare && build_zlib ;;
357         libpng16)      prepare && build_libpng16 ;;
358         libjpeg)       prepare && build_libjpeg ;;
359         curl)          prepare && build_curl ;;
360         build_all)     prepare && build_all ;;
361         install)       prepare && install ;;
362         all)           prepare && build_all && install ;;
363         clean)         clean ;;
364         list)          list ;;
365         *)             usage ;;
366 esac