]> git.xonotic.org Git - xonotic/xonotic.wiki.git/blobdiff - Shared-libraries-(buildfiles).md
Add troubleshooting section based on Exporting a weapon for Xonotic page
[xonotic/xonotic.wiki.git] / Shared-libraries-(buildfiles).md
index abd9c9b1f4bc4577f4e00997f89e73bcfb2ad174..56053581f0585dcb4936a9e87fa98da3c7d174e4 100644 (file)
@@ -1,19 +1,31 @@
-Xonotic on Linux uses system libraries. For Windows and macOS external dlls and dylibs are needed. Those reside in xonotic/misc/buildfiles
+darkplaces/Xonotic on Linux uses system libraries. For Windows and macOS external dlls and dylibs are needed. Those reside in xonotic/misc/buildfiles
 
 Because at the time of writing there is no automatism to build or update the games dependencies for those 2 platforms and the current dlls/dylibs are VERY outdated and thus also contain vulnerabilities, this page should document on where to obtain or how to build them, retaining API compatibility to darkplaces and also older OS platform versions like Windows XP.
 
-For Windows, all libraries can/should be obtained from https://packages.msys2.org/search [1] with the exception of an official DLL release from the upstream being available (this is the case for libjpeg-turbo) or if it has to be compiled on under Windows for some reason (eg. libcurl for Schannel (Windows crypto for HTTPS) support).
+For Windows, all libraries can/should be obtained from https://packages.msys2.org/ [1] with the exception of an official DLL release from the upstream being available (this is the case for jpeg-turbo and freetype) or if it has to be compiled on under Windows for some reason (eg. libcurl for Schannel (Windows crypto for HTTPS) support).
+
+A handy tool to check dll deps on Windows is https://github.com/lucasg/Dependencies
+
+TODO: macOS
 
 # libcurl
 libcurl is used for downloading *.pk3 files from servers
 
 ### Windows
-Darkplaces loads `libcurl-4.dll` or `libcurl-3.dll`
 
-Build instructions:
-* clone https://gitlab.com/incognico/build-libcurl-windows
-* run `build.bat` in a VS2019 Development Shell
-* rename the built dlls (x64 & x86) to `libcurl-4.dll`
+```
+git clone -b curl-7_80_0 https://github.com/curl/curl || true
+curl -o x86_64-w64-mingw32.cmake https://raw.githubusercontent.com/zyga/cmake-toolchains/master/Toolchain-Ubuntu-mingw64.cmake
+d0=$(pwd)
+rm -rf build
+mkdir build
+cd build
+cmake -DCMAKE_TOOLCHAIN_FILE="$d0/x86_64-w64-mingw32.cmake" -DCMAKE_INSTALL_PREFIX="$d0/out" -DCURL_USE_SCHANNEL=YES -G"Unix Makefiles" "$d0/curl"
+make
+make install
+cd "$d0"
+cp out/bin/libcurl.dll ~/Games/xonotic/misc/buildfiles/win64/libcurl-4.dll
+```
 
 ### macOS
 Darkplaces loads `libcurl.4.dylib` or `libcurl.3.dylib` or `libcurl.2.dylib`
@@ -22,54 +34,316 @@ Darkplaces loads `libcurl.4.dylib` or `libcurl.3.dylib` or `libcurl.2.dylib`
 libjpeg-turbo is needed to display jpeg images/textures
 
 ### Windows
-Darkplaces loads `libjpeg.dll`
 
-Obtainment instructions:
-* download libjpeg-turbo-VERSION-vc.exe & libjpeg-turbo-VERSION-vc64.exe from https://sourceforge.net/projects/libjpeg-turbo/files/
-* extract the *.exe files and use `bin/jpeg62.dll`
-* rename the dlls (x64 & x86) to `libjpeg.dll`
+```
+git clone https://github.com/libjpeg-turbo/libjpeg-turbo.git || true
+curl -o x86_64-w64-mingw32.cmake https://raw.githubusercontent.com/zyga/cmake-toolchains/master/Toolchain-Ubuntu-mingw64.cmake
+d0=$(pwd)
+rm -rf build
+mkdir build
+cd build
+cmake -DCMAKE_TOOLCHAIN_FILE="$d0/x86_64-w64-mingw32.cmake" -DCMAKE_SYSTEM_PROCESSOR=x86_64 -DCMAKE_INSTALL_PREFIX="$d0/out" -G"Unix Makefiles" "$d0/libjpeg-turbo"
+make
+make install
+cd "$d0"
+cp out/bin/libjpeg-62.dll ~/Games/xonotic/misc/buildfiles/win64/libjpeg.dll
+```
 
 ### macOS
 Darkplaces loads `libjpeg.62.dylib`
 
+# zlib
+zlib is required to read *.pk3 files. Also it is a dependency of libpng and probably some other libraries.
+
+### Windows
+Darkplaces loads: ifdef ZLIB_USES_WINAPI `zlibwapi.dll` or `zlib.dll` else `zlib1.dll`. We use `zlib1.dll`!
+
+Obtainment instructions:
+* download as MSYS2 Package [1] in x86 and x64 versions: https://packages.msys2.org/base/mingw-w64-zlib
+* use dll from `bin` folder
+
+Cross-compiling:
+
+```
+ZLIBVER="1.2.11"
+curl -L -o zlib-$ZLIBVER.tar.xz https://zlib.net/zlib-$ZLIBVER.tar.xz || true
+tar -xf zlib-$ZLIBVER.tar.xz
+rm zlib-$ZLIBVER.tar.xz
+curl -o x86_64-w64-mingw32.cmake https://raw.githubusercontent.com/zyga/cmake-toolchains/master/Toolchain-Ubuntu-mingw64.cmake
+
+d0=$(pwd)
+rm -rf build
+mkdir build
+cd build
+sed -i '/zlib PROPERTIES SUFFIX/i     set_target_properties(zlib PROPERTIES PREFIX "")' "$d0/zlib-$ZLIBVER/CMakeLists.txt" # Remove the "lib" prefix. TODO Do this through the cmake cache?
+cmake -DCMAKE_TOOLCHAIN_FILE="$d0/x86_64-w64-mingw32.cmake" -DBUILD_SHARED_LIBS=true -DCMAKE_SYSTEM_PROCESSOR=x86_64 -DCMAKE_INSTALL_PREFIX="$d0/out" -G"Unix Makefiles" "$d0/zlib-$ZLIBVER"
+make
+make install
+cd "$d0"
+cp out/bin/zlib1.dll ~/Games/xonotic/misc/buildfiles/win64/zlib1.dll
+```
+
+### macOS
+Darkplaces loads `libz.dylib`
+
 # libpng
 libpng is needed to display png images/textures
 
 ### Windows
 Darkplaces loads `libpng16.dll` or `libpng16-16.dll` or `libpng15-15.dll` or `libpng15.dll` or `libpng14-14.dll` or `libpng14.dll` or `libpng12.dll`
 
+Obtainment instructions:
+* be sure to use a 1.16.X release
+* download MSYS2 Package [1] in x86 and x64 versions: https://packages.msys2.org/base/mingw-w64-libpng
+* use dll from `bin` folder
+
+Cross-compiling (requires zlib):
+
+```
+d0=$(pwd)
+PNGVER="libpng16"
+ZLIB_ROOT=$d0/../zlib/out # Location to the zlib compiled library
+
+git clone -b $PNGVER git://git.code.sf.net/p/libpng/code libpng || true
+curl -o x86_64-w64-mingw32.cmake https://raw.githubusercontent.com/zyga/cmake-toolchains/master/Toolchain-Ubuntu-mingw64.cmake
+
+rm -rf build
+mkdir build
+cd build
+cmake -DCMAKE_TOOLCHAIN_FILE="$d0/x86_64-w64-mingw32.cmake" -DPNG_STATIC=false -DPNG_TESTS=false -DPNG_EXECUTABLES=false -DCMAKE_SYSTEM_PROCESSOR=x86_64 -DZLIB_INCLUDE_DIR=$ZLIB_ROOT/include -DZLIB_LIBRARY=$ZLIB_ROOT/lib/libzlib.dll.a -DCMAKE_INSTALL_PREFIX="$d0/out" -G"Unix Makefiles" "$d0/libpng"
+make
+make install
+cd "$d0"
+cp out/bin/libpng16.dll ~/Games/xonotic/misc/buildfiles/win64/libpng16.dll
+```
+
 ### macOS
 Darkplaces loads `libpng16.16.dylib` or `libpng15.15.dylib` or `libpng14.14.dylib` or `libpng12.0.dylib`
 
-# zlib
-zlib is required to read *.pk3 files. Also it is a dependency of libpng and probably some other libraries.
+# libfreetype
+Required for the Xolonium font
 
 ### Windows
-Darkplaces loads: ifdef ZLIB_USES_WINAPI `zlibwapi.dll` or `zlib.dll` else `zlib1.dll`. We use `zlib1.dll`!
+Darkplaces loads: `libfreetype-6.dll` or `freetype6.dll`
+
+```
+FTVER="2.11.1"
+curl -L -o freetype-$FTVER.tar.xz https://download.savannah.gnu.org/releases/freetype/freetype-$FTVER.tar.xz || true
+tar -xf freetype-$FTVER.tar.xz
+rm freetype-$FTVER.tar.xz
+
+curl -o x86_64-w64-mingw32.cmake https://raw.githubusercontent.com/zyga/cmake-toolchains/master/Toolchain-Ubuntu-mingw64.cmake
+d0=$(pwd)
+rm -rf build
+mkdir build
+cd build
+cmake -DCMAKE_TOOLCHAIN_FILE="$d0/x86_64-w64-mingw32.cmake" -DBUILD_SHARED_LIBS=true -DCMAKE_BUILD_TYPE=Release -DCMAKE_SYSTEM_PROCESSOR=x86_64 -DCMAKE_INSTALL_PREFIX="$d0/out" -G"Unix Makefiles" "$d0/freetype-$FTVER"
+make
+make install
+cd "$d0"
+cp out/bin/libfreetype.dll ~/Games/xonotic/misc/buildfiles/win64/libfreetype-6.dll
+```
+
+### macOS
+Darkplaces loads: `libfreetype.6.dylib` or `libfreetype.dylib`
+
+# libogg
+libogg is used for the container in cl_capturevideo
+
+### Windows
+Darkplaces loads `libogg-0.dll` or `libogg.dll` or `ogg.dll`
 
 Obtainment instructions:
-* Download as MSYS2 Package [1] in x86 and x64 versions
+* download MSYS2 Package [1] in x86 and x64 versions: https://packages.msys2.org/base/mingw-w64-libogg
+* use dll from `bin` folder
+
+Cross-compiling:
+
+```
+d0=$(pwd)
+OGGVER="v1.3.5"
+git clone -b $OGGVER https://gitlab.xiph.org/xiph/ogg.git
+sed -i 's/^LIBRARY ogg$/LIBRARY libogg/' "$d0/ogg/win32/ogg.def" # Call it libogg
+curl -o x86_64-w64-mingw32.cmake https://raw.githubusercontent.com/zyga/cmake-toolchains/master/Toolchain-Ubuntu-mingw64.cmake
+rm -rf build
+mkdir build
+cd build
+cmake -DCMAKE_TOOLCHAIN_FILE="$d0/x86_64-w64-mingw32.cmake" -DBUILD_SHARED_LIBS=true -DCMAKE_SYSTEM_PROCESSOR=x86_64 -DCMAKE_INSTALL_PREFIX="$d0/out" -G"Unix Makefiles" "$d0/ogg"
+make
+make install
+cd "$d0"
+cp out/bin/libogg.dll ~/Games/xonotic/misc/buildfiles/win64/libogg.dll
+```
 
 ### macOS
-Darkplaces loads `libz.dylib`
+Darkplaces loads `libogg.dylib`
 
-# libfreetype
+# libvorbis + libvorbisfile + libvorbisenc
+libvorbis + libvorbisfile are used to play .ogg audio files while libvorbis + libvorbisenc is used for the audio in video capturing (cl_capturevideo)
 
-# libogg
+### Windows
+Darkplaces loads `libvorbis-0.dll` or `libvorbis.dll` or `vorbis.dll` and `libvorbisfile-3.dll` or `libvorbisfile.dll` or `vorbisfile.dll` and `libvorbisenc-2.dll` or `vorbisenc-2.dll` or `vorbisenc.dll`
+
+Obtainment instructions:
+* download MSYS2 Package [1] in x86 and x64 versions: https://packages.msys2.org/base/mingw-w64-libvorbis
+* use dll from `bin` folder
+
+Cross-compiling (requires libogg):
 
