diff --git a/SConscript b/SConscript index 25e87a6..b1f7a73 100644 --- a/SConscript +++ b/SConscript @@ -18,6 +18,20 @@ import uuid from SCons.Node import Node +_GCC_CPU_FEATURES_MAP = { + 'mmx': '-mmmx', + 'sse': '-msse', + 'sse2': '-msse2', + 'sse3': '-msse3', + 'ssse3': '-mssse3', + 'sse4': '-msse4', + 'sse4a': '-msse4a', + 'sse4.1': '-msse4.1', + 'sse4.2': '-msse4.2', + 'avx': '-mavx', + 'avx2': '-mavx2' +} + class TargetType(enum.Enum): PROGRAM = 0 STATIC_LIBRARY = 1 @@ -918,7 +932,6 @@ if not config.get('CXX_STANDARD'): config['CXX_STANDARD'] = 'c++23' if not config.get('CXX_NO_EXCEPTIONS'): config['CXX_NO_EXCEPTIONS'] = False - if not config.get('PREPROCESSOR_PREFIX'): config['PREPROCESSOR_PREFIX'] = config['PROJECT_NAME'].upper() # TODO: may be nicer? @@ -1144,6 +1157,7 @@ env['SPP_TARGET_DEPENDENCIES'] = [] env['SPP_DEPENDENCIES'] = {} env['SPP_RECIPES'] = {} env['SPP_MODULES'] = {} # maps from folder to _Module +env['SPP_CPU_FEATURES'] = config.get('USE_CPU_FEATURES', []) env['OBJSUFFIX'] = f".{env['BUILD_TYPE']}{env['OBJSUFFIX']}" if variant: @@ -1246,6 +1260,13 @@ if env['COMPILER_FAMILY'] == 'gcc' or env['COMPILER_FAMILY'] == 'clang': env.Append(DEPS_CXXFLAGS = ['-fsanitize=address', '-fno-omit-frame-pointer']) env.Append(DEPS_LINKFLAGS = ['-fsanitize=address']) + for feature in env['SPP_CPU_FEATURES']: + flag = _GCC_CPU_FEATURES_MAP.get(feature) + if flag is None: + _warn(None, f'Unknown or unsupported cpu feature "{feature}" for GCC/Clang.') + else: + env.Append(CCFLAGS = [flag]) + elif env['COMPILER_FAMILY'] == 'cl': cxx_version_name = { 'c++14': 'c++14',