summaryrefslogtreecommitdiffstats
path: root/SCons
diff options
context:
space:
mode:
authorJoseph Brill <48932340+jcbrill@users.noreply.github.com>2022-06-28 21:16:49 (GMT)
committerJoseph Brill <48932340+jcbrill@users.noreply.github.com>2022-06-28 21:16:49 (GMT)
commitd5a2a52087c968058fff3f2cc983f75953235e1a (patch)
tree9637a1bcc6ab5761cc22a45ca4f421eba5d839f2 /SCons
parent90922c1195eef8d75664d59ed8668fd8e5679390 (diff)
downloadSCons-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.py27
-rw-r--r--SCons/Tool/MSCommon/MSVC/Exceptions.py11
-rw-r--r--SCons/Tool/MSCommon/MSVC/ScriptArguments.py262
-rw-r--r--SCons/Tool/MSCommon/MSVC/Util.py20
-rw-r--r--SCons/Tool/MSCommon/MSVC/WinSDK.py39
-rw-r--r--SCons/Tool/msvc.xml17
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>