-# libvorbis
+```
+d0=$(pwd)
+VORBISVER="v1.3.7"
+OGG_ROOT=$d0/../ogg/out
 
-# libvorbisfile
+git clone -b $VORBISVER https://gitlab.xiph.org/xiph/vorbis.git
 
-# libvorbisenc
+# Fix win32 def files
+sed -i 's/^LIBRARY$/LIBRARY libvorbis/' "$d0/vorbis/win32/vorbis.def"
+sed -i 's/^LIBRARY$/LIBRARY libvorbisenc/' "$d0/vorbis/win32/vorbisenc.def"
+sed -i 's/^LIBRARY$/LIBRARY libvorbisfile/' "$d0/vorbis/win32/vorbisfile.def"
+
+curl -o x86_64-w64-mingw32.cmake https://raw.githubusercontent.com/zyga/cmake-toolchains/master/Toolchain-Ubuntu-mingw64.cmake
+rm -rf build
+mkdir build
+cd build
+cmake -DCMAKE_TOOLCHAIN_FILE="$d0/x86_64-w64-mingw32.cmake" -DBUILD_SHARED_LIBS=true -DOGG_INCLUDE_DIR=$OGG_ROOT/include -DOGG_LIBRARY=$OGG_ROOT/lib/libogg.dll.a -DCMAKE_SYSTEM_PROCESSOR=x86_64 -DCMAKE_INSTALL_PREFIX="$d0/out" -G"Unix Makefiles" "$d0/vorbis"
+make
+make install
+cd "$d0"
+cp out/bin/libvorbis.dll ~/Games/xonotic/misc/buildfiles/win64/libvorbis.dll
+cp out/bin/libvorbisfile.dll ~/Games/xonotic/misc/buildfiles/win64/libvorbisfile.dll
+cp out/bin/libvorbisenc.dll ~/Games/xonotic/misc/buildfiles/win64/libvorbisenc.dll
+```
+
+### macOS
+Darkplaces loads `libvorbis.dylib` and `libvorbisfile.dylib`
 
 # libtheora
+libtheora is used for the video in cl_capturevideo
+libtheoraenc/libtheoradec are not needed, they are the newer API; darkplaces uses the legacy pre 1.0 API (libtheora).
 
-# libstdc++-6 & libgcc_s_sjlj-1
-libgcc_s_sjlj-1 is a dependency of libstdc++-6
+### Windows
+Darkplaces loads `libtheora-0.dll` or `theora-0.dll` or `theora.dll`
 
-# libd0_blind_id-0 & libd0_rijndael-0
-See https://gitlab.com/xonotic/d0_blind_id
+Obtainment instructions:
+* download MSYS2 Package [1] in x86 and x64 versions: https://packages.msys2.org/base/mingw-w64-libtheora
+* use dll from `bin` folder
+
+Cross-compiling (requires libogg and libvorbis):
+
+```
+d0=$(pwd)
+THEORAVER="v1.1.1"
+OGG_ROOT="$d0/../ogg/out"
+VORBIS_ROOT="$d0/../vorbis/out"
+
+git clone -b $THEORAVER https://gitlab.xiph.org/xiph/theora.git
+
+# Fix mingw32 defs
+sed -i '1iLIBRARY libtheoradec' "$d0/theora/win32/xmingw32/libtheoradec-all.def"
+sed -i '1iLIBRARY libtheoraenc' "$d0/theora/win32/xmingw32/libtheoraenc-all.def"
+sed -i '/TH_VP31_QUANT_INFO/d' "$d0/theora/win32/xmingw32/libtheoraenc-all.def"
+sed -i '/TH_VP31_HUFF_CODES/d' "$d0/theora/win32/xmingw32/libtheoraenc-all.def"
+
+# Start build
+mkdir out
+mkdir build
+cd build
+$d0/theora/autogen.sh --host=x86_64-w64-mingw32 --prefix="$d0/out" --with-ogg="$OGG_ROOT" --with-vorbis="$VORBIS_ROOT" --enable-shared --disable-examples --disable-sdltest --disable-vorbistest --disable-oggtest
+make
+make install
+cd "$d0"
+cp out/bin/libtheora-0.dll ~/Games/xonotic/misc/buildfiles/win64/libtheora-0.dll
+```
+
+### macOS
+Darkplaces loads `libtheora.dylib`
 
 # libgmp
