The continuing development of the legendary VBA gameboy advance emulator.
Go to file
Rafael Kitover 85dea8a57b add cygwin cross build support
Put shared code for linux cross builds and cygwin cross builds into
builder/mingw-cross.sh .

Call wxrc when the build platform is cygwin with files resolved via
`cygpath -m` in case the wxrc is a native binary.

Add -fpermissive to CXX/OBJCXX flags.

Reenable libzvbi support for ffmpeg.

Stop building ffmpeg and related dists by default until we fix game
recording.

Set CMAKE_PREFIX_PATH in cmake args as a FILEPATH type variable.

Support xml catalog made with native libxml2 using cygpath in related
commands, make cygpath a noop on non-cygwin platforms.

Remove gdb and zip from msys2 deps.

Add a cygwin installdeps routine using a copy of cyg-apt that it
fetches.

When creating symlinks in install_dist() fully resolve all symlinks in
path parts for the source file, so that host and target binaries are
correctly linked.

When cp -af fails to preserve permission related data, fall back to cp
-rf.

When installing libs with a cross suffix, make a symlink for the lib
without the cross suffix.

Make sure cygwin runs with CYGWIN=winsymlinks:native .

Add paths to host gettext executables to cmake args, otherwise it tries
to use the target executables and fails on paths.

For the pkgconfig bundled glib, turn off win32 platform for the cygwin
host build.

For gettext, remove --disable-auto-import from link flags.

Compile target freetype on cygwin with cmake and manually install the
pkgconfig .pc file using sed.

Add a relocation type 'aggressive', when a dist is marked with this
type, rewrite all '/usr' prefixes to the build root. By default only
files that exist in the dist are matched and rewritten.

Fix regression in linux build by adding some iconv related flags to the
cmake invocation for doxygen and disabling -Werror for xorg dists.

When relocating scripts, use the actual resolved root path for host or
target.

Build libxslt --without-python so that it doesn't try to pick up the
msys2 python.

Other misc. minor tweaks and cleanups.
2018-05-01 04:11:57 -04:00
.github Say good bye to cairo 2017-08-27 13:32:32 -04:00
cmake adjust changelog version regex for cur. version 2018-03-17 12:32:27 -04:00
data Added the Official No-Intro Nintendo Gameboy Advance Number (Date) file for the release numbering. 2015-05-16 07:48:02 +00:00
dependencies@226f6601fa work around gcc lto wrappers bug with gcc 7.x 2017-09-16 19:47:39 -07:00
doc Fix some lintian warnings. Patch by sergio-br2. 2015-05-29 22:11:38 +00:00
fex SUSE Lint: fix a few classes of warnings #136 2017-08-08 20:05:38 -07:00
po regenerate translation files 2017-08-03 23:33:30 -07:00
project initial dump of the dependencies into trunk, may look to changing it into a git submodule later. 2015-06-10 20:08:42 -04:00
src add cygwin cross build support 2018-05-01 04:11:57 -04:00
tools add cygwin cross build support 2018-05-01 04:11:57 -04:00
.clang-format Small change: make `.clang-format` use C++11 Standard 2016-08-08 13:42:19 -07:00
.drone.yml Forgot the zip program for the build 2017-05-11 22:18:10 -04:00
.gitignore add mac release builder script 2017-10-12 01:32:18 -07:00
.gitmodules added submodule for dependencies. 2015-09-19 11:58:26 -04:00
CHANGELOG.md update changelog for 2.0.2 release 2018-03-13 23:49:17 -04:00
CMakeLists.txt add multi-platform build system 2018-02-24 14:39:29 -05:00
README.md cmake: default ENABLE_OPENAL to OFF 2018-04-13 12:31:07 -04:00
installdeps remove ffmpeg from suse installdeps 2018-04-26 17:08:16 -04:00
installer.nsi Small tweaks to the installer 2017-03-16 19:23:12 -04:00
todo.md msys2 build improvements 2016-11-14 10:56:50 -08:00

README.md

Join the chat at https://gitter.im/visualboyadvance-m/Lobby Build Status

Visual Boy Advance - M

Game Boy Advance Emulator

Homepage and Forum: http://vba-m.com

Windows and Mac builds are in the releases tab.

Daily Ubuntu packages here: https://code.launchpad.net/~sergio-br2/+archive/ubuntu/vbam-trunk

Your distribution may have packages available as well, search for "vbam".

It is also generally very easy to build from source, see below.

Building

The basic formula to build vba-m is:

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 ..
make -j`nproc`

./installdeps is supported on MSys2, Linux (Debian/Ubuntu, Fedora, Arch or Solus) and Mac OS X (homebrew, macports or fink.)

The Ninja cmake generator is also now supported, including on msys2.

If your OS is not supported, you will need the following:

  • C++ compiler and binutils
  • make
  • CMake
  • git
  • nasm (optional, for 32 bit builds)

And the following development libraries:

  • zlib (required)
  • mesa (if using X11 or any OpenGL otherwise)
  • ffmpeg (optional, for game recording)
  • gettext and gettext tools (optional, with ENABLE_NLS)
  • png (required)
  • SDL2 (required)
  • SFML (optional, for link)
  • OpenAL (optional, a sound interface)
  • wxWidgets (required, 2.8 is still supported, --enable-stl is supported)

On Linux and similar, you also need the version of GTK your wxWidgets is linked to (usually 2 or 3).

Support for more OSes/distributions for ./installdeps is planned.

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.

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.

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.

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.:

cmake .. -DENABLE_LINK=NO

Of particular interest is making RELEASE or DEBUG builds, the default mode is RELEASE, to make a DEBUG build use something like:

cmake .. -DCMAKE_BUILD_TYPE=Debug

Here is the complete list:

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
ENABLE_ASM_CORE Enable x86 ASM CPU cores (BUGGY AND DANGEROUS) OFF
ENABLE_ASM Enable the following two ASM options ON for 32 bit builds
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 OFF
ENABLE_LTO Compile with Link Time Optimization (gcc and clang only) ON for release build
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 OFF
VBAM_STATIC Try link all libs statically (the following are set to ON if ON) OFF
SDL2_STATIC Try to link static SDL2 libraries OFF
SFML_STATIC_LIBRARIES Try to link static SFML libraries OFF
FFMPEG_STATIC Try to link static ffmpeg libraries OFF
SSP_STATIC Try to link static gcc stack protector library (gcc only) OFF except Win32
OPENAL_STATIC Try to link static OpenAL libraries OFF

Note for distro packagers, we use the CMake module GNUInstallDirs to configure installation directories.

MSys2 Notes

To run the resulting binary, you can simply type:

./visualboyadvance-m

in the shell where you built it.

If you built with -DCMAKE_BUILD_TYPE=Debug, you will get a console app and will see debug messages, even in mintty.

If you want to start the binary from e.g. a shortcut or Explorer, you will need 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.)

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.

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(), e.g.:

int foo = 42;
wxLogDebug(wxT("the value of foo = %d"), foo);

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:

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:

ulimit -c unlimited

in your shell to enable coredump files.

This post 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:

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.

Contributing

Please keep in mind that this app needs to run on Windows, Linux and macOS at the very least, so code should be portable and/or use the appropriate #ifdefs 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.