Add support to setup c++ stanfard via CXX_STD (defalt to 14)

This commit is contained in:
Artem Pavlenko 2020-09-10 17:50:21 +01:00
parent adced85761
commit 277de45dbc

View file

@ -56,8 +56,9 @@ ICU_LIBS_DEFAULT='/usr/'
DEFAULT_CC = "cc" DEFAULT_CC = "cc"
DEFAULT_CXX = "c++" DEFAULT_CXX = "c++"
DEFAULT_CXX17_CXXFLAGS = " -std=c++17 -DU_USING_ICU_NAMESPACE=0" DEFAULT_CXX_STD = "14"
DEFAULT_CXX17_LINKFLAGS = "" DEFAULT_CXX_CXXFLAGS = " -DU_USING_ICU_NAMESPACE=0"
DEFAULT_CXX_LINKFLAGS = ""
if sys.platform == 'darwin': if sys.platform == 'darwin':
# homebrew default # homebrew default
ICU_INCLUDES_DEFAULT='/usr/local/opt/icu4c/include/' ICU_INCLUDES_DEFAULT='/usr/local/opt/icu4c/include/'
@ -355,6 +356,7 @@ opts = Variables()
opts.AddVariables( opts.AddVariables(
# Compiler options # Compiler options
('CXX', 'The C++ compiler to use to compile mapnik', DEFAULT_CXX), ('CXX', 'The C++ compiler to use to compile mapnik', DEFAULT_CXX),
('CXX_STD', 'The C++ compiler standard (string).', DEFAULT_CXX_STD),
('CC', 'The C compiler used for configure checks of C libs.', DEFAULT_CC), ('CC', 'The C compiler used for configure checks of C libs.', DEFAULT_CC),
('CUSTOM_CXXFLAGS', 'Custom C++ flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir>', ''), ('CUSTOM_CXXFLAGS', 'Custom C++ flags, e.g. -I<include dir> if you have headers in a nonstandard directory <include dir>', ''),
('CUSTOM_DEFINES', 'Custom Compiler DEFINES, e.g. -DENABLE_THIS', ''), ('CUSTOM_DEFINES', 'Custom Compiler DEFINES, e.g. -DENABLE_THIS', ''),
@ -487,6 +489,7 @@ opts.AddVariables(
pickle_store = [# Scons internal variables pickle_store = [# Scons internal variables
'CC', # compiler user to check if c deps compile during configure 'CC', # compiler user to check if c deps compile during configure
'CXX', # C++ compiler to compile mapnik 'CXX', # C++ compiler to compile mapnik
'CXX_STD', # C++ standard e.g 17 (as in -std=c++17)
'CFLAGS', 'CFLAGS',
'CPPDEFINES', 'CPPDEFINES',
'CPPFLAGS', # c preprocessor flags 'CPPFLAGS', # c preprocessor flags
@ -1227,28 +1230,29 @@ int main()
context.Result(ret) context.Result(ret)
return ret return ret
def supports_cxx17(context,silent=False): __cplusplus = {'14':'201402L', '17':'201703L'}
def supports_cxx_std (context, silent=False):
cplusplus_string = __cplusplus[env['CXX_STD']]
if not silent: if not silent:
context.Message('Checking if compiler (%s) supports -std=c++17 flag... ' % context.env.get('CXX','CXX')) context.Message('Checking if compiler (%s) supports -std=c++%s flag... ' % (context.env.get('CXX','CXX'), env['CXX_STD']))
ret, out = context.TryRun(""" ret, out = context.TryRun("""
int main() int main()
{ {
#if __cplusplus >= 201703L #if __cplusplus >= %s
return 0; return 0;
#else #else
return -1; return -1;
#endif #endif
} }
""", '.cpp') """ % cplusplus_string ,'.cpp')
if silent: if silent:
context.did_show_result=1 context.did_show_result=1
context.Result(ret) context.Result(ret)
return ret return ret
conf_tests = { 'prioritize_paths' : prioritize_paths, conf_tests = { 'prioritize_paths' : prioritize_paths,
'CheckPKGConfig' : CheckPKGConfig, 'CheckPKGConfig' : CheckPKGConfig,
'CheckPKG' : CheckPKG, 'CheckPKG' : CheckPKG,
@ -1270,7 +1274,7 @@ conf_tests = { 'prioritize_paths' : prioritize_paths,
'harfbuzz_with_freetype_support': harfbuzz_with_freetype_support, 'harfbuzz_with_freetype_support': harfbuzz_with_freetype_support,
'boost_regex_has_icu' : boost_regex_has_icu, 'boost_regex_has_icu' : boost_regex_has_icu,
'sqlite_has_rtree' : sqlite_has_rtree, 'sqlite_has_rtree' : sqlite_has_rtree,
'supports_cxx17' : supports_cxx17, 'supports_cxx_std' : supports_cxx_std,
'CheckBoostScopedEnum' : CheckBoostScopedEnum, 'CheckBoostScopedEnum' : CheckBoostScopedEnum,
} }
@ -1414,13 +1418,13 @@ if not preconfigured:
# set any custom cxxflags and ldflags to come first # set any custom cxxflags and ldflags to come first
if sys.platform == 'darwin' and not env['HOST']: if sys.platform == 'darwin' and not env['HOST']:
DEFAULT_CXX17_CXXFLAGS += ' -stdlib=libc++' DEFAULT_CXX_CXXFLAGS += ' -stdlib=libc++'
DEFAULT_CXX17_LINKFLAGS = ' -stdlib=libc++' DEFAULT_CXX_LINKFLAGS = ' -stdlib=libc++'
env.Append(CPPDEFINES = env['CUSTOM_DEFINES']) env.Append(CPPDEFINES = env['CUSTOM_DEFINES'])
env.Append(CXXFLAGS = DEFAULT_CXX17_CXXFLAGS) env.Append(CXXFLAGS = "-std=c++%s %s" % (env['CXX_STD'], DEFAULT_CXX_CXXFLAGS))
env.Append(CXXFLAGS = env['CUSTOM_CXXFLAGS']) env.Append(CXXFLAGS = env['CUSTOM_CXXFLAGS'])
env.Append(CFLAGS = env['CUSTOM_CFLAGS']) env.Append(CFLAGS = env['CUSTOM_CFLAGS'])
env.Append(LINKFLAGS = DEFAULT_CXX17_LINKFLAGS) env.Append(LINKFLAGS = DEFAULT_CXX_LINKFLAGS)
custom_ldflags = env.ParseFlags(env['CUSTOM_LDFLAGS']) custom_ldflags = env.ParseFlags(env['CUSTOM_LDFLAGS'])
env.Append(LINKFLAGS = custom_ldflags.pop('LINKFLAGS'), env.Append(LINKFLAGS = custom_ldflags.pop('LINKFLAGS'),
@ -1600,9 +1604,10 @@ if not preconfigured:
if env['PRIORITIZE_LINKING']: if env['PRIORITIZE_LINKING']:
conf.prioritize_paths(silent=True) conf.prioritize_paths(silent=True)
# test for C++17 support, which is required # test for CXX_STD support, which is required
if not env['HOST'] and not conf.supports_cxx17(): if not env['HOST'] and not conf.supports_cxx_std():
color_print(1,"C++ compiler does not support C++17 standard (-std=c++17), which is required. Please upgrade your compiler") color_print(1,"C++ compiler does not support C++%s standard (-std=c++%s), which is required."
" Please upgrade your compiler" % (env['CXX_STD'], env['CXX_STD']))
Exit(1) Exit(1)
if not env['HOST']: if not env['HOST']: