Use `git submodule update --remote --recursive` instead of `git
submodule update --init --recursive` so that the latest version of the
repo is always installed.
Run the command from cmake instead of throwing an error if the submodule
is not checked out. Only throw an error if the checkout failed or the
source tree is not a git checkout.
Don't add the `mingw-xaudio` include directory if using MSVC.
Remove the submodule check from src/wx/CMakeLists.txt, having it in the
main CMakeLists.txt is enough.
gcc lto wrapper commands such as `gcc-ar` will segfault with some
versions of gcc 7.x when called via an absolute path, see:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80717
Generalize the mechanism for compiling a small C program on the host
(currently used for bin2c for Wx resources) and use it to wrap the gcc
wrappers in a little executable that prepends their dirname to PATH and
runs them with `execvp()`.
Make LTO default to ON again, except on win32 with gcc < 7, because
those toolchains produce broken binaries with LTO enabled.
Also add `-ffat-lto-objects` to compiler flags for gcc when LTO is
enabled, this will increase the chances that the LTO build will succeed
even if there are issues with the binutils wrappers. Clang does not
support this.
In 4e665ae I hardcoded -fabi-version=2 for g++ flags, and @ArtiiP
pointed out that this is wrong, because Wx may be compiled with other
ABI versions.
Add cmake check_cxx_source_runs() tests to determine the correct ABI
version flag to use with Wx.
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.
This flags breaks the build on e.g. ARM, so only use it when a PC
architecture (x86 or amd64) has been detected. Thanks to ZachBacon for
spotting this.
ConfigManager does not use any version info, but is part of libvbamcore,
so removing the `#include` makes rebuilds after git changes much much
faster.
Remove the AutoBuild.h includes from ConfigManager.cpp and SDL.cpp (the
SDL port) because the information in that file does not seem to be used
and it also includes version.h, forcing those files to rebuild
unnecessarily.
Use cmake to generate the version.h from version.h.in which is a cleaned
up version of the old version.h with the git short sha into the build
directory, and include the version.h from there.
Continue to use the GetGitRevisionDescription plugin to make the cmake
configuration state depend on the current sha of HEAD, but throw away
the results (for the time being.)
This makes rebuilds after git changes such as a commit only recompile a
couple of files instead of the whole tree.
As cmake now warns when policies are set to OLD, change the CMP0005
policy to NEW.
What this does is have cmake escape -D preprocessor definitions passed
to e.g. add_definitions() starting in cmake 2.6 . This is fine since the
minimum cmake version we support is 2.8.12 . It also makes the code
cleaner since we don't have to escape quotes anymore ourselves. This
will also work better on different platforms, where different escapes
may be needed.
Remove all quote escapes from string params to add_definitions() for
this policy change to work.
The inline assembly in src/gba/GBA-thumb.cpp which is turned on with the
cmake ENABLE_ASM_CORES option, sometimes causes weird behavior on
windows (see: #54) and a crash on startup in linux (see: #98, confirmed
on both Fedora and Arch Linux.)
Previously the default for this option was ON for 32 bit builds, set the
default to OFF always for the time being, until it is either fixed or
replaced.
In 82c8a1e3 I made "--param ssp-buffer-size=4" one argument instead of
two because when added to CMAKE_REQUIRED_LIBRARIES the ssp-buffer-size=4
part was being recognized as a library, breaking the compile tests.
This broke the build on mac, which I fixed in 915e2d1e by using ssp
flags for gcc only and not clang.
Now apparently it is breaking mxe, so instead of adding this particular
parameter to the MY_C_FLAGS variable which is then added to
CMAKE_REQUIRED_* variables for compile tests, add it directly via
ADD_COMPILE_OPTIONS().
This should hopefully resolve any remaining issues with this compiler
flag.
In 82c8a1e3 I made "--param ssp-buffer-size=4" one argument instead of
two to fix another problem when passing compiler flags to
CMAKE_REQUIRED_LIBRARIES, clang cannot deal with this and this breaks
the build on mac.
Enable libssp related flags for gcc only, because clang does not support
them anyway. This fixes the build issue on mac.
Stop saving and restoring the CMAKE_REQUIRED_* variables for the compile
test, because the subsequent Wx header symbol tests need them set up for
Wx support as well.
Also --param foo=bar needs to be a single string in the list of compiler
flags, or cmake can misinterpret the second part as a library when it is
passed to libraries/link-options.
mxe leaves CMAKE_SYSTEM_PROCESSOR empty, so detect if mxe is being used
and set the variable based on CMAKE_TOOLCHAIN_FILE, this allows the
32bit asm to compile under mxe.
Also if no toolchain file is being used and CMAKE_SYSTEM_PROCESSOR is
empty, fall back to CMAKE_HOST_SYSTEM_PROCESSOR.
When determining gcc/clang flags, save resulting C flags as MY_C_FLAGS,
C++ flags as MY_CXX_FLAGS, and linker flags as MY_C_LINKER_FLAGS, then
use them in the Wx OpenGL compile test.
This fixes the test erroneously failing on git mxe on mac.
Also, don't use -fPIC on Win32, set Wx defines separately from the test,
and save all CMAKE_REQUIRED_* variables before the test and restore them
afterwards.
Add -fpermissive and -fexceptions to CMAKE_CXX_COMPILE_OBJECT so that
they only affect C++. -std=gnu++11 was already there from b4ba9d9d, but
this is a cleaner method (which is also used for NASM) where we use
STRING(REGEX REPLACE ...) to append options after the <FLAGS>
placeholder in CMAKE_CXX_COMPILE_OBJECT.
Add a hack to the root CMakeLists.txt to SET(MSYS ON) for the Ninja
generator when running under msys2, otherwise it cannot find libs.
The quoting fixes from #70 allow all of this to work.
Move the check for dependencies/msvc into the previous IF(WIN32) block
adding an IF(MSVC) level.
Remove duplicate call to INCLUDE_DIRECTORIES(dependencies/msvc) from
later on in the main CMakeLists.txt.
Add -std=gnu+11 to CMAKE_CXX_COMPILE_OBJECT in the main CMakeLists.txt
to force the option for all C++ sources.
The right way to do this is to use a generator expression with
ADD_COMPILE_OPTIONS, but this is only available in cmake 3.3 and we must
maintain 2.8.12 compatibility to support Ubuntu 14.
This fixes the mac build (clang.)
XCode 4.2 generates a broken binary if -fomit-frame-pointer and/or -flto
is used for compile and link flags.
Check for Clang version less than 4.3 on APPLE and remove these flags in
the compile options setting cmake code.
cmake automatically passes -std=gnu++11 in some cases, while we were
passing -std=c++11, and this was causing incompatibilites in name
mangling between different objects.
Fix this by using -std=gnu++11 for gcc.
The last commit removed generator expressions from ADD_COMPILE_OPTIONS()
which made C/C++ flags apply to nasm as well.
Fix this by removing <FLAGS> from CMAKE_ASM_NASM_COMPILE_OBJECT and
replacing it with the flags we want.
Fix some porting issues to make everything work on Debian 8 "Jessie"
and Ubuntu 14 "Trusty":
- set cmake minimum version to 2.8.12, this is the Ubuntu 14 version
- combine C and C++ flags and add all of them using
ADD_COMPILE_OPTIONS() without using generator expressions, which is a
cmake 3.2 or so feature
- add -fpermissive to force some non-const type casts to compile on
older versions of gcc
- add -std=c++11 for gcc to enable support on older versions of gcc
- check that the compiler supports -fstack-protector-strong before
adding it, older versions of gcc do not
- fix the debian section of ./installdeps to include libpng-dev instead
of libpng16-dev and add gettext for msginit etc.
- fix compat checks in src/common/ffmpeg.cpp and src/wx/cmdevents.cpp to
check for libavcodec >= 56 instead of > 56, the Debian Jessie version
is exactly version 56 . With the one exception of
AV_CODEC_FLAG_GLOBAL_HEADER which is defined in later versions.
Fix backcompat with wx 2.8. This involved writing
wxPositiveDoubleValidator and rewiring the DrawingPanel inheritance tree
and event handling mechanisms (because 2.8 does not have ->Bind, only
->Connect which is less flexible.) As a result all the event handling
has been gathered into GameArea and the affected code is somewhat
cleaner. 2.8 support is untested on Mac because it requires 32 bit libs
and Carbon.
Add support for cross-compiling for windows using the Fedora MinGW
packages in ./installdeps.
Check for OpenGL support in the wx library being linked, this was
necessary because the Fedora MinGW wx library does not have OpenGL
support.
Remove vbamDebug() in favor of wxLogDebug(), and add an override for it
so that it works in non-debug builds of wx as well as on Windows. Turn
off buffering on stdout and stderr on startup so that debug logging
works in msys2/cygwin mintty as well.
On Windows, build a console binary for debug builds.
Update README.md to reflect Fedora MinGW support and debug logging
support.
Add -Wextra to cflags for debug builds.
Fix all cmake issues related to building for win32 with mxe.
Add support for ./installdeps win32 on Debian/Ubuntu using the mxe apt
repository.
Details:
* default to ENABLE_LTO=OFF on mxe
* set SFML_STATIC_LIBRARIES=TRUE on mxe
* fix the libintl/gettext checking logic
* fix the git dependencies submodule checking logic, and check that it
triggers for mxe
* revert FindSFML.cmake to upstream version, works fine with mxe
* make 'win32' an alias for the 'MinGW-w64-i686' target for
./installdeps, add support for mxe apt repository for Debian/Ubuntu
* change bin2c related cmake code to compile the tool on the host always
even when cross-compiling
* copy src/win32/res/VBA.ico to src/wx/icons since src/win32 has been
removed
TODO: generic mxe installer for other unix-likes
Add a more general purpose ./installdeps script to replace
./installdeps-msys2 that handles: Debian Linux, Arch Linux, MSYS2+MinGW,
Mac Homebrew, MacPorts and Fink for Mac. More OSes and distributions
will be added in the future, and the script may be generalized for use
in other projects.
Move Mac package manager setup code into MacPackageManagers.cmake and
greatly improve it. Handles Homebrew, MacPorts and Fink correctly.
Minor tweaks for FindSDL2.cmake: better include dir searching that works
on cygwin, fix flags for MinGW, and quiet pkg-config program errors.
Add MinGW cross-compilation toolchain files, they can be specified on
the cmake command line with:
-DCMAKE_TOOLCHAIN_FILE=../CMakeScripts/Toolchain-cross-MinGW-w64-i686.cmake
or
-DCMAKE_TOOLCHAIN_FILE=../CMakeScripts/Toolchain-cross-MinGW-w64-x86_64.cmake
these work for Cygwin and should work for MinGW on Linux as well.
I'm not sure if this was changed in cmake recently, but "SYSCONFDIR" is incorrect. It should be SYSCONF_INSTALL_DIR.
As well CMAKE_INSTALL_PREFIX refers to /usr or /usr/local in linux, so installing it into ${CMAKE_INSTALL_PREFIX}/${SYSCONFDIR} would be incorrect. I've wrapped it in the existing IF( WIN32 ) to preserve the installation for windows, a window dev should fix that if it's incorrect.
Add ENABLE_LTO cmake option that defaults to ON except on GCC building
for AMD64 on Win32.
Also set the cmake variables AMD64 or X86_32 when one of these
architectures is detected.
Add support for Link Time Optimization (LTO) on gcc and Clang.
Link libssp only when it is on the system, some toolchains like Ubuntu's
do not require explicitly linking to libssp. On Win32 try to link it
statically.
In debug builds with GCC, use -ggdb3 -Og, otherwise use -g .
Two new cmake modules were written for this:
* FindSSP.cmake -- this is for finding libssp on the system.
* UseGCCBinUtilsWrappers.cmake -- this is for using gcc binutils
wrappers such as gcc-ar, which is required for gcc LTO to work.
These will be distributed separately as well.
* Bump minimum cmake required to 3.3.2, to make sure generator
expressions work.
* Force CMAKE_BUILD_TYPE to "Release" if unset, not sure if this
actually works.
* Merge the older compile flags block with the new one and use generator
expressions to make sure the relevant flags apply only to C, C++ or
nasm.
* Add -lssp to the end of the link commands for the -fstack-protector*
options, this is only needed/done for gcc.
* Add -lversion and -limm32 to SDL2_LIBRARY (Zach asked for this.)
* Builds on msys2 again!
Remove some redundant nasm-related code and an outdated comment.
Objective-C++ code is now separated into an .mm file and nothing is done
to change the compiler invocation for it.
Make ASM_CORE, ASM_SCALERS and ENABLE_MMX the defaults for 32bit builds
on intel hosts (the host can be AMD64, as long as the target is 32bits.)
Move mac nasm search into the mac section of the cmake code and stop
defaulting to /usr/bin/nasm, this was screwing up the build on msys2.
Fix src/filters/2xSaImmx.asm to compile and link correctly.
Add nasm to list of mingw deps for ./installdeps-msys2 .
Tested that msys2-built Wx binary runs, including with 2xSaI.
Keyboard doesn't work yet on msys2 builds, but that's a completely
different issue.
* Enable ffmpeg by default only on linux and msys2, it will be disabled
for normal windows builds and on mac.
* Set SFML_STATIC_LIBRARIES only for normal non-msys2 windows builds,
because msys2 does not currently have static versions of the SFML
sub-libraries, e.g. system, network, etc.. Dynamic linking works fine
for now.
* Fix quoting for -DLOCALEDIR, on windows spaces were causing errors in
make on msys2.
* Update to upstream FindSFML.cmake .
* Add an ./installdeps-msys2 script to install all necessary tools and
libraries on msys2 for building both 64 and 32 bit windows Wx binaries.
* Add the dependencies/mingw-xaudio/include directory to
INCLUDE_DIRECTORIES so that XAudio compiles on msys2, as mingw-w64 does
not currently have XAudio headers. Also check that the user pulled the
git submodule in the process (the ./installdeps-msys2 script does this
for you.)
TODO:
* Generalize ./installdeps to work on more platforms.
* Make console Wx app in debug mode so that debug prints will work.
* Fix game keyboard input for msys2 builds.
* Add HiDPI support for Windows.
* Fix the -D*DIR defines to have the correct paths on windows.
Add GetRealPixelClientSize() method to HiDPIAware and implement using
wx GetClientSize() in panel.cpp for the generic version, and using
convertSizeToBacking: in macsupport.mm .
Add an AdjustViewport() method to GLDrawingPanel that sets glViewport()
using GetRealPixelClientSize(), and call it for the SIZE event. Debug
print the viewport size here instead of in DrawingPanelInit().
Build improvements:
* default to Cairo off for all platforms, currently libcairo2-dev does
not install on Ubuntu
* default to ON for ENABLE_LINK and ENABLE_FFMPEG (for game recording),
this will allow for more fully-featured default builds
* do not set SFML_STATIC_LIBRARIES on Mac because this is currently
broken
* fix the Mac bundling/linking script to deal with links in dependent
libs that already use @rpath (very minor change.)
Move Objective-C++ Mac code for Wx into macsupport.mm with stub methods
in panel.cpp, and stop compiling all C++ as Objective-C++.
cmake -G Xcode # now works fine
Move closer to allowing an "out of the box" distributable build for Mac:
* fix the icon for the .app
* link SDL2 statically, a PR has been sent to the original repo here:
https://github.com/tcbrindle/sdl2-cmake-scripts/pull/9
* link SFML statically
TODO:
For a releasable build on OS X, system libs must be linked
dynamically while third party libs are linked statically or bundled. The
goal is to link them statically.
The two remaining libs that need static linking are PNG and wX.
For PNG a similar approach to the one used for SDL2 using pkg-config
should work fine and be simple to implement.
For wX things are more complicated. The default build of wX does not
include static libs, I will need to submit a PR for Homebrew to change
the default build to include both dynamic and static versions.
Use a high-res surface on HiDPI (e.g. retina) Macs for the OpenGL
renderer, and scale window accordingly. Also fix fullscreen toggle not
working in HiDPI mode. And some other stuff.
Aside from the .app not being linked statically, the app is now fully
functional on Mac and ready to ship.
Full change details:
* add -DDEBUG or -DNDEBUG based on CMAKE_BUILD_TYPE (-DNDEBUG for
Release and -DDEBUG for Debug)
* properly search for homebrew/macports/fink directories, and only add
them if they exist
* fix building with wx debug support, when available
* use explicit OpenGL context on Mac too for new versions of wx
* add main_frame pointer in GameArea back to MainFrame, and a
SetMainFrame(MainFrame* parent) public method to set it in guinit
* add full support for reading and writing double value config options
(the GUI still needs to be updated for options that can take doubles,
such as video_scale)
* change video_scale option (Display/Scale) to a double, putting a
double value such as 3.6 in the config file works correctly
* add a HiDPIAware mixin class for GameArea and DrawingPanel, with the
method HiDPIScaleFactor which returns the current window's
backingScaleFactor
* change the GameArea sizing methods (DelBorder(), AdjustMinSize() and
AdjustSize()) to divide the window size by the
HiDPIAware::HiDPIScaleFactor so that the window is scaled properly
* change GameArea::ShowFullScreen to ignore fullscreen events for a
maximized window on Mac, because maximized windows on OS X are
actually native fullscreen windows
* change scale variables to double from int, and use std::ceil() to
round scaled pixel or memory size values
* make a default base class DrawingPane::DrawingPanelInit() virtual
method, call by all concrete class constructors based on the did_init
flag
* call setWantsBestResolutionOpenGLSurface:YES on the view backing the
wxGLCanvas for the OpenGL renderer (GLDrawingPanel) to get a high res
OpenGL surface in HiDPI mode
* remove GLDrawingPanel::OnSize event, the OpenGL viewport resizes
automatically without the need to call glViewport()
* do not hide the mouse pointer if the main frame has menus or dialogs
open
* add variadic vbamDebug(const char* format, ...) function, active only
#ifdef DEBUG, which sets the wx log target to STDERR and logs a
message to it
* use full name of app "visualboyadvance-m" instead of "vbam" when
getting configuration paths, this way the config is saved to
~/Library/Application Support/visualboyadvance-m rather than
~/Library/Application Support/vbam
* listen to the MENU_HIGHLIGHT_ALL event as well, as an extra way to
check when the menus are open
* add public MainFrame::SetMenusOpened(bool state) method to force the
main frame to change the internal menus_opened state, this is
necessary because in HiDPI mode on Mac the keyboard accelerator for
toggle fullscreen sends a menu open event, but not a menu close event,
so on switch to fullscreen the state is changed to menus closed and
the emu is unpaused
TODO:
* GUI option to change toggle fullscreen behavior between native and
non-native fullscreen on Mac
* GUI support for double config values like Display/Scale
* add HiDPI support to simple renderer
* fix SDL sound, or disable the option
* fix Cairo suport on Mac, or disable the option
* use dynamic_cast<> to implement GetWindow() for DrawingPanel instead
of pure virtual method, likewise for Delete()
* link .app statically by default so it can be shipped
* add Homebrew formula
Currently, the build is broken on Linux as fixed width integers (for
example uint32) are used via <cstdint> without a namespace. This is only
allowed in C++11 and later.
See http://en.cppreference.com/w/cpp/types/integer for details.
Add Homebrew and MacPorts paths for findings headers and libraries.
Add -x objective-c++ to the C++ compile command so that conditionally
compiled ObjectiveC code for OS X can be supported.
Throw a fatal error if the user tries to enable ENABLE_ASM_CORE,
ENABLE_ASM_SCALERS or ENABLE_MMX on AMD64, as this is not supported yet.
If ENABLE_ASM_SCALERS is enabled, try to find a Homebrew or MacPorts
nasm before using the outdated XCode nasm.
For the future, if the user has only the old XCode nasm which does not
support 64 bit objects and the build is 64 bit, throw a fatal error.
For 32 bit builds with the old XCode nasm, use -f macho instead of -f
macho32, which is used if the version of nasm is > 2.0 .
Pass -DMACHO instead of -DELF and, on AMD64 (for the future) -D__AMD64__
for nasm on OS X.
Pass -D__AMD64__ to C++ compilation as well on AMD64, this will help
when we support AMD64 inline assembly.
Add support for automatically linking Homebrew keg-only gettext from
/usr/local/opt/gettext for ENABLE_NLS.
Fix copying Info.plist and vbam.icns to the .app bundle.
Add a key to the Info.plist to support sharp text on retina displays, as
per:
https://wiki.wxwidgets.org/WxMac-specific_topics#Retina_display_support
Set wxWidgets_USE_DEBUG to ON if CMAKE_BUILD_TYPE is "Debug". I'm not
sure this does anything or if I'm doing this correctly though.
Also set wxWidgets_USE_UNICODE to ON. Again, I'm not sure this does
anything or is in the right place.
Fix a bug in the config dir finding code in
wxvbamApp::GetConfigurationPath() updated in 8b8f2f7 to only use the
more top level dirs if there is a vbam.ini in them, not if they are
writable as well, and use the reverse order (starting with user local
dirs) to check for writable dirs and their writable parents. This fixes
a problem with the vbam.ini being written to the Plugins directory of
the .app bundle if it's writable instead of ~/Library/Application
Support/vbam as was intended.
This allows breakpoints, memory views and watches to be controlled from the GDB interface. The VBA-SDL-H2 commands can be entered via the GDB monitor (type "help" into the monitor for a list of commands). Made minor changes to the GDB interface so that the GDB port does not need to be entered every session. A "Break on Load" option has been added allowing GDB to be connected before the ROM starts executing.
VBA-SDL-H2 credits: Labmaster, kenobi, DevZ, richq, JPAN, Griever
One thing it does, is correct any raw files scanned, if they are correctable. (usually, uncorrectable raw files come up with a read error.) There is also bin support included as well. (Note, if you open a valid dotcode bin, it will encode it to raw, and save the freshly encoded raw file if it has been set in the menu. If the dotcode save file has not been set, the bin will still load.)
Currently, part of the GBA emulation breaks the E-Reader scan code. The reader always returns a Region Error.
The changes are :
- debian/control: Build-Depends now include nasm for i386 and amd64
- debian/control: Architecture is now "any"
- debian/rules: Less verbosity when DH_VERBOSE is not set
- debian/rules: -DUSE_ARM_SCALERS=ON -DUSE_ARM_CORE=ON on i386 and amd64
architectures
- CMakeLists.txt: Out-of-source builds using USE_ARM_SCALERS is now
working
- Changed the config file location to follow the freedesktop.org XDG Base Directory Specification. There is no point to be compatible with the old location since we haven't made a release yet.
- Renamed the configuration file to vbam.cfg to avoid conflict with the original VBA (thanks to tttttttttanaka for the patch)
- Changed the window title to VBA-M