A Linux user (Eleuin) has reported menu lockups with the default OpenAL
(probably thread related) and no lockups with SDL.
A Windows user has reported popping noises with all audio drivers except
SDL (#178).
Change the audio driver default to SDL for the time being until these
issues can be looked into.
under `tools/` add some scripts to invoke the build system to build all
deps for vbam and vbam itself:
- `tools/linux/builder`
This builds a mostly static linux binary with a few dynamic deps for
xorg and wayland. Using gtk3. This will run on just about any dist.
- `tools/osx/builder`
Builds a static mac app targetting 10.7.
- `tools/win/linux-cross-builder`
Builds a static windows binary using the mingw-w64 toolchain.
- `tools/win/msys2-builder`
Builds a static windows binary in the MSYS2 environment, this may be
suffering from a few regressions.
Change some cmake code to support the build system, refactor a few
things in it.
`git submodule update --remote --recursive` must be called with `--init`
if the submodules have never been initialized, add the flag to the cmake
code that does this. If they are already initialized, it will not cause
any harm.
Improve, refactor and clean up `tools/osx/builder` to build a relatively
full-featured ffmpeg as well. This requires lots of other dists. It's
kind of like a mini port system now. Will generalize it shortly to a
sourced library for using with both the mac and the mingw builds. Will
hopefully become a separate repo on github at some point.
Add perl dist support to the builder.
Add an `--env` flag to the builder to print the build environment
variables so that they can be read in with `eval` for debugging
purposes.
Also add the `FFMPEG_STATIC` cmake option to link static ffmpeg
libraries correctly.
Move the codesigning and zipping of the `.app` bundle to the builder
script and out of cmake, as this is something most users don't need.
Add POST_BUILD commands on Mac to codesign the `.app` and make a zip
file from it.
Also add xz/liblzma dist to `tools/osx/builder` because something
apparently wants liblzma.
Refactor the code in `tools/osx/builder` somewhat and make it cleaner.
Move a few table processing loops into functions to make things less
ugly.
Delete dists not listed in the table (e.g. when they are updated) and
when a dist is re-downloaded, delete the tree and the target file to
force a rebuild.
Use number version for gettext instead of `-latest`.
Specify full dist target, e.g. `lib/libfoo.a` instead of just
`libfoo.a`.
Add `tools/osx/builder`, a POSIX sh script to build all dependant
libraries as static, targetted to OS X 10.7, and build the project with
them (also targetted to OS X 10.7.)
ffmpeg currently does not link, as recording functionality is currently
non-functional anyway, this will be fixed later.
MISC:
- set WORKING_DIRECTORY and ERROR_QUIET for all git commands, for the
cases when the build directory is not under the git checkout
- #include <cerrno> in ConfigManager.cpp as it uses errno
- change `build*` in `.gitignore` to `build/*` so that files starting
with "build" are not affected
If git tags are not available, set the version and revision by finding
the first version tag in `CHANGELOG.md` of the form
```
```
Where N.N.N is the number version (number of components can vary) and
the revision (as speicified by -REV) is optional.
TODO: support named revision without a version number of the form
`[REV]`.
Run just one `git tag` command instead of two (with tags and refs) and
break it into the form [tag0, ref0, tag1, ref1, ...]. Iterate over the
list with two counters for tag and ref.
Fix `cmake/GitTagVersion.cmake` to not throw errors when in a shallow
git clone, or any git clone that has no tags.
And when either git or git tag version info is not available, set the
version variables to the defaults, which are:
```
VERSION = '2.0.0'
REVISION = 'unknown'
VERSION_RELEASE = 0
```
To get the version, find the last tag in git tag of the form "v2.0.0" or
"2.0.0". If this is the last tag and the current commit matches the ref
of this tag, the revision will be empty.
In the case that the current commit is not tagged with a version, to get
the revision, use the short sha unless the current commit is tagged with
something that is not a version string, e.g. "feature-foo", in which
case the revision will be "feature-foo".
If the current commit is tagged as e.g. "v2.0.1-foo" or "2.0.1-foo" then
the version will be "2.0.1" and the revision will be "foo". Tags of this
form are also checked when finding the current version.
This is all done in cmake. If there is no git detected, the version will
be "2.0.0" and the revision will be "unknown".
On Debian-based distributions, people sometimes have bad sources in apt,
e.g. PPAs that no longer exist, or mirrors that no longer work, etc.. In
these cases, `apt-get update` will still likely fetch the main
distribution package lists, which is what we need, but return a non-zero
exit code.
Change `./installdeps` to not abort on non-zero exit status from
`apt-get -qq update`.
64 bit MinGW (e.g. msys2 64 bit) produces a binary that immediately
segfaults when built with LTO.
Make ENABLE_LTO default to OFF on 64 bit MinGW (32 bit will still
default to ON.)
On SoundSDL destructor and `reset()`, there was a deadlock with Linux
pthreads, it happened sometimes that the reader thread would call
`SDL_SemWait(data_available)` while `deinit()` would destroy the
semaphore and the `SDL_SemWait()` would end up waiting forever on a null
semaphore.
Change the sequencing of deinit() to prevent this from happening, set
`initialized = false` at the beginning of the sequence to prevent
subsequent entries into the reader callback, and add an SDL_Delay(100)
between the final `SDL_SemPost()` and `SDL_UnlockMutex()`s and the
`SDL_DestroySemaphore()` and `SDL_DestroyMutex()`s to allow a running
reader to complete with a valid mutex and semaphores before they are
destroyed and the thread is joined.
Resetting the sound system also sometimes triggers a memory corruption
bug, but that's a separate issue.
We were setting the app icon based on the 256x256 xpm icon in the xrc,
and this triggered a bug where the app-specific icon in Windows volume
settings was huge:
https://stackoverflow.com/questions/17949693/windows-volume-mixer-icon-size-is-too-large/46310786#46310786
Adapt the code from that SO question to use Windows-specific code to
load and scale the icon appropriately using a Vista+ API, and fall back
to the normal Wx icon loading mechanism on XP.
Also generate a nice new `vbam.ico` Windows icon file based on the
`.svg` using the app from:
https://iconverticons.com
Use the `cmake` `ProcessorCount` module to determine the number of CPU
threads, and set the `-flto` flag for gcc to `-flto=${num_cpus}` if the
number of CPU threads is detected and is greater than `1`.
clang does not support this.
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.
Note that LTO now defaults to ON, and ENABLE_ASM does not turn on
ENABLE_ASM_CORE.
Trim the wxLogDebug() section.
Titlecase headings.
Generate a TOC with `doctoc`.
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.
Fix building with wx 2.8 by rewriting some more string related code.
Replace all calls to .c_str() with .mb_str().
Remove some of the .c_str()/.mb_str() calls where the target is already
wxString.
Move the split()/enum_idx() functions from opts.cpp into
str_split()/vec_find() in strutils.h/strutils.cpp for use in other
files.
Replace the C-style string parsing code in a couple of places in
wxvbam.cpp for processing possible command line options by splitting on
'='.
Also replace a couple of places that use pointer arithmetic in
widgets/joyedit.cpp and widgets/keyedit.cpp with wxString methods.
When calling find_package(wxWidgets ...) allow the first call to fail
because the OpenGL library may not be found. A subsequent call without
listing the OpenGL library is done with REQUIRED.
And if the OpenGL library is not found, skip the OpenGL compile test.
When cross-compiling (e.g. with mxe or other mingw packages) skip the wx
ABI compatibility run tests.
When choosing which minhook lib to link to the wx ABI compat run test
program, check for 64 bit but fallback to 32 bit just in case.
Fix some syntax errors and extraneous output in fedora_installdeps().
"Fix" the 32 bit deps installer to try to ignore file conflicts between
i686 and host rpms, by first using rpm --force to install the 32 bit
rpms and then overwriting them with the host ones using --force as well.
This is hackish and fragile, but there aren't any good alternatives
right now.
When Wx is built with --enable-stl, wxString to wxChar*/char* implicit
conversions and vice-versa no longer work.
Change all wxChar* data members to wxString and change all pointer
arithmetic code (mostly in opts.cpp, cmdevents.cpp and
widgets/joyedit.cpp) to use wxString methods instead.
Also make mostly minor changes in various other files for all of this to
work.
Fix error dialog boxes popping up when the Wx ABI compat tests are run
from cmake.
Wx 3.x is hardcoded to use MessageBox for wxLogFatalError(), even in a
console app, so use the minhook trampoline lib (added to dependencies)
to hook the Win32 API MessageBoxW and MessageBoxA (the second just in
case) so that no error dialogs pop up.
Details here:
https://www.codeproject.com/Articles/44326/MinHook-The-Minimalistic-x-x-API-Hooking-Libra
Include `wx/wxprec.h` (precompiled header first in test programs to
possibly make the tests slightly faster.
For the ABI compat check, set a variable for the test program instead of
listing it twice.
Following some suggestions from @ArtiiP, first check if there are no
issues without an -fabi-version flag, and then instead of incrementing
from 0, decrement from 15 to find the highest working ABI version.
This is very slow if the needed ABI version is 2 for example, but not
much to do about that for the time being.
Start checking the ABI version at -fabi-version=0, which is the default,
and if that succeeds don't set the flag at all.
This will allow the code to work properly if and when Wx removes the ABI
check alltogether.
Break command line argument processing and OS detection off into
functions called from `main()`.
Remove all references to cairo.
For fink, install the SFML package I made instead of turning off link.
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.
Replace the hardcoded `make -j8` command in the build instructions with
a `-j` parameter that is the number of the host's CPUs minus one.
Subtracting 1 is done to reduce chances of overloading the host.
If the value is `1`, then don't print the `-j` flag at all.
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.