--- layout: post title: Building DXVK's DLLs on Gentoo tags: - wine - dxvk - gentoo TocOpen: true ShowToc: true --- By far the easiest way to do it is on a Debian chroot, but that ain't as fun as building your own toolchain and do it on Gentoo.
# Dependencies According to the official documentation: - wine 3.10 or newer - Meson build system (at least version 0.43) - MinGW64 compiler and headers (requires threading support) - glslang front end and validator All but MinGW you can install directly from portage: ``` emerge virtual/wine dev-util/meson dev-util/glslang ``` ## MinGW64 MinGW with POSIX threads is required, problem is, by default `crossdev` will compile GCC with Win32 threads instead of POSIX. Start by creating your toolchain with `crossdev`, tuple for x86 is `i686-w64-mingw32` and `x86_64-w64-mingw32` for x64: ``` crossdev -t i686-w64-mingw32 crossdev -t x86_64-w64-mingw32 ``` Fix GCC by enabling POSIX threads: ``` mkdir /etc/portage/{env,package.env} echo 'EXTRA_ECONF="--enable-threads=posix"' > /etc/portage/env/mingw32_posix_threads echo -e 'cross-i686-w64-mingw32/gcc mingw32_posix_threads\ncross-x86_64-w64-mingw32/gcc mingw32_posix_threads' > /etc/portage/package.env/mingw32_posix_threads ``` Then add the `libraries` `USE` to `mingw64-runtime`: ``` cross-i686-w64-mingw32/mingw64-runtime libraries cross-x86_64-w64-mingw32/mingw64-runtime libraries ``` Rebuild `mingw64-runtime` and `gcc`. Order matters, `mingw64-runtime` with `libraries` provides `pthreads.h` and other stuff that's required to compile GCC with the POSIX thread model. ``` emerge -1 cross-i686-w64-mingw32/mingw64-runtime cross-x86_64-w64-mingw32/mingw64-runtime emerge -1 cross-i686-w64-mingw32/gcc cross-x86_64-w64-mingw32/gcc ``` Depending on the runtime version, libraries may end up in the wrong place (see bug #653246), if that's the case sysmlink those and then rebuild GCC: ```sh ln -s /usr/x86_64-w64-mingw32/usr/lib64/{libmangle.a,libpthread.a,libpthread.dll.a,libwinpthread.a,libwinpthread.dll.a,libwinpthread.la} \ /usr/x86_64-w64-mingw32/usr/lib/ ``` Final result should be: ``` i686-w64-mingw32-gcc -v ... Thread model: posix ... x86_64-w64-mingw32-gcc -v ... Thread model: posix ... ``` # Crosscompiling DLLs ``` git clone https://github.com/doitsujin/dxvk.git cd dxvk ### 32-bit build. For 64-bit builds, replace ### build-win32.txt with build-win64.txt ### build.w32 with build.w64 meson --cross-file build-win32.txt --prefix /some/install/prefix build.w32 cd build.w32/ meson configure -Dbuildtype=release ninja ninja install ``` ``` ls /some/install/prefix/bin d3d11.dll dxgi.dll setup_dxvk.sh ``` These are the toolchains I used. ``` cross-i686-w64-mingw32/binutils-2.30-r3 cross-i686-w64-mingw32/gcc-7.3.0-r3 cross-i686-w64-mingw32/mingw64-runtime-5.0.4 cross-x86_64-w64-mingw32/binutils-2.30-r3 cross-x86_64-w64-mingw32/gcc-7.3.0-r3 ### symlinks from ...lib64/ -> ...lib/ required! see bug #653246 cross-x86_64-w64-mingw32/mingw64-runtime-5.0.4 ```