Add test and fallback for extended identifiers
Extended identifiers are convenient when supported, but derhass reports
that the latest stable gcc on Raspbian stable fails the test for
mandatory extended identifier support. Replace the Cxx11RequiredFeature
test for extended identifiers with an SConf test to selectively enable
-fextended-identifiers.
Reported-by: derhass <https://github.com/dxx-rebirth/dxx-rebirth/issues/254>
Fixes: a8a41aa2ff
("Move git version into Python class")
This commit is contained in:
parent
8a2e15e20a
commit
458070a080
67
SConstruct
67
SConstruct
|
@ -425,23 +425,6 @@ struct %(N)s_derived : %(N)s_base {
|
||||||
std::unordered_map<int,int> m;
|
std::unordered_map<int,int> m;
|
||||||
m.emplace(0, 0);
|
m.emplace(0, 0);
|
||||||
'''
|
'''
|
||||||
),
|
|
||||||
# This test could be made optional, but until someone reports an
|
|
||||||
# otherwise-supported compiler that fails this test, it is
|
|
||||||
# mandatory for simplicity.
|
|
||||||
Cxx11RequiredFeature('extended identifiers', '''
|
|
||||||
''', r'''
|
|
||||||
#define DXX_RENAME_IDENTIFIER2_%(N)s(I,N) I##$##N
|
|
||||||
#define DXX_RENAME_IDENTIFIER_%(N)s(I,N) DXX_RENAME_IDENTIFIER2_%(N)s(I,N)
|
|
||||||
#define DXX_extended_%(N)s a\u012b\u012f\u013d
|
|
||||||
#define %(N)s_var DXX_RENAME_IDENTIFIER_%(N)s(%(N)s_var, DXX_extended_%(N)s)
|
|
||||||
int %(N)s_var;
|
|
||||||
(void)%(N)s_var;
|
|
||||||
#undef %(N)s_var
|
|
||||||
#undef DXX_extended_%(N)s
|
|
||||||
#undef DXX_RENAME_IDENTIFIER_%(N)s
|
|
||||||
#undef DXX_RENAME_IDENTIFIER2_%(N)s
|
|
||||||
'''
|
|
||||||
),
|
),
|
||||||
])
|
])
|
||||||
def __init__(self,msgprefix,user_settings,platform_settings):
|
def __init__(self,msgprefix,user_settings,platform_settings):
|
||||||
|
@ -1143,6 +1126,25 @@ variables to their default-constructed value.
|
||||||
return
|
return
|
||||||
raise SCons.Errors.StopError("C++ compiler errors on {} initialization, even with -Wno-missing-field-initializers.")
|
raise SCons.Errors.StopError("C++ compiler errors on {} initialization, even with -Wno-missing-field-initializers.")
|
||||||
@_custom_test
|
@_custom_test
|
||||||
|
def check_compiler_extended_identifiers(self,context,main=r'''
|
||||||
|
#define DXX_RENAME_IDENTIFIER2(I,N) I##$##N
|
||||||
|
#define DXX_RENAME_IDENTIFIER(I,N) DXX_RENAME_IDENTIFIER2(I,N)
|
||||||
|
#define DXX_extended a\u012b\u012f\u013d
|
||||||
|
#define var DXX_RENAME_IDENTIFIER(var, DXX_extended)
|
||||||
|
int var;
|
||||||
|
(void)var;
|
||||||
|
#undef var
|
||||||
|
#undef DXX_extended
|
||||||
|
#undef DXX_RENAME_IDENTIFIER
|
||||||
|
#undef DXX_RENAME_IDENTIFIER2
|
||||||
|
''',_successflags={'CXXFLAGS' : ['-fextended-identifiers']}):
|
||||||
|
Compile = self.Compile
|
||||||
|
if Compile(context, text='', main=main, msg='whether compiler accepts extended identifiers by default') or \
|
||||||
|
Compile(context, text='', main=main, msg='whether compiler accepts extended identifiers with -fextended-identifiers', successflags=_successflags):
|
||||||
|
return
|
||||||
|
user_settings = self.user_settings
|
||||||
|
user_settings._dxx_extended_identifiers = user_settings._dxx_disable_extended_identifiers
|
||||||
|
@_custom_test
|
||||||
def check_attribute_error(self,context):
|
def check_attribute_error(self,context):
|
||||||
"""
|
"""
|
||||||
Test whether the compiler accepts and properly implements gcc's function
|
Test whether the compiler accepts and properly implements gcc's function
|
||||||
|
@ -2776,6 +2778,9 @@ class DXXCommon(LazyObjectConstructor):
|
||||||
_default_prefix = '/usr/local'
|
_default_prefix = '/usr/local'
|
||||||
__stdout_is_not_a_tty = None
|
__stdout_is_not_a_tty = None
|
||||||
__has_git_dir = None
|
__has_git_dir = None
|
||||||
|
# +/=
|
||||||
|
_dxx_extended_identifiers = (r'\u012b', r'\u012f', r'\u013d')
|
||||||
|
_dxx_disable_extended_identifiers = ('_2b', '_2f', '_3d')
|
||||||
def default_poison(self):
|
def default_poison(self):
|
||||||
return 'overwrite' if self.debug else 'none'
|
return 'overwrite' if self.debug else 'none'
|
||||||
def default_builddir(self):
|
def default_builddir(self):
|
||||||
|
@ -3313,8 +3318,13 @@ class DXXCommon(LazyObjectConstructor):
|
||||||
return '\\"%s\\"' % r
|
return '\\"%s\\"' % r
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _encode_cppdefine_for_identifier(s,b2a_base64=binascii.b2a_base64):
|
def _encode_cppdefine_for_identifier(user_settings,s,b2a_base64=binascii.b2a_base64):
|
||||||
return '"%s"' % b2a_base64(s).rstrip().replace('+', r'\u012b').replace('/', r'\u012f').replace('=', r'\u013d')
|
extended_identifiers = user_settings._dxx_extended_identifiers
|
||||||
|
return '"%s"' % b2a_base64(s) \
|
||||||
|
.rstrip() \
|
||||||
|
.replace('+', extended_identifiers[0]) \
|
||||||
|
.replace('/', extended_identifiers[1]) \
|
||||||
|
.replace('=', extended_identifiers[2])
|
||||||
|
|
||||||
def prepare_environment(self):
|
def prepare_environment(self):
|
||||||
# Prettier build messages......
|
# Prettier build messages......
|
||||||
|
@ -3908,15 +3918,16 @@ class DXXProgram(DXXCommon):
|
||||||
|
|
||||||
def _register_program(self,exe_target):
|
def _register_program(self,exe_target):
|
||||||
env = self.env
|
env = self.env
|
||||||
static_archive_construction = self.static_archive_construction[self.user_settings.builddir]
|
user_settings = self.user_settings
|
||||||
|
static_archive_construction = self.static_archive_construction[user_settings.builddir]
|
||||||
objects = static_archive_construction.get_objects_common()
|
objects = static_archive_construction.get_objects_common()
|
||||||
git_describe_version = Git.compute_extra_version() if self.user_settings.git_describe_version else Git.UnknownExtraVersion
|
git_describe_version = Git.compute_extra_version() if user_settings.git_describe_version else Git.UnknownExtraVersion
|
||||||
env.__dxx_CPPDEFINE_git_version = [('DXX_git_commit', git_describe_version.revparse_HEAD), ('DXX_git_describe', self._encode_cppdefine_for_identifier(git_describe_version.describe))]
|
env.__dxx_CPPDEFINE_git_version = [('DXX_git_commit', git_describe_version.revparse_HEAD), ('DXX_git_describe', self._encode_cppdefine_for_identifier(user_settings,git_describe_version.describe))]
|
||||||
objects.extend(self.get_objects_common())
|
objects.extend(self.get_objects_common())
|
||||||
if self.user_settings.sdlmixer:
|
if user_settings.sdlmixer:
|
||||||
objects.extend(static_archive_construction.get_objects_arch_sdlmixer())
|
objects.extend(static_archive_construction.get_objects_arch_sdlmixer())
|
||||||
objects.extend(self.get_objects_similar_arch_sdlmixer())
|
objects.extend(self.get_objects_similar_arch_sdlmixer())
|
||||||
if self.user_settings.opengl or self.user_settings.opengles:
|
if user_settings.opengl or user_settings.opengles:
|
||||||
env.Append(LIBS = self.platform_settings.ogllibs)
|
env.Append(LIBS = self.platform_settings.ogllibs)
|
||||||
static_objects_arch = static_archive_construction.get_objects_arch_ogl
|
static_objects_arch = static_archive_construction.get_objects_arch_ogl
|
||||||
objects_similar_arch = self.get_objects_similar_arch_ogl
|
objects_similar_arch = self.get_objects_similar_arch_ogl
|
||||||
|
@ -3925,12 +3936,12 @@ class DXXProgram(DXXCommon):
|
||||||
objects_similar_arch = self.get_objects_similar_arch_sdl
|
objects_similar_arch = self.get_objects_similar_arch_sdl
|
||||||
objects.extend(static_objects_arch())
|
objects.extend(static_objects_arch())
|
||||||
objects.extend(objects_similar_arch())
|
objects.extend(objects_similar_arch())
|
||||||
if self.user_settings.editor:
|
if user_settings.editor:
|
||||||
objects.extend(self.get_objects_editor())
|
objects.extend(self.get_objects_editor())
|
||||||
objects.extend(static_archive_construction.get_objects_editor())
|
objects.extend(static_archive_construction.get_objects_editor())
|
||||||
versid_build_environ = ['CXX', 'CPPFLAGS', 'CXXFLAGS', 'LINKFLAGS']
|
versid_build_environ = ['CXX', 'CPPFLAGS', 'CXXFLAGS', 'LINKFLAGS']
|
||||||
versid_cppdefines = env['CPPDEFINES'][:]
|
versid_cppdefines = env['CPPDEFINES'][:]
|
||||||
extra_version = self.user_settings.extra_version
|
extra_version = user_settings.extra_version
|
||||||
if extra_version is None:
|
if extra_version is None:
|
||||||
extra_version = 'v%u.%u' % (self.VERSION_MAJOR, self.VERSION_MINOR)
|
extra_version = 'v%u.%u' % (self.VERSION_MAJOR, self.VERSION_MINOR)
|
||||||
if self.VERSION_MICRO:
|
if self.VERSION_MICRO:
|
||||||
|
@ -3971,8 +3982,8 @@ class DXXProgram(DXXCommon):
|
||||||
# Direct mode conflicts with __TIME__
|
# Direct mode conflicts with __TIME__
|
||||||
versid_environ['CCACHE_NODIRECT'] = 1
|
versid_environ['CCACHE_NODIRECT'] = 1
|
||||||
versid_cpp = 'similar/main/vers_id.cpp'
|
versid_cpp = 'similar/main/vers_id.cpp'
|
||||||
versid_obj = env.StaticObject(target='%s%s%s' % (self.user_settings.builddir, self._apply_target_name(versid_cpp), self.env["OBJSUFFIX"]), source=versid_cpp, CPPDEFINES=versid_cppdefines, ENV=versid_environ)
|
versid_obj = env.StaticObject(target='%s%s%s' % (user_settings.builddir, self._apply_target_name(versid_cpp), self.env["OBJSUFFIX"]), source=versid_cpp, CPPDEFINES=versid_cppdefines, ENV=versid_environ)
|
||||||
if self.user_settings.versid_depend_all:
|
if user_settings.versid_depend_all:
|
||||||
# Optional fake dependency to force vers_id to rebuild so
|
# Optional fake dependency to force vers_id to rebuild so
|
||||||
# that it picks up the latest timestamp.
|
# that it picks up the latest timestamp.
|
||||||
env.Depends(versid_obj, objects)
|
env.Depends(versid_obj, objects)
|
||||||
|
|
Loading…
Reference in a new issue