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.
...
@@ -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.
...
@@ -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
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
...
@@ -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 -j8tools/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
...
@@ -131,8 +123,7 @@ Alternatively, you can get them from the official
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 \
...
@@ -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
...
@@ -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
...
@@ -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:
...
@@ -234,24 +221,14 @@ will also need to include the vulkan headers:
- 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