diff options
author | Joseph Brill <48932340+jcbrill@users.noreply.github.com> | 2022-06-28 21:16:49 (GMT) |
---|---|---|
committer | Joseph Brill <48932340+jcbrill@users.noreply.github.com> | 2022-06-28 21:16:49 (GMT) |
commit | d5a2a52087c968058fff3f2cc983f75953235e1a (patch) | |
tree | 9637a1bcc6ab5761cc22a45ca4f421eba5d839f2 /SCons | |
parent | 90922c1195eef8d75664d59ed8668fd8e5679390 (diff) | |
download | SCons-d5a2a52087c968058fff3f2cc983f75953235e1a.zip SCons-d5a2a52087c968058fff3f2cc983f75953235e1a.tar.gz SCons-d5a2a52087c968058fff3f2cc983f75953235e1a.tar.bz2 |
Additional validation for MSVC_SDK_VERSION and MSVC_SPECTRE_LIBS. Adjust documentation. Add additional exceptions for SDK version not found, toolset version not found, and spectre libraries not found. Add data structure for platform type.
Diffstat (limited to 'SCons')
-rw-r--r-- | SCons/Tool/MSCommon/MSVC/Config.py | 27 | ||||
-rw-r--r-- | SCons/Tool/MSCommon/MSVC/Exceptions.py | 11 | ||||
-rw-r--r-- | SCons/Tool/MSCommon/MSVC/ScriptArguments.py | 262 | ||||
-rw-r--r-- | SCons/Tool/MSCommon/MSVC/Util.py | 20 | ||||
-rw-r--r-- | SCons/Tool/MSCommon/MSVC/WinSDK.py | 39 | ||||
-rw-r--r-- | SCons/Tool/msvc.xml | 17 |
6 files changed, 299 insertions, 77 deletions
diff --git a/SCons/Tool/MSCommon/MSVC/Config.py b/SCons/Tool/MSCommon/MSVC/Config.py index a4cb874..3b71cd8 100644 --- a/SCons/Tool/MSCommon/MSVC/Config.py +++ b/SCons/Tool/MSCommon/MSVC/Config.py @@ -55,6 +55,33 @@ for bool, symbol_list, symbol_case_list in [ for symbol in BOOLEAN_SYMBOLS[bool]: BOOLEAN_EXTERNAL[symbol] = bool +MSVC_PLATFORM_DEFINITION = namedtuple('MSVCPlatform', [ + 'vc_platform', + 'is_uwp', +]) + +MSVC_PLATFORM_DEFINITION_LIST = [] + +MSVC_PLATFORM_INTERNAL = {} +MSVC_PLATFORM_EXTERNAL = {} + +for vc_platform, is_uwp in [ + ('Desktop', False), + ('UWP', True), +]: + + vc_platform_def = MSVC_PLATFORM_DEFINITION( + vc_platform = vc_platform, + is_uwp = is_uwp, + ) + + MSVC_PLATFORM_DEFINITION_LIST.append(vc_platform_def) + + MSVC_PLATFORM_INTERNAL[vc_platform] = vc_platform_def + + for symbol in [vc_platform, vc_platform.lower(), vc_platform.upper()]: + MSVC_PLATFORM_EXTERNAL[symbol] = vc_platform_def + MSVC_RUNTIME_DEFINITION = namedtuple('MSVCRuntime', [ 'vc_runtime', 'vc_runtime_numeric', diff --git a/SCons/Tool/MSCommon/MSVC/Exceptions.py b/SCons/Tool/MSCommon/MSVC/Exceptions.py index 7a61ec5..015fede 100644 --- a/SCons/Tool/MSCommon/MSVC/Exceptions.py +++ b/SCons/Tool/MSCommon/MSVC/Exceptions.py @@ -28,10 +28,19 @@ Exceptions for Microsoft Visual C/C++. class VisualCException(Exception): pass +class MSVCInternalError(VisualCException): + pass + class MSVCVersionNotFound(VisualCException): pass -class MSVCInternalError(VisualCException): +class MSVCSDKVersionNotFound(VisualCException): + pass + +class MSVCToolsetVersionNotFound(VisualCException): + pass + +class MSVCSpectreLibsNotFound(VisualCException): pass class MSVCArgumentError(VisualCException): diff --git a/SCons/Tool/MSCommon/MSVC/ScriptArguments.py b/SCons/Tool/MSCommon/MSVC/ScriptArguments.py index 6a4ce3e..33e13fd 100644 --- a/SCons/Tool/MSCommon/MSVC/ScriptArguments.py +++ b/SCons/Tool/MSCommon/MSVC/ScriptArguments.py @@ -44,6 +44,9 @@ from . import WinSDK from .Exceptions import ( MSVCInternalError, + MSVCSDKVersionNotFound, + MSVCToolsetVersionNotFound, + MSVCSpectreLibsNotFound, MSVCArgumentError, ) @@ -131,6 +134,18 @@ def msvc_force_default_arguments(force=True): if CONFIG_CACHE_FORCE_DEFAULT_ARGUMENTS: msvc_force_default_arguments(force=True) +# UWP SDK 8.1 and SDK 10: +# +# https://stackoverflow.com/questions/46659238/build-windows-app-compatible-for-8-1-and-10 +# VS2019 - UWP (Except for Win10Mobile) +# VS2017 - UWP +# VS2015 - UWP, Win8.1 StoreApp, WP8/8.1 StoreApp +# VS2013 - Win8/8.1 StoreApp, WP8/8.1 StoreApp + +# SPECTRE LIBS (msvc documentation): +# "There are no versions of Spectre-mitigated libraries for Universal Windows (UWP) apps or +# components. App-local deployment of such libraries isn't possible." + # MSVC batch file arguments: # # VS2022: UWP, SDK, TOOLSET, SPECTRE @@ -159,7 +174,7 @@ VS2017 = Config.MSVS_VERSION_INTERNAL['2017'] VS2015 = Config.MSVS_VERSION_INTERNAL['2015'] MSVC_VERSION_ARGS_DEFINITION = namedtuple('MSVCVersionArgsDefinition', [ - 'version', # fully qualified msvc version (e.g., '14.1Exp') + 'version', # full version (e.g., '14.1Exp', '14.32.31326') 'vs_def', ]) @@ -175,6 +190,18 @@ def _msvc_version(version): return version_args +def _toolset_version(version): + + verstr = Util.get_msvc_version_prefix(version) + vs_def = Config.MSVC_VERSION_INTERNAL[verstr] + + version_args = MSVC_VERSION_ARGS_DEFINITION( + version = version, + vs_def = vs_def, + ) + + return version_args + def _msvc_script_argument_uwp(env, msvc, arglist): uwp_app = env['MSVC_UWP_APP'] @@ -252,12 +279,38 @@ def _msvc_script_argument_sdk_constraints(msvc, sdk_version): err_msg = "MSVC_SDK_VERSION ({}) is not supported".format(repr(sdk_version)) return err_msg -def _msvc_script_argument_sdk(env, msvc, platform_type, arglist): +def _msvc_script_argument_sdk_platform_constraints(msvc, toolset, sdk_version, platform_def): + + if sdk_version == '8.1' and platform_def.is_uwp: + + vs_def = toolset.vs_def if toolset else msvc.vs_def + + if vs_def.vc_buildtools_def.vc_version_numeric > VS2015.vc_buildtools_def.vc_version_numeric: + debug( + 'invalid: uwp/store SDK 8.1 msvc_version constraint: %s > %s VS2015', + repr(vs_def.vc_buildtools_def.vc_version_numeric), + repr(VS2015.vc_buildtools_def.vc_version_numeric) + ) + if toolset and toolset.vs_def != msvc.vs_def: + err_msg = "MSVC_SDK_VERSION ({}) and platform type ({}) constraint violation: toolset version {} > {} VS2015".format( + repr(sdk_version), repr(platform_def.vc_platform), + repr(toolset.version), repr(VS2015.vc_buildtools_def.vc_version) + ) + else: + err_msg = "MSVC_SDK_VERSION ({}) and platform type ({}) constraint violation: MSVC_VERSION {} > {} VS2015".format( + repr(sdk_version), repr(platform_def.vc_platform), + repr(msvc.version), repr(VS2015.vc_buildtools_def.vc_version) + ) + return err_msg + + return None + +def _msvc_script_argument_sdk(env, msvc, toolset, platform_def, arglist): sdk_version = env['MSVC_SDK_VERSION'] debug( 'MSVC_VERSION=%s, MSVC_SDK_VERSION=%s, platform_type=%s', - repr(msvc.version), repr(sdk_version), repr(platform_type) + repr(msvc.version), repr(sdk_version), repr(platform_def.vc_platform) ) if not sdk_version: @@ -267,12 +320,16 @@ def _msvc_script_argument_sdk(env, msvc, platform_type, arglist): if err_msg: raise MSVCArgumentError(err_msg) - sdk_list = WinSDK.get_sdk_version_list(msvc.vs_def.vc_sdk_versions, platform_type) + sdk_list = WinSDK.get_sdk_version_list(msvc.vs_def.vc_sdk_versions, platform_def) if sdk_version not in sdk_list: err_msg = "MSVC_SDK_VERSION {} not found for platform type {}".format( - repr(sdk_version), repr(platform_type) + repr(sdk_version), repr(platform_def.vc_platform) ) + raise MSVCSDKVersionNotFound(err_msg) + + err_msg = _msvc_script_argument_sdk_platform_constraints(msvc, toolset, sdk_version, platform_def) + if err_msg: raise MSVCArgumentError(err_msg) argpair = (SortOrder.SDK, sdk_version) @@ -280,12 +337,12 @@ def _msvc_script_argument_sdk(env, msvc, platform_type, arglist): return sdk_version -def _msvc_script_default_sdk(env, msvc, platform_type, arglist): +def _msvc_script_default_sdk(env, msvc, platform_def, arglist): if msvc.vs_def.vc_buildtools_def.vc_version_numeric < VS2015.vc_buildtools_def.vc_version_numeric: return None - sdk_list = WinSDK.get_sdk_version_list(msvc.vs_def.vc_sdk_versions, platform_type) + sdk_list = WinSDK.get_sdk_version_list(msvc.vs_def.vc_sdk_versions, platform_def) if not len(sdk_list): return None @@ -293,7 +350,7 @@ def _msvc_script_default_sdk(env, msvc, platform_type, arglist): debug( 'MSVC_VERSION=%s, sdk_default=%s, platform_type=%s', - repr(msvc.version), repr(sdk_default), repr(platform_type) + repr(msvc.version), repr(sdk_default), repr(platform_def.vc_platform) ) argpair = (SortOrder.SDK, sdk_default) @@ -597,8 +654,9 @@ def _msvc_script_argument_toolset(env, msvc, vc_dir, arglist): err_msg = "MSVC_TOOLSET_VERSION {} not found for MSVC_VERSION {}".format( repr(toolset_version), repr(msvc.version) ) - raise MSVCArgumentError(err_msg) + raise MSVCToolsetVersionNotFound(err_msg) + # toolset may not be installed for host/target argpair = (SortOrder.TOOLSET, '-vcvars_ver={}'.format(toolset_vcvars)) arglist.append(argpair) @@ -644,16 +702,7 @@ def _user_script_argument_toolset(env, toolset_version, user_argstr): raise MSVCArgumentError(err_msg) -def _msvc_script_argument_spectre(env, msvc, arglist): - - spectre_libs = env['MSVC_SPECTRE_LIBS'] - debug('MSVC_VERSION=%s, MSVC_SPECTRE_LIBS=%s', repr(msvc.version), repr(spectre_libs)) - - if not spectre_libs: - return None - - if spectre_libs not in _ARGUMENT_BOOLEAN_TRUE: - return None +def _msvc_script_argument_spectre_constraints(msvc, toolset, spectre_libs, platform_def): if msvc.vs_def.vc_buildtools_def.vc_version_numeric < VS2017.vc_buildtools_def.vc_version_numeric: debug( @@ -664,11 +713,63 @@ def _msvc_script_argument_spectre(env, msvc, arglist): err_msg = "MSVC_SPECTRE_LIBS ({}) constraint violation: MSVC_VERSION {} < {} VS2017".format( repr(spectre_libs), repr(msvc.version), repr(VS2017.vc_buildtools_def.vc_version) ) + return err_msg + + if toolset: + if toolset.vs_def.vc_buildtools_def.vc_version_numeric < VS2017.vc_buildtools_def.vc_version_numeric: + debug( + 'invalid: toolset version constraint: %s < %s VS2017', + repr(toolset.vs_def.vc_buildtools_def.vc_version_numeric), + repr(VS2017.vc_buildtools_def.vc_version_numeric) + ) + err_msg = "MSVC_SPECTRE_LIBS ({}) constraint violation: toolset version {} < {} VS2017".format( + repr(spectre_libs), repr(toolset.version), repr(VS2017.vc_buildtools_def.vc_version) + ) + return err_msg + + + if platform_def.is_uwp: + debug( + 'invalid: spectre_libs=%s and platform_type=%s', + repr(spectre_libs), repr(platform_def.vc_platform) + ) + err_msg = "MSVC_SPECTRE_LIBS ({}) are not supported for platform type ({})".format( + repr(spectre_libs), repr(platform_def.vc_platform) + ) + return err_msg + + return None + +def _msvc_script_argument_spectre(env, msvc, vc_dir, toolset, platform_def, arglist): + + spectre_libs = env['MSVC_SPECTRE_LIBS'] + debug('MSVC_VERSION=%s, MSVC_SPECTRE_LIBS=%s', repr(msvc.version), repr(spectre_libs)) + + if not spectre_libs: + return None + + if spectre_libs not in _ARGUMENT_BOOLEAN_TRUE: + return None + + err_msg = _msvc_script_argument_spectre_constraints(msvc, toolset, spectre_libs, platform_def) + if err_msg: raise MSVCArgumentError(err_msg) + if toolset: + spectre_dir = os.path.join(vc_dir, "Tools", "MSVC", toolset.version, "lib", "spectre") + if not os.path.exists(spectre_dir): + debug( + 'spectre libs: msvc_version=%s, toolset_version=%s, spectre_dir=%s', + repr(msvc.version), repr(toolset.version), repr(spectre_dir) + ) + err_msg = "Spectre libraries not found for MSVC_VERSION {} toolset version {}".format( + repr(msvc.version), repr(toolset.version) + ) + raise MSVCSpectreLibsNotFound(err_msg) + spectre_arg = 'spectre' - # spectre libs may not be installed + # spectre libs may not be installed for host/target argpair = (SortOrder.SPECTRE, '-vcvars_spectre_libs={}'.format(spectre_arg)) arglist.append(argpair) @@ -723,66 +824,111 @@ def _msvc_script_argument_user(env, msvc, arglist): return script_args +def _msvc_process_construction_variables(env): + + for cache_variable in [ + _MSVC_FORCE_DEFAULT_TOOLSET, + _MSVC_FORCE_DEFAULT_SDK, + ]: + if cache_variable: + return True + + for env_variable in [ + 'MSVC_UWP_APP', + 'MSVC_TOOLSET_VERSION', + 'MSVC_SDK_VERSION', + 'MSVC_SPECTRE_LIBS', + ]: + if env.get(env_variable, None) != None: + return True + + return False + def msvc_script_arguments(env, version, vc_dir, arg): arglist = [] - msvc = _msvc_version(version) - if arg: argpair = (SortOrder.ARCH, arg) arglist.append(argpair) + msvc = _msvc_version(version) + if 'MSVC_SCRIPT_ARGS' in env: user_argstr = _msvc_script_argument_user(env, msvc, arglist) else: user_argstr = None - if 'MSVC_UWP_APP' in env: - uwp = _msvc_script_argument_uwp(env, msvc, arglist) - else: - uwp = None + if _msvc_process_construction_variables(env): - if user_argstr: - _user_script_argument_uwp(env, uwp, user_argstr) + # MSVC_UWP_APP - platform_type = 'uwp' if uwp else 'desktop' + if 'MSVC_UWP_APP' in env: + uwp = _msvc_script_argument_uwp(env, msvc, arglist) + else: + uwp = None - if 'MSVC_SDK_VERSION' in env: - sdk_version = _msvc_script_argument_sdk(env, msvc, platform_type, arglist) - else: - sdk_version = None + if user_argstr: + _user_script_argument_uwp(env, uwp, user_argstr) - if user_argstr: - user_sdk = _user_script_argument_sdk(env, sdk_version, user_argstr) - else: - user_sdk = None + is_uwp = True if uwp else False + platform_def = WinSDK.get_msvc_platform(is_uwp) - if _MSVC_FORCE_DEFAULT_SDK: - if not sdk_version and not user_sdk: - sdk_version = _msvc_script_default_sdk(env, msvc, platform_type, arglist) + # MSVC_TOOLSET_VERSION - if 'MSVC_TOOLSET_VERSION' in env: - toolset_version = _msvc_script_argument_toolset(env, msvc, vc_dir, arglist) - else: - toolset_version = None + if 'MSVC_TOOLSET_VERSION' in env: + toolset_version = _msvc_script_argument_toolset(env, msvc, vc_dir, arglist) + else: + toolset_version = None - if user_argstr: - user_toolset = _user_script_argument_toolset(env, toolset_version, user_argstr) - else: - user_toolset = None + if user_argstr: + user_toolset = _user_script_argument_toolset(env, toolset_version, user_argstr) + else: + user_toolset = None - if _MSVC_FORCE_DEFAULT_TOOLSET: if not toolset_version and not user_toolset: - toolset_version = _msvc_script_default_toolset(env, msvc, vc_dir, arglist) - - if 'MSVC_SPECTRE_LIBS' in env: - spectre = _msvc_script_argument_spectre(env, msvc, arglist) - else: - spectre = None - - if user_argstr: - _user_script_argument_spectre(env, spectre, user_argstr) + default_toolset = _msvc_script_default_toolset(env, msvc, vc_dir, arglist) + else: + default_toolset = None + + if _MSVC_FORCE_DEFAULT_TOOLSET: + if default_toolset: + toolset_version = default_toolset + + if user_toolset: + toolset = None + elif toolset_version: + toolset = _toolset_version(toolset_version) + elif default_toolset: + toolset = _toolset_version(default_toolset) + else: + toolset = None + + # MSVC_SDK_VERSION + + if 'MSVC_SDK_VERSION' in env: + sdk_version = _msvc_script_argument_sdk(env, msvc, toolset, platform_def, arglist) + else: + sdk_version = None + + if user_argstr: + user_sdk = _user_script_argument_sdk(env, sdk_version, user_argstr) + else: + user_sdk = None + + if _MSVC_FORCE_DEFAULT_SDK: + if not sdk_version and not user_sdk: + sdk_version = _msvc_script_default_sdk(env, msvc, platform_def, arglist) + + # MSVC_SPECTRE_LIBS + + if 'MSVC_SPECTRE_LIBS' in env: + spectre = _msvc_script_argument_spectre(env, msvc, vc_dir, toolset, platform_def, arglist) + else: + spectre = None + + if user_argstr: + _user_script_argument_spectre(env, spectre, user_argstr) if arglist: arglist.sort() diff --git a/SCons/Tool/MSCommon/MSVC/Util.py b/SCons/Tool/MSCommon/MSVC/Util.py index ba70b24..ed87f9d 100644 --- a/SCons/Tool/MSCommon/MSVC/Util.py +++ b/SCons/Tool/MSCommon/MSVC/Util.py @@ -83,3 +83,23 @@ def get_version_prefix(version): rval = '' return rval +re_msvc_version_prefix = re.compile(r'^(?P<version>[1-9][0-9]?[.][0-9]).*') + +def get_msvc_version_prefix(version): + """Get the msvc version number prefix from a string. + + Args: + version: str + version string + + Returns: + str: the msvc version number prefix + + """ + m = re_msvc_version_prefix.match(version) + if m: + rval = m.group('version') + else: + rval = '' + return rval + diff --git a/SCons/Tool/MSCommon/MSVC/WinSDK.py b/SCons/Tool/MSCommon/MSVC/WinSDK.py index 8338c27..42526c2 100644 --- a/SCons/Tool/MSCommon/MSVC/WinSDK.py +++ b/SCons/Tool/MSCommon/MSVC/WinSDK.py @@ -43,10 +43,13 @@ from . import Dispatcher Dispatcher.register_modulename(__name__) +_DESKTOP = Config.MSVC_PLATFORM_INTERNAL['Desktop'] +_UWP = Config.MSVC_PLATFORM_INTERNAL['UWP'] + def _new_sdk_map(): sdk_map = { - 'desktop': [], - 'uwp': [], + _DESKTOP.vc_platform: [], + _UWP.vc_platform: [], } return sdk_map @@ -84,20 +87,20 @@ def _sdk_10_layout(version): if not os.path.exists(sdk_inc_path): continue - for platform_type, sdk_inc_file in [ - ('desktop', 'winsdkver.h'), - ('uwp', 'windows.h'), + for vc_platform, sdk_inc_file in [ + (_DESKTOP.vc_platform, 'winsdkver.h'), + (_UWP.vc_platform, 'windows.h'), ]: if not os.path.exists(os.path.join(sdk_inc_path, sdk_inc_file)): continue - key = (version_nbr, platform_type) + key = (version_nbr, vc_platform) if key in sdk_version_platform_seen: continue sdk_version_platform_seen.add(key) - sdk_map[platform_type].append(version_nbr) + sdk_map[vc_platform].append(version_nbr) for key, val in sdk_map.items(): val.sort(reverse=True) @@ -128,20 +131,20 @@ def _sdk_81_layout(version): if not os.path.exists(sdk_inc_path): continue - for platform_type, sdk_inc_file in [ - ('desktop', 'winsdkver.h'), - ('uwp', 'windows.h'), + for vc_platform, sdk_inc_file in [ + (_DESKTOP.vc_platform, 'winsdkver.h'), + (_UWP.vc_platform, 'windows.h'), ]: if not os.path.exists(os.path.join(sdk_inc_path, sdk_inc_file)): continue - key = (version_nbr, platform_type) + key = (version_nbr, vc_platform) if key in sdk_version_platform_seen: continue sdk_version_platform_seen.add(key) - sdk_map[platform_type].append(version_nbr) + sdk_map[vc_platform].append(version_nbr) for key, val in sdk_map.items(): val.sort(reverse=True) @@ -218,9 +221,13 @@ def _sdk_map(version_list): _sdk_cache[key] = sdk_map return sdk_map -def get_sdk_version_list(version_list, platform_type): +def get_msvc_platform(is_uwp=False): + platform_def = _UWP if is_uwp else _DESKTOP + return platform_def + +def get_sdk_version_list(version_list, platform_def): sdk_map = _sdk_map(version_list) - sdk_list = sdk_map.get(platform_type, []) + sdk_list = sdk_map.get(platform_def.vc_platform, []) return sdk_list def get_msvc_sdk_version_list(msvc_version, msvc_uwp_app=False): @@ -235,8 +242,8 @@ def get_msvc_sdk_version_list(msvc_version, msvc_uwp_app=False): return sdk_versions is_uwp = True if msvc_uwp_app in Config.BOOLEAN_SYMBOLS[True] else False - platform_type = 'uwp' if is_uwp else 'desktop' - sdk_list = get_sdk_version_list(vs_def.vc_sdk_versions, platform_type) + platform_def = get_msvc_platform(is_uwp) + sdk_list = get_sdk_version_list(vs_def.vc_sdk_versions, platform_def) sdk_versions.extend(sdk_list) debug('sdk_versions=%s', repr(sdk_versions)) diff --git a/SCons/Tool/msvc.xml b/SCons/Tool/msvc.xml index 11c6478..9297100 100644 --- a/SCons/Tool/msvc.xml +++ b/SCons/Tool/msvc.xml @@ -950,6 +950,13 @@ type (i.e., <literal>UWP</literal> or <literal>Desktop</literal>). The requeste platform type components do not appear to be installed. </para></listitem> +<listitem><para> +The &cv-MSVC_SDK_VERSION; version is <literal>8.1</literal>, the platform type is +<literal>UWP</literal>, and the build tools selected are from Visual Studio 2017 +and later (i.e., &cv-link-MSVC_VERSION; must be '14.0' or &cv-link-MSVC_TOOLSET_VERSION; +must be '14.0'). +</para></listitem> + </itemizedlist> </para> @@ -1209,6 +1216,12 @@ An exception is raised when any of the following conditions are satisfied: and &cv-link-MSVC_SCRIPT_ARGS; are not allowed. </para></listitem> +<listitem><para> +&cv-MSVC_SPECTRE_LIBS; is enabled and the platform type is <literal>UWP</literal>. There +are no spectre-mitigated libraries for Universal Windows Platform (UWP) applications or +components. +</para></listitem> + </itemizedlist> </para> @@ -1240,8 +1253,8 @@ details. <listitem><para> <emphasis> -The existence of the spectre mitigations libraries is not verified when &cv-MSVC_SPECTRE_LIBS; -is enabled which could result in build failures. +The existence of the spectre libraries host architecture and target architecture folders are not +verified when &cv-MSVC_SPECTRE_LIBS; is enabled which could result in build failures. </emphasis> The burden is on the user to ensure the requisite libraries with spectre mitigations are installed. </para></listitem> |