-A dependency of libd0_blind_id-0
\ No newline at end of file
+A dependency of libd0_blind_id-0
+
+### Linux
+
+`./configure --prefix=$HOME/Games/xonotic/misc/builddeps/linux64/gmp --enable-static --disable-shared --with-pic --enable-fat`
+
+### Windows
+libd0_blind_id-0 loads `libgmp-10.dll`
+
+Obtainment instructions:
+* download as MSYS2 Package [1] in x86 and x64 versions: https://packages.msys2.org/base/mingw-w64-gmp
+* use dll from `bin` folder
+
+Cross-compiling:
+
+```
+d0=$(pwd)
+GMPVER="6.2.1"
+
+curl -o gmp-$GMPVER.tar.xz https://gmplib.org/download/gmp/gmp-$GMPVER.tar.xz
+tar xf gmp-$GMPVER.tar.xz
+rm gmp-$GMPVER.tar.xz
+
+mkdir out
+mkdir build
+cd build
+"$d0/gmp-$GMPVER/configure" --prefix="$d0/out" --host=x86_64-w64-mingw32 --with-pic --enable-fat --disable-static --enable-shared
+make
+make install
+cd "$d0"
+cp out/bin/libgmp-10.dll ~/Games/xonotic/misc/buildfiles/win64/libgmp-10.dll
+```
+
+# libd0_blind_id-0 & libd0_rijndael-0
+Internal project, see https://gitlab.com/xonotic/d0_blind_id
+
+### Linux
+
+`LDFLAGS='-L$HOME/Games/xonotic/misc/builddeps/linux64/gmp/lib' CPPFLAGS='-I$HOME/Games/xonotic/misc/builddeps/linux64/gmp/include' ./configure --prefix=$HOME/Games/xonotic/misc/builddeps/linux64/d0_blind_id  --enable-static --disable-shared --with-pic`
+
+### Windows
+Cross-compiling (requires libgmp):
+
+```
+d0=$(pwd)
+GMP_ROOT="$d0/../gmp/out"
+export LDFLAGS="-L$GMP_ROOT/lib"
+export CPPFLAGS="-I$GMP_ROOT/include"
+
+git clone https://gitlab.com/xonotic/d0_blind_id.git
+
+cd d0_blind_id
+./autogen.sh
+sed -i '/libd0_blind_id_la_LDFLAGS/ s/$/ -no-undefined/' Makefile.am
+sed -i '/libd0_rijndael_la_LDFLAGS/ s/$/ -no-undefined/' Makefile.am
+
+cd "$d0"
+mkdir build
+mkdir out
+cd build
+"$d0/d0_blind_id/configure" --with-pic --prefix="$d0/out" --host=x86_64-w64-mingw32
+make
+make install
+
+cd "$d0"
+cp out/bin/libd0_blind_id-0.dll ~/Games/xonotic/misc/buildfiles/win64/libd0_blind_id-0.dll
+cp out/bin/libd0_rijndael-0.dll ~/Games/xonotic/misc/buildfiles/win64/libd0_rijndael-0.dll
+```
+
+# libode
+Is not loaded under Windows and crashes the game if it is and a map is loaded up.
+Also it is not statically linked and thus requires libstdc++-6.dll and libgcc_s_sjlj-1.dll.
+
+### Linux:
+
+`./configure --enable-static --disable-shared --with-libccd=internal --enable-double-precision --prefix=$HOME/Games/xonotic/misc/builddeps/linux64/ode --with-pic`
+
+# libavw
+*Note:* Old and not used in Xonotic but also not disabled :) Adding this for the sake of completeness.
+
+### Windows
+Darkplaces loads: `libavw.dll`
+
+Source code: https://github.com/paulvortex/DpLibAVW
+
+### macOS
+Darkplaces loads: `libavw.dylib`
\ No newline at end of file