3 # Xonotic DLL automatic cross-compile script
7 echo "Working directory is $d0"
10 if ! dpkg -s "$1" >/dev/null 2>&1 ; then
11 echo "$1 package is required. Please install it."
17 if [ -z $out_dir ]; then
18 echo "Out directory not set."
24 win64) ARCH="x86_64" ;;
25 *) echo "Invalid arch (win32 or win64)." && exit -1 ;;
29 src_dir="$d0/dlls/src"
30 work_dir="$d0/dlls/work/$target_arch"
31 pkg_dir="$d0/dlls/pkg/$target_arch"
34 CHOST="$ARCH-w64-mingw32"
35 toolchain_file="$d0/toolchain-$CHOST.cmake"
37 # Fix for Debian package missing the Windows resource file
38 zlib1rc_file="$d0/zlib1.rc"
40 export LDFLAGS="-L$pkg_dir/lib"
41 export CPPFLAGS="-I$pkg_dir/include"
58 dir=$(find . -maxdepth 1 -type d -print | grep -m1 "^\./$1") || return 1
59 this_src="$src_dir/$dir"
66 if get_this_src "$1"; then
67 echo "Source for $1 already exists."
70 echo "Getting source for $1..."
78 printf '%s\n%s' "$1" "$2" | sort -C -V
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"
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"
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"
112 fetch_source gmp || true
115 "$this_src/configure" --prefix="$pkg_dir" \
126 if [[ -d "$src_dir/d0_blind_id" ]] ; then
127 echo "Sources already exist."
129 echo "Getting git sources for libd0..."
131 git clone https://gitlab.com/xonotic/d0_blind_id.git
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
138 mkcd "$work_dir/libd0"
139 "$src_dir/d0_blind_id/configure" --with-pic \
140 --prefix="$pkg_dir" \
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"
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"
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"
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"
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"
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" \
198 --disable-vorbistest \
205 fetch_source freetype || true
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"
218 fetch_source "libpng1.6" || true
220 mkcd "$work_dir/libpng1.6"
221 cmake -DCMAKE_TOOLCHAIN_FILE="$toolchain_file" \
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"
233 fetch_source libjpeg-turbo || true
235 mkcd "$work_dir/libjpeg"
236 cmake -DCMAKE_TOOLCHAIN_FILE="$toolchain_file" \
237 -DCMAKE_SYSTEM_PROCESSOR="$ARCH" \
238 -DCMAKE_INSTALL_PREFIX="$pkg_dir" \
240 -DENABLE_STATIC=OFF \
241 -DWITH_TURBOJPEG=OFF \
242 -G"Unix Makefiles" "$this_src"
248 fetch_source curl || true
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"
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 \
263 -G"Unix Makefiles" "$this_src"
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"
299 ${CHOST}-strip -s *.dll
303 rm -rf "$d0/dlls/src"
304 rm -rf "$d0/dlls/work"
305 rm -rf "$d0/dlls/pkg"
309 echo "Compilable libraries:"
324 echo "Experimental Windows DLL cross-compiling for Xonotic"
327 echo "usage: $0 <step> [arch] [out directory]"
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"
335 echo "steps without arch:"
336 echo " list: list all compilable libraries"
337 echo " clean: delete all work"
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 ;;