summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn W. Parent <45471568+johnwparent@users.noreply.github.com>2023-09-29 16:17:10 -0400
committerGitHub <noreply@github.com>2023-09-29 20:17:10 +0000
commit7d072cc16f94abe9afc5066f739ff1175d9962bf (patch)
treeb397e0c7c8d2c3b21beeef319a8da68f22fbc721
parentd81f457e7a2892678166c935a3a7703260e8bfb6 (diff)
downloadspack-7d072cc16f94abe9afc5066f739ff1175d9962bf.tar.gz
spack-7d072cc16f94abe9afc5066f739ff1175d9962bf.tar.bz2
spack-7d072cc16f94abe9afc5066f739ff1175d9962bf.tar.xz
spack-7d072cc16f94abe9afc5066f739ff1175d9962bf.zip
Windows: detect all available SDK versions (#39823)
Currently, Windows SDK detection will only pick up SDK versions related to the current version of Windows Spack is running on. However, in some circumstances, we want to detect other version of the SDK, for example, for compiling on Windows 11 for Windows 10 to ensure an API is compatible with Win10.
-rw-r--r--lib/spack/spack/detection/common.py63
1 files changed, 35 insertions, 28 deletions
diff --git a/lib/spack/spack/detection/common.py b/lib/spack/spack/detection/common.py
index 50a3a2695a..0e873c3f55 100644
--- a/lib/spack/spack/detection/common.py
+++ b/lib/spack/spack/detection/common.py
@@ -299,36 +299,36 @@ class WindowsCompilerExternalPaths:
class WindowsKitExternalPaths:
- plat_major_ver = None
- if sys.platform == "win32":
- plat_major_ver = str(winOs.windows_version()[0])
-
@staticmethod
- def find_windows_kit_roots() -> Optional[str]:
+ def find_windows_kit_roots() -> List[str]:
"""Return Windows kit root, typically %programfiles%\\Windows Kits\\10|11\\"""
if sys.platform != "win32":
- return None
+ return []
program_files = os.environ["PROGRAMFILES(x86)"]
- kit_base = os.path.join(
- program_files, "Windows Kits", WindowsKitExternalPaths.plat_major_ver
- )
- return kit_base
+ kit_base = os.path.join(program_files, "Windows Kits", "**")
+ return glob.glob(kit_base)
@staticmethod
def find_windows_kit_bin_paths(kit_base: Optional[str] = None) -> List[str]:
"""Returns Windows kit bin directory per version"""
kit_base = WindowsKitExternalPaths.find_windows_kit_roots() if not kit_base else kit_base
- assert kit_base is not None, "unexpected value for kit_base"
- kit_bin = os.path.join(kit_base, "bin")
- return glob.glob(os.path.join(kit_bin, "[0-9]*", "*\\"))
+ assert kit_base, "Unexpectedly empty value for Windows kit base path"
+ kit_paths = []
+ for kit in kit_base:
+ kit_bin = os.path.join(kit, "bin")
+ kit_paths.extend(glob.glob(os.path.join(kit_bin, "[0-9]*", "*\\")))
+ return kit_paths
@staticmethod
def find_windows_kit_lib_paths(kit_base: Optional[str] = None) -> List[str]:
"""Returns Windows kit lib directory per version"""
kit_base = WindowsKitExternalPaths.find_windows_kit_roots() if not kit_base else kit_base
- assert kit_base is not None, "unexpected value for kit_base"
- kit_lib = os.path.join(kit_base, "Lib")
- return glob.glob(os.path.join(kit_lib, "[0-9]*", "*", "*\\"))
+ assert kit_base, "Unexpectedly empty value for Windows kit base path"
+ kit_paths = []
+ for kit in kit_base:
+ kit_lib = os.path.join(kit, "Lib")
+ kit_paths.extend(glob.glob(os.path.join(kit_lib, "[0-9]*", "*", "*\\")))
+ return kit_paths
@staticmethod
def find_windows_driver_development_kit_paths() -> List[str]:
@@ -347,23 +347,30 @@ class WindowsKitExternalPaths:
if not reg:
# couldn't find key, return empty list
return []
- return WindowsKitExternalPaths.find_windows_kit_lib_paths(
- reg.get_value("KitsRoot%s" % WindowsKitExternalPaths.plat_major_ver).value
- )
+ kit_root_reg = re.compile(r"KitsRoot[0-9]+")
+ root_paths = []
+ for kit_root in filter(kit_root_reg.match, reg.get_values().keys()):
+ root_paths.extend(
+ WindowsKitExternalPaths.find_windows_kit_lib_paths(reg.get_value(kit_root).value)
+ )
+ return root_paths
@staticmethod
def find_windows_kit_reg_sdk_paths() -> List[str]:
- reg = spack.util.windows_registry.WindowsRegistryView(
- "SOFTWARE\\WOW6432Node\\Microsoft\\Microsoft SDKs\\Windows\\v%s.0"
- % WindowsKitExternalPaths.plat_major_ver,
+ sdk_paths = []
+ sdk_regex = re.compile(r"v[0-9]+.[0-9]+")
+ windows_reg = spack.util.windows_registry.WindowsRegistryView(
+ "SOFTWARE\\WOW6432Node\\Microsoft\\Microsoft SDKs\\Windows",
root_key=spack.util.windows_registry.HKEY.HKEY_LOCAL_MACHINE,
)
- if not reg:
- # couldn't find key, return empty list
- return []
- return WindowsKitExternalPaths.find_windows_kit_lib_paths(
- reg.get_value("InstallationFolder").value
- )
+ for key in filter(sdk_regex.match, [x.name for x in windows_reg.get_subkeys()]):
+ reg = windows_reg.get_subkey(key)
+ sdk_paths.extend(
+ WindowsKitExternalPaths.find_windows_kit_lib_paths(
+ reg.get_value("InstallationFolder").value
+ )
+ )
+ return sdk_paths
def find_win32_additional_install_paths() -> List[str]: