Compiling ScummVM/MinGW-w64

From ScummVM :: Wiki
Jump to navigation Jump to search
NOTE
This guide covers only the compilation under MinGW-w64 and MSYS2 (which is very different from MinGW and MSYS), and makes heavy use of the pacman package manager, which may not be available under other MinGW setups.

We don't recommend using this method if you want to distribute your ScummVM builds. Release builds should be done using MXE if possible, since this allows building an (almost) statically linked executable for easy distribution. Feel free to contact me (rootfather) either via eMail or IRC if you have questions regarding MSYS2/MinGW-w64.


NOTE
Despite the name, MinGW-w64 works on both 32-bit and 64-bit systems, but the latest versions cannot be installed on Windows XP anymore. However, builds produced will still work on Windows XP.

If you need to support older Windows, check out MinGW.


Prepare your build environment

Setup MinGW-w64 and MSYS2

You can find MSYS2 on the official webpage and detailed installation instructions on the MSYS2 github wiki.

The MinGW packages are named mingw-<env>-<package>, where <env> is either x86_64 or i686, depending on your architecture (64-bit and 32-bit, respectively).

To create an i686 or x86_64 build environment, we need to first update the already installed packages and the MSYS2 environment itself. To do that, type the following in the MSYS2 terminal:

pacman -Syuu

Follow the instructions (one upgrade step may require that the MSYS2 terminal window is closed directly from the window's e(X)it button on the top right. Keep issuing the above command in the MSYS2 terminal until there's no more updating tasks to be done.

For i686 (32-bit), type the following in the MSYS2 terminal to automatically install all packages/libraries needed to compile ScummVM:

pacman -S --needed --noconfirm base-devel git mingw-w64-i686-{a52dec,ccache,cairo,faad2,freetype,flac,fluidsynth,fribidi,glew,libjpeg-turbo,libogg,libvorbis,libmad,libmpeg2-git,libtheora,libpng,nasm,readline,SDL2,SDL2_net,toolchain,winsparkle,zlib,ntldd-git}

For x86_64 (64-bit), type the following in the MSYS2 terminal to automatically install all packages/libraries needed to compile ScummVM:

pacman -S --needed --noconfirm base-devel git mingw-w64-x86_64-{a52dec,ccache,cairo,faad2,freetype,flac,fluidsynth,fribidi,glew,libjpeg-turbo,libogg,libvorbis,libmad,libmpeg2-git,libtheora,libpng,nasm,readline,SDL2,SDL2_net,toolchain,winsparkle,zlib,ntldd-git}

These commands will fetch and install the packages needed for compiling, including (but not limited to) GCC 10.x, GDB, and libwinpthread-git.

Install modified curl package

The default curl version shipped with MSYS2 relies on an external certificate bundle for verifying SSL/TLS certificates. While this works fine in the mingw-w64 shell itself, it will break SSL verification outside the mingw-w64 shell. Since our cloud integration features rely on a working SSL implementation, we need to build our own curl release using the winssl backend instead. WinSSL - as the name implies - is the SSL/TLS library shipped withing Windows itself, so we can rely on the Windows certificate store.

Thanks to the PKGBUILD already provided by the MSYS2/Mingw-w64 developers, this is pretty straight forward.

First, clone the repository containing the mingw-w64 package files in a seperate directory:

git clone https://github.com/msys2/MINGW-packages

Now, we need to modify the file mingw-w64-curl/PKGBUILD which contains all the instructions makepkg uses for building the final package. At the beginning of the file, select the winssl variant instead of the default openssl version.

#_variant=-openssl
_variant=-winssl
#_variant=-gnutls

Since support for METALINK seems to be broken at the moment (and we don't need it), modify the PKGBUILD file as shown below:

 79   if [ "${_variant}" = "-winssl" ]; then
...
 86     _variant_config+=("--without-librtmp")
 87     _variant_config+=("--without-libmetalink")

Finally, we can build and install the modified package.

Before building the package itself, you need to add the GPG key of the curl developer to your local keychain, so makepkg can validate the package. Under no circumstances you should try skipping the signature checks since you really, REALLY don't want a malicious curl package on your system.

 gpg --recv-keys 5CC908FDB71E12C2

Enter the mingw-w64-curl directory and start the build process:

 makepkg --syncdeps

Depending on your system, building the package should only take a couple of minutes. Finally, install the resulting package using pacman:

 pacman -U mingw-w64-x86_64-curl-winssl-7.xx.0-1-any.pkg.tar.zst

If you have installed curl previously, you need to accept the removal of the previous package since you can't have multiple variants installed at the same time.

Let's get compiling!

Finally, we are ready to compile the project! To do that, just open a MinGW-w64 shell (not the MSYS2 shell), navigate to the source folder where you have cloned scummvm.git, and type the following commands:

 ./configure
 make -j$(nproc)

Note: Depending on what you are working on, have a look at ./configure --help. Sometimes, you want to enable some features or engines that are disabled by default, while working on a specific engine won't require a full build at all.

If everything went well, you should have a big executable in the compilation folder, named scummvm.exe. The size of the executable comes from the debug symbols embedded in the file, so you can run the following command to shrink it:

 strip scummvm.exe

That's it, you successfully compiled ScummVM from the source code.

Ship required libraries for running ScummVM on a "non-MSYS2" machine

In case you want to distribute your builds to machines without a running MSYS2 installation or if you excluded MSYS2/Mingw-w64 from your PATH, you need to bundle the required .dll files with the executable - otherwise, running ScummVM will fail due to missing dependencies.

In order to copy all required .dll files to the directory where the ScummVM executable is located, run the following command in your build directory:

for i in $(seq 3); do for bin in $(ntldd -R *exe | grep -i mingw | cut -d">" -f2 | cut -d" " -f2); do cp -vu "$bin" . ; done; done

Common Issues

  • If the executable compiles correctly, but you get a "somelibrary.dll missing" error when executing it, you just need to add the following path to your PATH variable: <installdir>/msys<env>/mingw64/bin/
  • If the configure script gives an error about using msys mode, please make sure you are running the mingw-w64 win32 shell or the mingw-w64 win64 shell, and not the msys2 shell from the MSYS2 package, when building ScummVM.