diff options
author | D Scott Phillips <d.scott.phillips@intel.com> | 2020-06-02 21:20:52 -0700 |
---|---|---|
committer | Jussi Pakkanen <jpakkane@gmail.com> | 2020-06-10 01:09:16 +0300 |
commit | f6a842821b64653de042633e714af3c5a5326c29 (patch) | |
tree | 7fb14578041f11fde188d162e399ca2f509fbad6 | |
parent | 5663b4a3e8507199318965132cdc9cc53a59da80 (diff) | |
download | meson-f6a842821b64653de042633e714af3c5a5326c29.zip meson-f6a842821b64653de042633e714af3c5a5326c29.tar.gz meson-f6a842821b64653de042633e714af3c5a5326c29.tar.bz2 |
Fix python3 installed from the Windows Store
When meson is currently being run with a python that seems to have been
installed from the Windows Store, replace the general WindowsApps
directory in search paths with dirname(sys.executable), and also handle
failures with pathlib.resolve on WindowsApps exe files.
-rw-r--r-- | mesonbuild/dependencies/base.py | 15 | ||||
-rw-r--r-- | mesonbuild/interpreter.py | 15 |
2 files changed, 26 insertions, 4 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index 20dc593..2e5a5ae 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -22,6 +22,7 @@ import json import shlex import shutil import stat +import sys import textwrap import platform import typing as T @@ -1845,14 +1846,22 @@ class ExternalProgram: # Ensure that we use USERPROFILE even when inside MSYS, MSYS2, Cygwin, etc. if 'USERPROFILE' not in os.environ: return path - # Ignore executables in the WindowsApps directory which are - # zero-sized wrappers that magically open the Windows Store to - # install the application. + # The WindowsApps directory is a bit of a problem. It contains + # some zero-sized .exe files which have "reparse points", that + # might either launch an installed application, or might open + # a page in the Windows Store to download the application. + # + # To handle the case where the python interpreter we're + # running on came from the Windows Store, if we see the + # WindowsApps path in the search path, replace it with + # dirname(sys.executable). appstore_dir = Path(os.environ['USERPROFILE']) / 'AppData' / 'Local' / 'Microsoft' / 'WindowsApps' paths = [] for each in path.split(os.pathsep): if Path(each) != appstore_dir: paths.append(each) + elif 'WindowsApps' in sys.executable: + paths.append(os.path.dirname(sys.executable)) return os.pathsep.join(paths) @staticmethod diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index b8d4fec..76dbebd 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -41,6 +41,7 @@ import shutil import uuid import re import shlex +import stat import subprocess import collections import functools @@ -2512,7 +2513,19 @@ class Interpreter(InterpreterBase): elif os.path.isfile(f) and not f.startswith('/dev'): srcdir = Path(self.environment.get_source_dir()) builddir = Path(self.environment.get_build_dir()) - f = Path(f).resolve() + try: + f = Path(f).resolve() + except OSError: + f = Path(f) + s = f.stat() + if (hasattr(s, 'st_file_attributes') and + s.st_file_attributes & stat.FILE_ATTRIBUTE_REPARSE_POINT != 0 and + s.st_reparse_tag == stat.IO_REPARSE_TAG_APPEXECLINK): + # This is a Windows Store link which we can't + # resolve, so just do our best otherwise. + f = f.parent.resolve() / f.name + else: + raise if builddir in f.parents: return if srcdir in f.parents: |