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