Difference between revisions of "Compiling ScummVM/MinGW-w64"

From ScummVM :: Wiki
Jump to navigation Jump to search
m (Text replacement - "<source lang=" to "<syntaxhighlight lang=")
(32 intermediate revisions by 4 users not shown)
Line 6: Line 6:
| 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.
| 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 do not support building in this way''', but if you want to use it, instructions are below.
'''We do not (officially) support building in this way''' and we don't recommend using this method if you want to distribute your ScummVM builds.
 
However, we offer preliminary support for the MSYS2/MinGW-w64 toolchain. Feel free to contact me (rootfather) either via eMail or IRC if you have questions regarding MSYS2/MinGW-w64.


Our officially supported MinGW build instructions are at [[Compiling_ScummVM/MinGW]].
Our officially supported MinGW build instructions are at [[Compiling_ScummVM/MinGW]].
|}
|}
{| border="0" cellpadding="1" cellspacing="2" style="margin-left:5em; background:#FF9999; width:80%"
|- align="center"
| '''NOTE'''
|- style="margin-left:1em; background:#ffffff;"
|- style="background:#ffffff"
| Please note that current versions of MSYS2/Mingw64 cannot be installed on Windows XP anymore. '''However, builds produced with the MSYS2/Mingw64 toolchain will still work on Windows XP.'''
|}


== Things needed ==
== Things needed ==
Line 17: Line 30:
You can find MSYS2 and installation instructions on the [[https://msys2.github.io/ MSYS2 webpage]].
You can find MSYS2 and installation instructions on the [[https://msys2.github.io/ MSYS2 webpage]].


==== Download and install the mingw-w64 compilation toolchain====
==== Download and install the necessary packages ====
In the MSYS2 terminal, type:
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).
<syntax type="bash">
$> pacman -S mingw-w64-<env>-toolchain
</syntax>
where <env> is either x86_64 or i686, depending on your architecture (64-bit and 32-bit, respectively).


This command will fetch and install the packages needed for compiling, including (but not limited to) GCC 5.x, GDB, and libwinpthread-git.
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:
<syntaxhighlight lang="bash">
pacman --noconfirm -Sy
pacman --needed --noconfirm -S bash pacman pacman-mirrors msys2-runtime
</syntaxhighlight>


==== Install make ====
For i686 (32-bit), type the following in the MSYS2 terminal to automatically install all packages/libraries needed to compile ScummVM:
ScummVM uses Makefiles to build the project. Makefiles are build configuration files that the compiler uses to compile, link and solve dependencies. "make" is the software that runs the Makefiles.
<syntaxhighlight lang="bash">
pacman -S --needed --noconfirm base-devel git mingw-w64-i686-{curl,faad2,freetype,flac,fluidsynth,libjpeg-turbo,libogg,libvorbis,libmad,libmpeg2-git,libtheora,libpng,nasm,readline,SDL2,SDL2_net,toolchain,winsparkle,zlib}
</syntaxhighlight>


MSYS2 does not support make out of the box, but it has its own implementation. Install it by typing:
For x86_64 (64-bit), type the following in the MSYS2 terminal to automatically install all packages/libraries needed to compile ScummVM:
<syntaxhighlight lang="bash">
pacman -S --needed --noconfirm base-devel git mingw-w64-x86_64-{curl,faad2,freetype,flac,fluidsynth,libjpeg-turbo,libogg,libvorbis,libmad,libmpeg2-git,libtheora,libpng,nasm,readline,SDL2,SDL2_net,toolchain,winsparkle,zlib}
</syntaxhighlight>


<syntax type="bash">
These commands will fetch and install the packages needed for compiling, including (but not limited to) GCC 6.x, GDB, and libwinpthread-git.
$> pacman -S make
</syntax>


=== Install the needed libraries ===
=== Install the needed libraries ===
In order to compile properly, ScummVM needs you to have certain libraries installed. All the libraries in the list can be installed with similar commands:
<syntax type="bash">
$> pacman -S mingw-w64-<env>-<library>
</syntax>
where <env> is the environment as previously stated, and <library> is the name of the library, as stated in the list (e.g. pacman -S mingw-w64-x86_64-SDL):


* '''SDL''' Mandatory.
''You only have to install the libraries manually if you prefer not to use the automated way in the section above. For most users, installing all packages automatically will just work fine.''
 


* '''nasm''' Optional, for faster compile of scalers.
In order to compile properly, ScummVM needs you to have certain libraries installed. The command in the above section installs all of the needed packages automatically. All the libraries in the list can be installed with similar commands:
<syntaxhighlight lang="bash">
pacman -S mingw-w64-<env>-<library>
</syntaxhighlight>
where <env> is the environment as previously stated, and <library> is the name of the library, as stated in the list (e.g. pacman -S mingw-w64-x86_64-SDL):


* '''SDL2'''. Mandatory. ''We recently switched to SDL2. SDL 1 is still available as fallback option.''
* '''nasm'''. Optional, for faster compile of scalers.
* '''flac'''. Optional, for FLAC support.
* '''flac'''. Optional, for FLAC support.
 
* '''libjpeg-turbo'''. Optional, for JPEG support. Required for Groovie 2, Starship Titanic and Wintermute.
* '''libogg''' and '''libvorbis''' Optional, for OGG support.
* '''libogg''' and '''libvorbis'''. Optional, for OGG support.
 
* '''libmad'''. Optional, for MP3 support.
* '''libmad''' Optional, for MP3 support.
* '''libmpeg2-svn'''. Optional, for MPEG2 cutscene support.
 
* '''libmpeg2''' Optional, for MPEG2 cutscene support.
 
* '''zlib'''. Optional, for compressed saved games.
* '''zlib'''. Optional, for compressed saved games.
* '''libtheora'''. Optional, for Broken Sword 2.5.
* '''libtheora'''. Optional, for Broken Sword 2.5.
 
* '''faad2'''. Optional, for AAC support.
* '''libfaad2'''. Optional, for AAC support.
 
* '''libpng'''. Optional, for PNG support.
* '''libpng'''. Optional, for PNG support.
* '''freetype'''. Optional, for TTF support.
* '''freetype'''. Optional, for TTF support.
* '''fluidsynth'''. Optional, for soundfont MIDI support.
* '''fluidsynth'''. Optional, for soundfont MIDI support.
* '''curl''' and '''SDL2_net'''. Optional, for cloud integration support.
* '''winsparkle'''. Optional, for application updates via the WinSparkle framework.


=== Let's get compiling! ===
=== Let's get compiling! ===


Finally, we are ready to compile the project!
Finally, we are ready to compile the project!
To do that, just open a MSYS2 console, [http://gvsigce.sourceforge.net/wiki/index.php/Getting_started_with_MSYS#Navigating_the_file_system navigate] to the source folder where you have cloned scummvm.git, and type the following commands:
To do that, just open a '''MinGW-w64''' shell (''not'' the MSYS2 shell), [http://gvsigce.sourceforge.net/wiki/index.php/Getting_started_with_MSYS#Navigating_the_file_system navigate] to the source folder where you have cloned scummvm.git, and type the following commands:
<syntax type="bash">
<syntaxhighlight lang="bash">
$> ./configure # Executes a bash script that helps you configure.
$> ./configure # Executes a bash script that helps you configure.
$> make # Executes the make program, which triggers the compilation.
$> make # Executes the make program, which triggers the compilation.
</syntax>
</syntaxhighlight>


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:
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:
<syntax type="bash">
<syntaxhighlight lang="bash">
$> strip scummvm.exe
$> strip scummvm.exe
</syntax>
</syntaxhighlight>


== Ready to go! ==
== Ready to go! ==
Line 89: Line 102:


* 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.
* 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.
== DLLs required for running ScummVM on a "non-MSYS2" machine ==
If you want to run the ScummVM binary you just compiled on an (other) Windows machine that doesn't have mingw-w64/MSYS2 installed, you need to copy a few .dll files from the folder '''/your-msys2-folder/mingw64/bin''' (for x64 builds) '''or ../mingw32/bin''' (for x86) to the same folder as your scummvm.exe.
The following list assumes that you are building ScummVM with default settings and all engines enabled, so chances that this list will suit your needs are pretty high.
* libbz2-1.dll
* libfaad-2.dll
* libFLAC-8.dll
* libfluidsynth-1.dll
* libfreetype-6.dll
* libgcc_s_seh-1.dll
* libglib-2.0-0.dll
* libgraphite2.dll
* libharfbuzz-0.dll
* libiconv-2.dll
* libintl-8.dll
* libjpeg-8.dll
* libmad-0.dll
* libmpeg2-0.dll
* libogg-0.dll
* libpcre-1.dll
* libpng16-16.dll
* libportaudio-2.dll
* libsndfile-1.dll
* libspeex-1.dll
* libstdc++-6.dll
* libtheoradec-1.dll
* libvorbis-0.dll
* libvorbisenc-2.dll
* libvorbisfile-3.dll
* libwinpthread-1.dll
* SDL.dll/SDL2.dll ''(depends on the SDL version you used for compilation. Default is SDL2.dll)''
* zlib1.dll
Please note that compiling ScummVM with other options (e.g. "--enable-text-console") may require various other .dll files that are currently not in this list. This list will be constantly updated in the future.
Usually, ScummVM will name the .dll file that is missing, but in some cases, all you get is a quite unspecific error code "0xc000007b". When you get this error code, please double-check if you copied all necessary .dll files.

Revision as of 15:13, 25 October 2018

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 do not (officially) support building in this way and we don't recommend using this method if you want to distribute your ScummVM builds.

However, we offer preliminary support for the MSYS2/MinGW-w64 toolchain. Feel free to contact me (rootfather) either via eMail or IRC if you have questions regarding MSYS2/MinGW-w64.

Our officially supported MinGW build instructions are at Compiling_ScummVM/MinGW.


NOTE
Please note that current versions of MSYS2/Mingw64 cannot be installed on Windows XP anymore. However, builds produced with the MSYS2/Mingw64 toolchain will still work on Windows XP.


Things needed

Setup MinGW-w64 and MSYS2

You can find MSYS2 and installation instructions on the [MSYS2 webpage].

Download and install the necessary packages

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 --noconfirm -Sy
pacman --needed --noconfirm -S bash pacman pacman-mirrors msys2-runtime

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-{curl,faad2,freetype,flac,fluidsynth,libjpeg-turbo,libogg,libvorbis,libmad,libmpeg2-git,libtheora,libpng,nasm,readline,SDL2,SDL2_net,toolchain,winsparkle,zlib}

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-{curl,faad2,freetype,flac,fluidsynth,libjpeg-turbo,libogg,libvorbis,libmad,libmpeg2-git,libtheora,libpng,nasm,readline,SDL2,SDL2_net,toolchain,winsparkle,zlib}

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

Install the needed libraries

You only have to install the libraries manually if you prefer not to use the automated way in the section above. For most users, installing all packages automatically will just work fine.


In order to compile properly, ScummVM needs you to have certain libraries installed. The command in the above section installs all of the needed packages automatically. All the libraries in the list can be installed with similar commands:

pacman -S mingw-w64-<env>-<library>

where <env> is the environment as previously stated, and <library> is the name of the library, as stated in the list (e.g. pacman -S mingw-w64-x86_64-SDL):

  • SDL2. Mandatory. We recently switched to SDL2. SDL 1 is still available as fallback option.
  • nasm. Optional, for faster compile of scalers.
  • flac. Optional, for FLAC support.
  • libjpeg-turbo. Optional, for JPEG support. Required for Groovie 2, Starship Titanic and Wintermute.
  • libogg and libvorbis. Optional, for OGG support.
  • libmad. Optional, for MP3 support.
  • libmpeg2-svn. Optional, for MPEG2 cutscene support.
  • zlib. Optional, for compressed saved games.
  • libtheora. Optional, for Broken Sword 2.5.
  • faad2. Optional, for AAC support.
  • libpng. Optional, for PNG support.
  • freetype. Optional, for TTF support.
  • fluidsynth. Optional, for soundfont MIDI support.
  • curl and SDL2_net. Optional, for cloud integration support.
  • winsparkle. Optional, for application updates via the WinSparkle framework.

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 # Executes a bash script that helps you configure.
	$> make # Executes the make program, which triggers the compilation.

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

Ready to go!

OK this should be all of it (hopefully), so you should be good to go.

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.

DLLs required for running ScummVM on a "non-MSYS2" machine

If you want to run the ScummVM binary you just compiled on an (other) Windows machine that doesn't have mingw-w64/MSYS2 installed, you need to copy a few .dll files from the folder /your-msys2-folder/mingw64/bin (for x64 builds) or ../mingw32/bin (for x86) to the same folder as your scummvm.exe.

The following list assumes that you are building ScummVM with default settings and all engines enabled, so chances that this list will suit your needs are pretty high.

  • libbz2-1.dll
  • libfaad-2.dll
  • libFLAC-8.dll
  • libfluidsynth-1.dll
  • libfreetype-6.dll
  • libgcc_s_seh-1.dll
  • libglib-2.0-0.dll
  • libgraphite2.dll
  • libharfbuzz-0.dll
  • libiconv-2.dll
  • libintl-8.dll
  • libjpeg-8.dll
  • libmad-0.dll
  • libmpeg2-0.dll
  • libogg-0.dll
  • libpcre-1.dll
  • libpng16-16.dll
  • libportaudio-2.dll
  • libsndfile-1.dll
  • libspeex-1.dll
  • libstdc++-6.dll
  • libtheoradec-1.dll
  • libvorbis-0.dll
  • libvorbisenc-2.dll
  • libvorbisfile-3.dll
  • libwinpthread-1.dll
  • SDL.dll/SDL2.dll (depends on the SDL version you used for compilation. Default is SDL2.dll)
  • zlib1.dll

Please note that compiling ScummVM with other options (e.g. "--enable-text-console") may require various other .dll files that are currently not in this list. This list will be constantly updated in the future.

Usually, ScummVM will name the .dll file that is missing, but in some cases, all you get is a quite unspecific error code "0xc000007b". When you get this error code, please double-check if you copied all necessary .dll files.