summaryrefslogtreecommitdiff
path: root/lib/spack/spack/operating_systems/windows_os.py
blob: ec563f53361c5be0e2daa37c92f64dbe09dde1ba (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# Copyright 2013-2021 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

import glob
import os
import platform
import subprocess

from spack.error import SpackError
from spack.version import Version

from ._operating_system import OperatingSystem


def windows_version():
    """temporary workaround to return a Windows version as a Version object"""
    return Version(platform.release())


class WindowsOs(OperatingSystem):
    """This class represents the Windows operating system.  This will be
    auto detected using the python platform.win32_ver() once we have a
    python setup that runs natively.  The Windows platform will be
    represented using the major version operating system number, e.g.
    10.
    """

    # Find MSVC directories using vswhere
    comp_search_paths = []
    vs_install_paths = []
    root = os.environ.get("ProgramFiles(x86)") or os.environ.get("ProgramFiles")
    if root:
        try:
            extra_args = {"encoding": "mbcs", "errors": "strict"}
            paths = subprocess.check_output(  # type: ignore[call-overload] # novermin
                [
                    os.path.join(root, "Microsoft Visual Studio", "Installer", "vswhere.exe"),
                    "-prerelease",
                    "-requires",
                    "Microsoft.VisualStudio.Component.VC.Tools.x86.x64",
                    "-property",
                    "installationPath",
                    "-products",
                    "*",
                ],
                **extra_args,
            ).strip()
            vs_install_paths = paths.split("\n")
            msvc_paths = [os.path.join(path, "VC", "Tools", "MSVC") for path in vs_install_paths]
            for p in msvc_paths:
                comp_search_paths.extend(glob.glob(os.path.join(p, "*", "bin", "Hostx64", "x64")))
            if os.getenv("ONEAPI_ROOT"):
                comp_search_paths.extend(
                    glob.glob(
                        os.path.join(
                            str(os.getenv("ONEAPI_ROOT")), "compiler", "*", "windows", "bin"
                        )
                    )
                )
        except (subprocess.CalledProcessError, OSError, UnicodeDecodeError):
            pass
    if comp_search_paths:
        compiler_search_paths = comp_search_paths

    def __init__(self):
        plat_ver = platform.release()
        if Version(plat_ver) < Version("10"):
            raise SpackError("Spack is not supported on Windows versions older than 10")
        super(WindowsOs, self).__init__("windows{}".format(plat_ver), plat_ver)

    def __str__(self):
        return self.name