Update Building a MinGW WoW64 Wine with a custom vkd3d build

Francisco Casas
2024-11-28 07:09:20 +00:00
parent 5d721af772
commit bb307a0df4

@@ -1,15 +1,13 @@
As of version 7.4, Wine comes with a bundled version of vkd3d. As of version 7.4, Wine comes with a bundled version of vkd3d.
However, if you want to use a more modern version of vkd3d, apply However, if you want to use a more modern version of vkd3d, apply
certain patches to it, or test fixes of your own, you will need Wine to certain patches to it, or test fixes of your own, you will need Wine to work with a custom version of vkd3d.
work with a custom version of vkd3d.
For this purpose, it is necessary to build both projects and link them For this purpose, it is necessary to build both projects and link them
correctly. correctly.
Compiling a Windows on Windows (WoW) version of Wine, so that it Compiling a Windows on Windows (WoW) version of Wine, so that it
supports both 32-bits and 64-bits Windows applications which is often supports both 32-bits and 64-bits Windows applications which is often desired adds a layer of complexity to the build process.
desired adds a layer of complexity to the build process.
Furthermore, you may want to use MinGW to cross-compile the Wine Furthermore, you may want to use MinGW to cross-compile the Wine
executables and DLLs in the Windows PE format. This is because various executables and DLLs in the Windows PE format. This is because various
@@ -22,19 +20,17 @@ This guide aims to help you through that process.
## Install Wine dependencies ## Install Wine dependencies
First, install the dependencies listed in the [Building First, install the dependencies listed in the [Building
Wine](https://gitlab.winehq.org/wine/wine/-/wikis/Building-Wine#satisfying-build-dependencies) article. If you system doesn't have multi-lib support you will probably need to work with containers, virtual machines, of chroot as suggested. Wine](https://gitlab.winehq.org/wine/wine/-/wikis/Building-Wine#satisfying-build-dependencies) article. If you system doesn't have multi-lib support you will probably need to work with containers, virtual machines, or chroot as suggested.
Remember to install the `:i386` version of the required packages too (if Remember to install the `:i386` version of the required packages too (if your system has multi-lib support).
your system has multi-lib support).
The **mingw** and **vulkan** packages are of particular importance. The **mingw** and **vulkan** packages are important.
It is also recommended that you install `ccache`, as it may save us a It is also recommended that you install `ccache`, as it may save us a
considerable amount of time during the builds. considerable amount of time during the builds.
If you have a system-wide installation of vkd3d, it may be good to If you have a system-wide installation of vkd3d, it may be good to
uninstall it using `make uninstall`. To ensure that the correct version uninstall it using `make uninstall`. To ensure that the correct version of vkd3d is linked in this tutorial.
of vkd3d is linked in this tutorial.
## Directory organization ## Directory organization
@@ -78,8 +74,7 @@ patches to these repositories.
If the distribution provides a recent enough version (3.21 or later as If the distribution provides a recent enough version (3.21 or later as
of this writing) of WIDL, we can skip this step. On Debian that's of this writing) of WIDL, we can skip this step. On Debian that's
provided by the `mingw-w64-tools` package. We can also skip this step if provided by the `mingw-w64-tools` package. We can also skip this step if we already have 64-bit Wine available and built.
we already have 64-bit Wine available and built.
Vkd3d uses WIDL to compile its IDL files, and if the distribution Vkd3d uses WIDL to compile its IDL files, and if the distribution
doesn't provide a package, we'll have to build it from the Wine doesn't provide a package, we'll have to build it from the Wine
@@ -98,9 +93,7 @@ $ ../wine-git/configure --enable-win64 CC='ccache gcc' x86_64_CC='ccache x86_64-
``` ```
Note that we use `x86_64_CC` to indicate the compiler used for Note that we use `x86_64_CC` to indicate the compiler used for
cross-compilation, in this case we need the 64-bit mingw32 compiler. We cross-compilation, in this case we need the 64-bit mingw32 compiler. We prepend `ccache` which works as a wrapper for the compiler. The same is done for the regular C compiler, `gcc`, passed with the `CC` variable.
prepend `ccache` which works as a wrapper for the compiler. The same is
done for the regular C compiler, `gcc`, passed with the `CC` variable.
Note that to know about other parameters for the `configure` script we Note that to know about other parameters for the `configure` script we
can use: can use:
@@ -113,11 +106,10 @@ Also, if something from the configure command fails, it is useful to
search in `config.log` for the line that contains the pertinent error, search in `config.log` for the line that contains the pertinent error,
and the lines before and after it. and the lines before and after it.
Once the configure script has finished, we use `make tools/widl/widl` to Once the configure script has finished, we use `make tools/widl/widl` to only compile WIDL.
only compile WIDL. We can pass `-j`<n> to use <n> threads.
``` sh ``` sh
$ make -j8 tools/widl/widl $ make tools/widl/widl
``` ```
## Build a 64-bit vkd3d installation ## Build a 64-bit vkd3d installation
@@ -131,8 +123,7 @@ Alternatively, you can get them from the official
[SPIRV-Headers](https://github.com/KhronosGroup/SPIRV-Headers) [SPIRV-Headers](https://github.com/KhronosGroup/SPIRV-Headers)
repositories. repositories.
Another alternative is to copy them from your distribution. Usually the Another alternative is to copy them from your distribution. Usually the host headers will be installed in `/usr/include/vulkan/` and
host headers will be installed in `/usr/include/vulkan/` and
`/usr/include/spirv/`. `/usr/include/spirv/`.
Assuming you downloaded and extracted the SDK, move it to the common Assuming you downloaded and extracted the SDK, move it to the common
@@ -143,7 +134,7 @@ $ mv <vulkan sdk path> $HOME/wine-dirs/vulkan-sdk
``` ```
You must change the first argument of the `mv` command depending on You must change the first argument of the `mv` command depending on
where you downloaded and extracted the SDK. e.g. where you downloaded and extracted the SDK, including the version number. e.g.
`~/Downloads/vulkansdk-linux-x86_64-1.3.204.1/1.3.204.1`. `~/Downloads/vulkansdk-linux-x86_64-1.3.204.1/1.3.204.1`.
We have to run `autogen.sh` in `vkd3d-git` to generate vkd3d's We have to run `autogen.sh` in `vkd3d-git` to generate vkd3d's
@@ -185,17 +176,11 @@ $ ../vkd3d-git/configure \
WIDL. When using the distribution's WIDL, `configure` should generally WIDL. When using the distribution's WIDL, `configure` should generally
be able to find WIDL on its own and this variable can be omitted; if be able to find WIDL on its own and this variable can be omitted; if
not, point it to the location of the distribution's WIDL. not, point it to the location of the distribution's WIDL.
- `SONAME_LIBVULKAN` indicates the name of the Vulkan library to load at - `SONAME_LIBVULKAN` indicates the name of the Vulkan library to load at run-time.
run-time.
- We use `CPPFLAGS` so that the compiler knows to search in the - We use `CPPFLAGS` so that the compiler knows to search in the
`vulkan-sdk` folder for the vulkan headers (`-I` flag). Note that you `vulkan-sdk` folder for the vulkan headers (`-I` flag). Note that you cannot pass `-I/usr/include/` here to use the host headers; this will result in incorrect detection of headers like `dlfcn.h`. You will need to copy or link host headers to a separate directory.
cannot pass `-I/usr/include/` here to use the host headers; this will
result in incorrect detection of headers like `dlfcn.h`. You will need
to copy or link host headers to a separate directory.
- We use `LDFLAGS="-static-libgcc"` because MinGW gcc depends on - We use `LDFLAGS="-static-libgcc"` because MinGW gcc depends on
`libgcc_s_sjlj-1.dll`; this links a static version. Alternatively, you `libgcc_s_sjlj-1.dll`; this links a static version.
can add the correct path to `--with-system-dllpath` as described
below.
Then we run Then we run
@@ -203,7 +188,7 @@ Then we run
$ make $ make
``` ```
Append `-j$(nproc)` to parallelize. You can append `-jN` to parallelize using `N` jobs.
And if the build succeeds, then we run And if the build succeeds, then we run
@@ -213,6 +198,8 @@ $ make install
to install 64-bit vkd3d in `$HOME/wine-dirs/vkd3d64-prefix`. to install 64-bit vkd3d in `$HOME/wine-dirs/vkd3d64-prefix`.
**NOTE:** If the build fails because of missing headers, it might be that your MinGW version is too old. You can try disabling some packages. For instance if `#include <term.h>` fails, you can pass `--without-ncurses` to the configure script and compile again.
## Build 64-bit wine ## Build 64-bit wine
Now with the 64-bit `vkd3d` installation, we can compile a 64-bit Wine Now with the 64-bit `vkd3d` installation, we can compile a 64-bit Wine
@@ -234,24 +221,14 @@ will also need to include the vulkan headers:
``` sh ``` sh
$ cd wine64 $ cd wine64
$ ../wine-git/configure --enable-win64 \ $ ../wine-git/configure --enable-win64 \
CC='ccache gcc' x86_64_CC='ccache x86_64-w64-mingw32-gcc' \ CC='ccache gcc' x86_64_CC='x86_64-w64-mingw32-gcc' \
--with-system-dllpath="$HOME/wine-dirs/vkd3d64-prefix/bin:<mingw 64-bit gcc dynamic dependencies>" \ --with-system-dllpath="$HOME/wine-dirs/vkd3d64-prefix/bin" \
VKD3D_PE_CFLAGS="-I$HOME/wine-dirs/vulkan-sdk/x86_64/include -I$HOME/wine-dirs/vkd3d64-prefix/include/vkd3d" \ VKD3D_PE_CFLAGS="-I$HOME/wine-dirs/vulkan-sdk/x86_64/include -I$HOME/wine-dirs/vkd3d64-prefix/include/vkd3d" \
VKD3D_PE_LIBS="-L$HOME/wine-dirs/vkd3d64-prefix/lib -lvkd3d -lvkd3d-shader" VKD3D_PE_LIBS="-L$HOME/wine-dirs/vkd3d64-prefix/lib -lvkd3d.dll -lvkd3d-shader.dll"
``` ```
- We use `--with-system-dllpath` so that wine knows to search our vkd3d - We use `--with-system-dllpath` so that wine knows to search our vkd3d prefix for the vkd3d DLLs.
prefix for the vkd3d DLLs. If you did not use `-static-libgcc` to - We set `VKD3D_PE_CFLAGS` and `VKD3D_PE_LIBS` to indicate that we will use a custom version of vkd3d. We also use `VKD3D_PE_CFLAGS` to include the Vulkan headers and the vkd3d headers and `VKD3D_PE_LIBS` to load vkd3d's libraries.
compile vkd3d, you should also add the libgcc path here. Depending on
distribution it may be `/usr/x86_64-w64-mingw32/bin/` (Arch),
`/usr/x86_64-w64-mingw32/sys-root/mingw/bin/` (Fedora), or
`/usr/lib/gcc/x86_64-w64-mingw32/##-win32/`, where `##` depends on the
gcc version (Debian).
- Notice that multiple paths should be separated with a colon.
- We set `VKD3D_PE_CFLAGS` and `VKD3D_PE_LIBS` to indicate that we will
use a custom version of vkd3d. We use `VKD3D_PE_CFLAGS` to include the
vulkan headers and the vkd3d headers and `VKD3D_PE_LIBS` to load
vkd3d's dynamic libraries.
- Alternatively, you can install MinGW pkg-config, and pass - Alternatively, you can install MinGW pkg-config, and pass
`PKG_CONFIG_PATH="$HOME/wine-dirs/vkd3d64-prefix/lib/pkgconfig"`. `PKG_CONFIG_PATH="$HOME/wine-dirs/vkd3d64-prefix/lib/pkgconfig"`.
@@ -261,18 +238,16 @@ If you get the following message around the last lines:
configure: libvkd3d 64-bit MinGW development files not found; using bundled version. configure: libvkd3d 64-bit MinGW development files not found; using bundled version.
``` ```
Wine was **not** correctly linked to your custom version of vkd3d. Check Wine was **not** correctly linked to your custom version of vkd3d. Check the `config.log`.
the `config.log`.
Clean ntdll to make sure that the new system DLL path is picked up, and Clean ntdll to make sure that the new system DLL path is picked up, and then rebuild wine:
then rebuild wine:
``` sh ``` sh
$ make dlls/ntdll/clean $ make dlls/ntdll/clean
$ make $ make
``` ```
Append "-j\$(nproc)" to make commands to parallelize. Remember that you can append `-jN` to these `make` commands to parallelize using `N` jobs.
## Build a 32-bit vkd3d installation ## Build a 32-bit vkd3d installation
@@ -292,8 +267,7 @@ $ ../vkd3d-git/configure \
LDFLAGS="-static-libgcc" LDFLAGS="-static-libgcc"
``` ```
- We now use `--host=i686-w64-mingw32` to indicate that we will use the - We now use `--host=i686-w64-mingw32` to indicate that we will use the 32-bit MinGW compiler.
32-bit MinGW compiler.
- We are changing the prefix so that this 32-bit vkd3d is installed in - We are changing the prefix so that this 32-bit vkd3d is installed in
the `vkd3d32-prefix` folder instead of `vkd3d64-prefix`. the `vkd3d32-prefix` folder instead of `vkd3d64-prefix`.
- We're using 64-bit WIDL like before; this is fine. - We're using 64-bit WIDL like before; this is fine.
@@ -317,15 +291,13 @@ $ mkdir wine32
``` sh ``` sh
$ cd wine32 $ cd wine32
$ ../wine-git/configure --with-wine64=../wine64/ \ $ ../wine-git/configure --with-wine64=../wine64 \
CC='ccache gcc' i386_CC='ccache i686-w64-mingw32-gcc' \ CC='ccache gcc' i386_CC='ccache i686-w64-mingw32-gcc' \
--with-system-dllpath="$HOME/wine-dirs/vkd3d32-prefix/bin:<mingw 32-bit dynamic dependencies>" \ --with-system-dllpath="$HOME/wine-dirs/vkd3d32-prefix/bin" \
VKD3D_PE_CFLAGS="-I$HOME/wine-dirs/vulkan-sdk/x86_64/include -I$HOME/wine-dirs/vkd3d32-prefix/include/vkd3d" \ VKD3D_PE_CFLAGS="-I$HOME/wine-dirs/vulkan-sdk/x86_64/include -I$HOME/wine-dirs/vkd3d32-prefix/include/vkd3d" \
VKD3D_PE_LIBS="-L$HOME/wine-dirs/vkd3d32-prefix/lib -lvkd3d -lvkd3d-shader" VKD3D_PE_LIBS="-L$HOME/wine-dirs/vkd3d32-prefix/lib -lvkd3d.dll -lvkd3d-shader.dll"
``` ```
- We now point `--with-system-dllpath`, `VKD3D_PE_CFLAGS` and `VKD3D_PE_LIBS` to the directories inside `vkd3d32-prefix`.
- We now point `--with-system-dllpath` and `VKD3D_PE_LIBS` to the
directories inside `vkd3d32-prefix`.
As above, clean ntdll to make sure that the new system DLL path is As above, clean ntdll to make sure that the new system DLL path is
picked up, and then rebuild wine: picked up, and then rebuild wine:
@@ -335,6 +307,13 @@ $ make dlls/ntdll/clean
$ make $ make
``` ```
You should now be able to execute wine:
```
$ $HOME/wine-dirs/wine64/wine --version
wine-9.22-48-g33c16a81253
```
# Updating your build # Updating your build
If you want to update either wine or vkd3d's source code, we can execute If you want to update either wine or vkd3d's source code, we can execute