Rebirth built with OpenGL has a hard dependency on the GL utility
library, but did not have a configure time test to report this. Add
one.
Reported-by: shoober420 <https://github.com/dxx-rebirth/dxx-rebirth/issues/468>
Add an inclusion of <SDL.h> since, for Windows targets, this triggers a
chain of includes that leads to <intrin.h>, which causes
-Wredundant-decls to print a diagnostic. This allows Windows targets to
declare -Wredundant-decls as unusable, while enabling it for non-Windows
targets.
This adds a new dependency, but most systems likely already have
SDL_image installed. Use of SDL_image can be disabled, but this is
discouraged, because various in-game interfaces assume the use of the
original background.
The old implementation automatically corrected for filename case. The
new implementation expects that the supplied filename can be passed to
PYHSFS_openRead as-is. All known uses in-game have been corrected to
satisfy this requirement. If the new stricter match requirement becomes
a problem, a variant of PHYSFSRWOPS_openRead that adjusts filename case
could be created for use here.
- Update install instructions
- Update ebuild
- Update Arch PKGBUILD
The existing test for gcc pr #82541 was insufficient, and allowed using
-Wduplicated-branches with gcc-7 in some cases it should not. Extend
the test to cover these cases.
mmontag reported that the OS X linker warns when attempting to search a
framework directory that does not exist. Suppress this warning by
checking for the directory and not adding it to the search path if it
does not exist.
Reported-by: mmontag <https://github.com/dxx-rebirth/dxx-rebirth/issues/503#issuecomment-619457491>
The minimum supported compiler versions now provide a depth-efficient
implementation of std::make_index_sequence, which removes the last
reason to carry a private implementation. In the case of clang, it
appears to have a special compiler intrinsic used to implement its
std::make_index_sequence.
Switch to the compiler-provided version for both gcc and clang.
gcc-4.9 support is now difficult to test due to system libraries linking
to newer symbols. gcc-4.9 is unsupported upstream, as are gcc-5 and
gcc-6. Raise the minimum required gcc version to the minimum version
supported upstream.
Debian Jessie shipped gcc-4.9.2, and support for this target was the
primary motivator for retaining gcc-4.9 support. Jessie ended regular
support in June 2018, and will end Long Term Support in June 2020. It
seems unlikely that Jessie would receive a snapshot build of Rebirth in
the months it has left.
Debian Stretch shipped gcc-6, but is currently considered "oldstable"
and has been superseded by Debian Buster. Further, Debian Stretch
provides a package for gcc-7, so Stretch users can still build Rebirth
using only packages available from the package manager.
In exported archives, the commit will be
`archive-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx` for some hexadecimal
characters `x`. `-` is not valid in a C identifier, but the commit
needs to be a valid C identifier. Change `-` to `_` so that it will be
valid.
Reported-by: andrew-strong <https://github.com/dxx-rebirth/dxx-rebirth/issues/484>
Fixes: fafa07a456 ("Instruct git-archive to insert a commit ID in SConstruct")
Python 2 byte sequences look best when not decoded. Python 3 byte
sequences look best when decoded. As Python 2 is near end of life and
most distributions have moved on to Python 3, switch to the style that
looks better in Python 3. The code still runs in Python 2, but produces
a u'' wrapper around the text because the type is `unicode` in Python 2,
but `str` in Python 3. This change eliminates the b'' wrapper around
the text in Python 3.
Extended identifiers have proved to cause more problems than they solve.
Switch to base32 which, while less commonly supported, is available in
Python and uses an alphabet that is almost a subset of the C identifier
alphabet. Padding characters are still a problem, but can be remapped
to a valid C identifier that is not a valid base32 character.
Special macros are used to pass information to
`generate-kconfig-udlr.py`. Provide default definitions for these
macros in `kconfig.ui-table.cpp`, and override them in the one build
where they need to be special. This enables `kconfig.ui-table.cpp` to
build cleanly when invoked from the command line in the compilation
database.
Inserting the compile command for vers_id.cpp into a compilation
database does not quote a string with embedded whitespace, although this
string is correctly quoted when used to invoke a shell. Remove
whitespace from the character whitelist, so that it is always escaped.
This change was proposed by an external user as a claimed fix for a
failure to build. This change has not been tested by the core team.
However, it is a simple change and at worst will break the build.
The change is based in part on advice from recurring contributor
@MaddTheSane. Neither @MaddTheSane nor @kreatordxx have commented on
the correctness of these changes, though the original author of the
commit, @Sottises, is listed as the origin of the most recent prebuilt
OS X package offered from
<https://www.dxx-rebirth.com/download-dxx-rebirth/>.
Reported-by: Sottises <https://github.com/dxx-rebirth/dxx-rebirth/issues/455>
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSGeometry.h:10:9: fatal error:
'CoreGraphics/CGBase.h' file not found
#import <CoreGraphics/CGBase.h>
^~~~~~~~~~~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Foundation.framework/Headers/NSGeometry.h:10:9: note: did not
find header 'CGBase.h' in framework 'CoreGraphics' (loaded from
'/System/Library/Frameworks/ApplicationServices.framework/Versions/A/Frameworks')
similar/misc/physfsx.cpp:20:10: fatal error: 'HIServices/Processes.h' file not found
#include <HIServices/Processes.h>
Since this is an OS X problem, this has only been tested by the original
reporter.
Reported-by: Sottises <https://github.com/dxx-rebirth/dxx-rebirth/issues/455>
Suggested-by: MaddTheSane <https://github.com/dxx-rebirth/dxx-rebirth/issues/455#issuecomment-536164089> # SConstruct part
clang searches for its installed headers relative to the path of the
program calling it, which doesn't work when the caller is a custom
program running from directory other than the system clang installation
directory. Add a hook to the compilation database support to let the
user inject extra flags into the database, which can be used to add
`-isystem $PATH_TO_INSTALLED_CLANG_HEADERS` to the recorded commands, so
that when the clang library loads the compilation database, it finds the
headers.
psyke83 reports that Raspbian Buster with gcc 8.3.0 rejects the
`-isystem=dir` form. The `=dir` form does not work on any gcc I can
test, so conditionally keeping it for other systems does not seem
worthwhile.
Requested-by: psyke83 <https://github.com/dxx-rebirth/dxx-rebirth/pull/453>
Commit 452d58a0b5 switched from passing a list of strings as the
right-hand side of `in` to passing a parenthesized string. The new form
causes a TypeError if the left hand side is None:
```
>>> None in ('1', '2')
False
>>> None in ('1')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'in <string>' requires string as left operand, not NoneType
```
Add a trailing comma to turn the right hand side back into a list of
strings, as it was before the Raspberry Pi commit.
Fixes: 452d58a0b5 ("Update Raspberry Pi Mesa build for Buster & Pi 4B")
The new Raspberry Pi 4B revision has a minimum requirement of Raspbian
buster, and uses the Mesa V3D driver by default; in fact, the legacy
Broadcom drivers are no longer compatible with its VideoCore VC6 chip, so
building against Mesa is mandatory for this Pi revision.
Unfortunately, the Debian buster version of the Mesa packages
have intentionally dropped the GLESv1 headers, making building of GLESv1
software impractical (even though the VC4/V3D driver can still run GLESv1
applications).
The OpenGL driver in conjunction with SDL2* runs at full
speed on Raspberry Pi 3B & 4B, so it makes sense to modify the "mesa"
build to this configuration in light of these facts.
* SDL2 is highly desirable due to the availability of the KMSDRM driver, which is
the only way to run dxx-rebirth outside of X (we can no longer use
the dispmanx/rpi driver of SDL1).
When targeting Raspberry Pi with legacy drivers, the following error
is observed on Raspbian buster with gcc 8.3.0:
cc1plus: error: =/opt/vc/include: No such file or directory [-Werror=missing-include-dirs]
cc1plus: error: =/opt/vc/include/interface/vcos/pthreads: No such file or directory [-Werror=missing-include-dirs]
cc1plus: error: =/opt/vc/include/interface/vmcs_host/linux: No such file or directory [-Werror=missing-include-dirs]
The error can be resolved by removing the equals sign from these definitions.
On all platforms, libSDL redefined `main` in a way that interfered with
SConf tests. On some platforms, but not on Linux, libSDL2 does not
redefine `main`. Based on a remark in the SDL2 migration guide, and the
apparent success (on Linux) after removing the `#undef`, I removed use
of `#undef` when building for SDL2. As privately reported by zico,
libSDL2 on Windows still redefines `main`, so it still needs an explicit
`#undef` to let the SConf tests build correctly. For platforms where
`#undef` is not needed, it is harmless. Add this `#undef`
unconditionally, and update the inline comment.
Fixes: f491059ed7 ("Enable building with SDL2")
Reported-by: zicodxx <private>
If register_compile_target=0, `self.builddir` on DXXProgram was used but
not set.
```
AttributeError: 'D1XProgram' object has no attribute 'builddir':
File "/s/SConstruct", line 5263:
main(register_program)
File "/s/SConstruct", line 5218:
''.join(['%s:\n%s' % (d.program_message_prefix, d.init(substenv)) for d in dxx])
File "/s/SConstruct", line 4853:
self.register_program()
File "/s/SConstruct", line 4895:
exe_target = self.builddir.File(exe_target)
```
pkubaj proposed extending the if/elif tree. This patch instead switches
to a loop, which avoids repeating any strings and is cleaner to extend
when another platform shows up needing normalization.
Requested-by: pkubaj <https://github.com/dxx-rebirth/dxx-rebirth/pull/426>
clang treats -Wunused as a request for -Wunused-lambda-capture, which is
good, except that -Wunused-lambda-capture is overzealous. It should
warn for captures that are not used in the body. It should not, but
does, warn for captures which are used in the body when such captures
are not required by the standard. Since 4 of the supported gcc versions
require that capture, removing the capture is not an option at this
point. Add a test to suppress the clang warning in this case, and hope
that eventually clang will warn only for uses that are actually unused.
This removes the need for parts of <https://github.com/dxx-rebirth/dxx-rebirth/pull/426> (by pkubaj).
Commit 0e81c05 moved the offending line, but it was already wrong in
54d57a37c9.
Fixes: 0e81c0594e ("Move settings that affect the build to UserBuildSettings")
Users who do not install Boost cannot include <boost/config.hpp>.
SConstruct handled this by disabling the macro DXX_BOOST_FALLTHROUGH,
but did not override gcc's default-enabled (via -Wextra)
use of -Wimplicit-fallthrough=3, so users would get a fallthrough
warning and the build would fail. Adjust this area to explicitly probe
for -Wno-implicit-fallthrough when Boost.Config is not available.
Fixes: 063bf29225 ("Enable -Wimplicit-fallthrough=5; fix resulting breaks")
Reported-by: Jayman2000 <https://github.com/dxx-rebirth/dxx-rebirth/issues/417>
gcc-4.9 lacks std::cbegin, std::cend. Fortunately, nothing in the code
uses those, so remove tests for them.
Fixes: 5e434cbe95 ("Require availability of C++11 begin")
Remove the fallback to Boost.Begin. C++14 is now the minimum supported
standard, and any conforming C++14 compiler should have a working C++11
std::begin.
Processing sharepath in SConf is incorrect, because targets can share a
build directory (and therefore an SConf run), but not share a sharepath.
Move sharepath handling out of SConf. Move DXX_USE_SHAREPATH handling
from CGameArg to GameArg, since one game can be built with a sharepath
while the other is built without.
The comma was omitted to discourage putting anything after the last
element. This was fine when there were multiple elements, but with only
one value, the missing comma causes this not to be a tuple as intended.
Add a comma to fix the test. Add some additional comments on supported
C++ versions by gcc major version.
Recent code changes require use of return type deduction, which is only
standard in C++14 and later. Require C++14. In practice, this changes
nothing, because the minimum supported compiler versions were already
choosing C++14. This change rejects older compilers that were already
unsupported.
PHYSFS_init is not guaranteed to succeed. Using PHYSFS functions after
PHYSFS_init fails is likely to fail badly. On Windows, failure may take
the form of a crash in ntdll. Avoid this by exiting gracefully.
Creating an attribute on UserBuildSettings during SConf breaks
clean/help, which do not run configure tests. Remove that and add a
method to return the value the attribute would have had.
Reported-by: derhass <https://github.com/dxx-rebirth/dxx-rebirth/issues/412>
Fixes: 1be414217c ("Add build time flag to choose whether to enable ADL MIDI support")
User jammer1 reports that Python under MSYS2[1] reports a `sys.platform`
of `msys`. For the limited purposes Rebirth requires, this platform can
be treated as if it were `win32`. Add a mapping to apply this change
automatically, so that users do not need to set it on the command line.
Reported-by: jammer1 <https://github.com/dxx-rebirth/dxx-rebirth/issues/405>
[1]: http://www.msys2.org/
enable_build_failure_summary=1 assumed that the command to display was a
list. For internal pseudo-commands, such as write_pch_inclusion_file,
the command was a string, so calling ' '.join() was incorrect. When the
output is not a list, pass it through unchanged.
Add macro cf_assert ("control flow" assert) to hint to gcc that certain
conditions are impossible. Use it to avoid generating range checks for
situations that never happen. If the event did happen, the only
consequence would be truncated UI text, rather than a correctness
problem.
The prior design was meant to allow the hook to be called instead of the
normal function, with the hook chaining to the normal function and then
performing other work as needed. This flexibility is unnecessary, and
complicates improvements elsewhere. Replace it with a hook that is
called with the result of the regular StaticObject call.
Use of the comprehensions makes the code less readable and harder to
modify. The performance benefit, if any, is in the noise. Switch to
an unpacked form.
This commit enables Rebirth to build with SDL2, but the result is not
perfect.
- SDL2 removed some sticky key support. Rebirth may behave differently
now in this area.
- SDL2 removed some key-repeat related support. Rebirth may behave
differently now in this area.
- SDL2 gained the ability to make a window fullscreen by sizing it to
the desktop instead of by changing the desktop resolution. Rebirth
uses this, and it mostly works.
- Resizing while in the automap does not notify the automap code, so
the view is wrong until the player switches out of automap mode and
back in.
- SDL2 changed how to enumerate available resolutions. Since
fitting the window to the desktop is generally more useful than
fitting the desktop to the window, I chose to drop support for
enumerating resolutions instead of porting to the new API. Users can
now enter an arbitrary window dimension and Rebirth will make an
attempt to use it.
- It might be useful to cap the window dimension at the desktop
dimension, but that is not done yet.
- Entering fullscreen mode through the Controls->Graphics submenu
failed to notify the relevant subsystems, causing the rendered
content not to rescale. For now, compile out the option to toggle
full screen through that menu. Toggling through Alt+Enter works
properly.
Despite these quirks, this is a substantial improvement over the prior
commit, where SDL2 cannot be used at all. The remaining issues can be
resolved in future work.
References: <https://github.com/dxx-rebirth/dxx-rebirth/issues/82>
Currently, DXX_USE_SDL_REDBOOK_AUDIO is an alias for !SDL2. However,
this patch enables interested users to readily patch out Redbook even
for SDL1.
References: <https://github.com/dxx-rebirth/dxx-rebirth/issues/82>
On Windows, SDL headers define `main` to `SDL_main` in addition to doing
it through `pkg-config`. The countering `#undef` must occur after the
headers are included. Commit 2a82207 changed the `#undef` to occur too
early. Linux works fine, but Windows broke.
Move the `#undef` back down. Switch to named format parameters to make
it easier to maintain.
Fixes: 2a82207e91 ("Add unit tests for valptridx parameter validation")
For the benefit of users less familiar with how setup is handled, add a
hook triggered by $DXX_SCONS_DEBUG_USER_SETTINGS to log initialization
of `user_settings` so that users can trace which values combined to
produce the observed results.
Per comment from kreator, some Apple systems now ship without a working
print screen key. It makes no sense to provide print screen support
bound to a key which does not exist. Add `screenshot=none` and activate
it on OS X to remove the unreachable screenshot support.
This is safely ignored when the constructor cannot satisfy `constexpr`.
Without this modifier, forwarding to `constexpr` constructors is not
`constexpr`, which causes build failures.
clang-5 with `sconf_cxx11_inherit_constructor=force-failure`:
```
similar/main/gauges.cpp:553:61: error: constexpr constructor's 1st parameter type 'const (anonymous namespace)::hud_x_scale_float' (aka 'const hud_scale_float<'x'>') is not a literal type
similar/main/gauges.cpp:432:7: note: 'hud_scale_float<'x'>' is not literal because it is not an aggregate and has no constexpr constructors other than copy or move constructors
```
Fixes: 893e8cde06 ("Combine hud gauge parameters")
Replace magic strings with sentinel objects, so that mistakes are
reported as missing variables, rather than being legal at parse time and
incorrect at runtime.
If user_settings.sharepath is configured to be blank in SConstruct, omit
the C preprocessor macro SHAREPATH instead of defining it to expand to
an empty string. Adjust the C++ code that uses the macro SHAREPATH to
handle its absence:
- Clearer output in help text
- Skip adding blank SHAREPATH to the PhysFS search path.
As a nice side effect, this enables SHAREPATH on Windows, which could be
helpful for builds shipped with an installer that places game files in a
well-known location (such as "C:\Games\Descent"). Previously,
!defined(__unix__) systems did not add SHAREPATH to the PhysFS search
path, even when one was defined.
- Remove the one test that clang-5 still fails.
- Require all remaining tests to pass using only C++11 native
static_assert.
- Remove preprocessor-based alternative static_assert implementations.
gcc-8 adds calls to static_assert with a comma inside its first
argument in the implementation of std::vector. This is legal within the
standard, but conflicts with Rebirth's use of static_assert as a
two argument preprocessor macro. The macro is not substantially useful,
and was only present to compensate for the clang limitation removed in
the previous commit. Remove the macro.
References: <https://github.com/dxx-rebirth/dxx-rebirth/issues/388>
Python 2 permitted defining __new__, then deleting it once it had been
used. Python 3 does not directly reject that pattern, but instead
always fails with an error about wrong number of arguments to object().
Switch to a simple classmethod that is explicitly invoked by the first
__init__().