2017-08-14 20:56:54 +00:00
[![Join the chat at https://gitter.im/visualboyadvance-m/Lobby ](https://badges.gitter.im/visualboyadvance-m/Lobby.svg )](https://gitter.im/visualboyadvance-m/Lobby)
2017-05-11 19:38:17 +00:00
[![Build Status ](https://tea-ci.org/api/badges/visualboyadvance-m/visualboyadvance-m/status.svg )](https://tea-ci.org/visualboyadvance-m/visualboyadvance-m)
2016-12-23 13:38:50 +00:00
# Visual Boy Advance - M
Game Boy Advance Emulator
Homepage and Forum: http://vba-m.com
2017-03-06 10:03:15 +00:00
Windows and Mac builds are in the [releases tab ](https://github.com/visualboyadvance-m/visualboyadvance-m/releases ).
2017-03-06 10:10:06 +00:00
Daily Ubuntu packages here: https://code.launchpad.net/~sergio-br2/+archive/ubuntu/vbam-trunk
2017-03-06 10:03:15 +00:00
Your distribution may have packages available as well, search for "vbam".
2017-03-06 10:10:06 +00:00
It is also generally very easy to build from source, see below.
2016-12-23 13:38:50 +00:00
## Building
The basic formula to build vba-m is:
2017-08-14 20:56:54 +00:00
```shell
2016-12-23 13:38:50 +00:00
cd ~ & & mkdir src & & cd src
git clone https://github.com/visualboyadvance-m/visualboyadvance-m.git
cd visualboyadvance-m
./installdeps
# ./installdeps will give you build instructions, which will be similar to:
mkdir build & & cd build
cmake ..
2017-08-14 20:56:54 +00:00
make -j`nproc`
2016-12-23 13:38:50 +00:00
```
2017-03-20 02:09:33 +00:00
`./installdeps` is supported on MSys2, Linux (Debian/Ubuntu, Fedora, Arch or
Solus) and Mac OS X (homebrew, macports or fink.)
2016-12-23 13:38:50 +00:00
2017-02-11 22:18:38 +00:00
The Ninja cmake generator is also now supported, including on msys2.
2016-12-23 13:38:50 +00:00
If your OS is not supported, you will need the following:
2017-08-14 20:56:54 +00:00
- C++ compiler and binutils
- [make ](https://en.wikipedia.org/wiki/Make_(software ))
- [CMake ](https://cmake.org/ )
- [git ](https://git-scm.com/ )
2017-03-06 10:03:15 +00:00
- nasm (optional, for 32 bit builds)
2016-12-23 13:38:50 +00:00
And the following development libraries:
2017-08-14 20:56:54 +00:00
- [zlib ](https://zlib.net/ ) (required)
- [mesa ](https://mesa3d.org/ ) (if using X11 or any OpenGL otherwise)
2016-12-23 13:38:50 +00:00
- ffmpeg (optional, for game recording)
2017-03-06 10:03:15 +00:00
- gettext and gettext tools (optional, with ENABLE_NLS)
- png (required)
2017-08-14 20:56:54 +00:00
- [SDL ](https://www.libsdl.org/ )2 (required)
- [SFML ](https://www.sfml-dev.org/ ) (optional, for link)
2016-12-23 13:38:50 +00:00
- OpenAL (optional, a sound interface)
2017-09-13 12:32:44 +00:00
- [wxWidgets ](https://wxwidgets.org/ ) (required, 2.8 is still supported, --enable-stl is supported)
2016-12-23 13:38:50 +00:00
2017-02-20 21:20:09 +00:00
On Linux and similar, you also need the version of GTK your wxWidgets is linked
2017-02-20 21:43:39 +00:00
to (usually 2 or 3).
2017-02-20 21:20:09 +00:00
2016-12-23 13:38:50 +00:00
Support for more OSes/distributions for `./installdeps` is planned.
2017-03-23 21:09:17 +00:00
## Cross compiling for 32 bit on a 64 bit host
`./installdeps m32` will set things up to build a 32 bit binary.
This is supported on Fedora, Arch, Solus and MSYS2.
2016-12-23 13:38:50 +00:00
## Cross Compiling for Win32
`./installdeps` takes one optional parameter for cross-compiling target, which
may be `win32` which is an alias for `mingw-w64-i686` to target 32 bit Windows,
or `mingw-gw64-x86_64` for 64 bit Windows targets.
The target is implicit on MSys2 depending on which MINGW shell you started (the
value of `$MSYSTEM` .) It will not run in the MSys shell.
On Debian/Ubuntu this uses the MXE apt repository and works really well.
2017-01-25 18:53:05 +00:00
On Fedora it can build using the Fedora MinGW packages, albeit with wx 2.8, no
OpenGL support, and no Link support for lack of SFML.
2016-12-23 13:38:50 +00:00
On Arch it currently doesn't work at all because the AUR stuff is completely
broken, I will at some point redo the arch stuff to use MXE as well.
## CMake Options
The CMake code tries to guess reasonable defaults for options, but you can
override them on the cmake command with e.g.:
2017-08-14 20:56:54 +00:00
```shell
2016-12-23 13:38:50 +00:00
cmake .. -DENABLE_LINK=NO
```
2016-12-23 14:10:54 +00:00
Of particular interest is making **RELEASE** or **DEBUG** builds, the default
mode is **RELEASE** , to make a **DEBUG** build use something like:
2017-08-14 20:56:54 +00:00
```shell
2016-12-23 14:10:54 +00:00
cmake .. -DCMAKE_BUILD_TYPE=Debug
```
2016-12-23 13:38:50 +00:00
Here is the complete list:
2016-12-23 14:10:54 +00:00
| **CMake Option** | **What it Does** | **Defaults** |
|----------------------|----------------------------------------------------------------------|-----------------------|
| ENABLE_SDL | Build the SDL port | OFF |
| ENABLE_WX | Build the wxWidgets port | ON |
| ENABLE_DEBUGGER | Enable the debugger | ON |
| ENABLE_NLS | Enable translations | ON |
2017-03-06 10:03:15 +00:00
| ENABLE_ASM | Enable the following three ASM options | ON for 32 bit builds |
2017-03-19 02:04:39 +00:00
| ENABLE_ASM_CORE | Enable x86 ASM CPU cores (**BUGGY AND DANGEROUS**) | OFF |
2016-12-23 14:10:54 +00:00
| ENABLE_ASM_SCALERS | Enable x86 ASM graphic filters | ON for 32 bit builds |
| ENABLE_MMX | Enable MMX | ON for 32 bit builds |
| ENABLE_LINK | Enable GBA linking functionality (requires SFML) | ON |
| ENABLE_LIRC | Enable LIRC support | OFF |
| ENABLE_FFMPEG | Enable ffmpeg A/V recording | ON on Linux and MSys2 |
use -fabi-version=2 for GCC, turn off LTO #142
Use the g++ `-fabi-version=2` compiler option, as suggested by @ArtiiP
to fix problems similar to:
```
Fatal Error: Mismatch between the program and library build versions
detected.
The library used 3.0 (wchar_t,compiler with C++ ABI 1002,wx
containers,compatible with 2.8),
and your program used 3.0 (wchar_t,compiler with C++ ABI 1009,wx
containers,compatible with 2.8).
Aborted
```
Turn LTO off by default until I fix it for newer gcc/binutils, currently
with gcc7 ar segfaults linking vbamcore.
2017-09-01 12:06:26 +00:00
| ENABLE_LTO | Compile with Link Time Optimization (gcc and clang only) | OFF |
2016-12-23 14:10:54 +00:00
| ENABLE_GBA_LOGGING | Enable extended GBA logging | ON |
| ENABLE_DIRECT3D | Direct3D rendering for wxWidgets (Windows, **NOT IMPLEMENTED!!!** ) | ON |
| ENABLE_XAUDIO2 | Enable xaudio2 sound output for wxWidgets (Windows only) | ON |
| ENABLE_OPENAL | Enable OpenAL for the wxWidgets port | ON |
2017-05-24 11:25:45 +00:00
Note for distro packagers, we use the CMake module
[GNUInstallDirs ](https://cmake.org/cmake/help/v2.8.12/cmake.html#module:GNUInstallDirs )
to configure installation directories.
2016-12-23 13:38:50 +00:00
## MSys2 Notes
To run the resulting binary, you can simply type:
2017-08-14 20:56:54 +00:00
```shell
2016-12-23 13:38:50 +00:00
./visualboyadvance-m
```
in the shell where you built it.
2017-01-25 18:53:05 +00:00
If you built with `-DCMAKE_BUILD_TYPE=Debug` , you will get a console app and
will see debug messages, even in mintty.
2016-12-23 14:10:54 +00:00
2016-12-23 13:38:50 +00:00
If you want to start the binary from e.g. a shortcut or Explorer, you will need
2016-12-23 15:15:47 +00:00
to put `c:\msys64\mingw32\bin` for 32 bit builds and `c:\msys64\mingw64\bin`
for 64 bit builds in your PATH (to edit system PATH, go to Control Panel ->
System -> Advanced system settings -> Environment Variables.)
2016-12-23 13:38:50 +00:00
If you want to package the binary, you will need to include the MinGW DLLs it
depends on, they can install to the same directory as the binary.
For our own builds, we use MXE to make static builds.
2017-01-25 18:53:05 +00:00
## Debug Messages
We have an override for `wxLogDebug()` to make it work even in non-debug builds
of wx and on windows, even in mintty. Using this function for console debug
messages is recommended.
It works like `printf()` , but using `wxString` , so use `wxT()` e.g.:
```cpp
int foo = 42;
wxLogDebug(wxT("the value of foo = %d"), foo);
```
2017-03-06 10:03:15 +00:00
`%s` does not work for `wxString` , so you can do something like this:
2017-01-25 18:53:05 +00:00
```cpp
wxString world = "world";
2017-03-06 10:03:15 +00:00
wxLogDebug(wxT("Hello, %s!"), world.utf8_str());
2017-01-25 18:53:05 +00:00
```
2017-08-17 21:25:27 +00:00
## REPORTING CRASH BUGS
If the emulator crashes and you wish to report the bug, a backtrace made with
debug symbols would be immensely helpful.
To generate one (on Linux and MSYS2) first build in debug mode by invoking
`cmake` as:
```shell
cmake .. -DCMAKE_BUILD_TYPE=Debug
```
After you've reproduced the crash, you need the core dump file, you may need to
do something such as:
```shell
ulimit -c unlimited
```
in your shell to enable coredump files.
[This
post](https://ask.fedoraproject.org/en/question/98776/where-is-core-dump-located/?answer=98779#post-id-98779)
explains how to retrieve core dump on Fedora Linux (and possibly other
distributions.)
Once you have the core dump file, open it with `gdb` , for example:
```shell
gdb -c core ./visualboyadvance-m
```
In the `gdb` shell, to print the backtrace, type:
```
bt
```
This may be a bit of a hassle, but it helps us out immensely.
2016-12-23 13:38:50 +00:00
## CONTRIBUTING
2017-08-14 20:56:54 +00:00
Please keep in mind that this app needs to run on Windows, Linux and macOS at
2016-12-23 13:38:50 +00:00
the very least, so code should be portable and/or use the appropriate `#ifdef` s
and the like when needed.
Please try to craft a good commit message, this post by the great tpope explains
how to do so:
http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
If you have multiple small commits for a change, please try to use `git rebase
-i` (interactive rebase) to squash them into one or a few logical commits (with
good commit messages!) See:
https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History if you are new to
this.