Viewing file: pypy2.py (3.64 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
from __future__ import absolute_import, unicode_literals
import abc import logging import os
from six import add_metaclass
from virtualenv.create.describe import PosixSupports, WindowsSupports from virtualenv.create.via_global_ref.builtin.ref import PathRefToDest from virtualenv.util.path import Path
from ..python2.python2 import Python2 from .common import PyPy
@add_metaclass(abc.ABCMeta) class PyPy2(PyPy, Python2): """ """
@classmethod def exe_stem(cls): return "pypy"
@classmethod def sources(cls, interpreter): for src in super(PyPy2, cls).sources(interpreter): yield src # include folder needed on Python 2 as we don't have pyenv.cfg host_include_marker = cls.host_include_marker(interpreter) if host_include_marker.exists(): yield PathRefToDest(host_include_marker.parent, dest=lambda self, _: self.include)
@classmethod def needs_stdlib_py_module(cls): return True
@classmethod def host_include_marker(cls, interpreter): return Path(interpreter.system_include) / "PyPy.h"
@property def include(self): return self.dest / self.interpreter.install_path("headers")
@classmethod def modules(cls): # pypy2 uses some modules before the site.py loads, so we need to include these too return super(PyPy2, cls).modules() + [ "os", "copy_reg", "genericpath", "linecache", "stat", "UserDict", "warnings", ]
@property def lib_pypy(self): return self.dest / "lib_pypy"
def ensure_directories(self): dirs = super(PyPy2, self).ensure_directories() dirs.add(self.lib_pypy) host_include_marker = self.host_include_marker(self.interpreter) if host_include_marker.exists(): dirs.add(self.include.parent) else: logging.debug("no include folders as can't find include marker %s", host_include_marker) return dirs
@property def skip_rewrite(self): """ PyPy2 built-in imports are handled by this path entry, don't overwrite to not disable it see: https://github.com/pypa/virtualenv/issues/1652 """ return 'or path.endswith("lib_pypy{}__extensions__") # PyPy2 built-in import marker'.format(os.sep)
class PyPy2Posix(PyPy2, PosixSupports): """PyPy 2 on POSIX"""
@classmethod def modules(cls): return super(PyPy2Posix, cls).modules() + ["posixpath"]
@classmethod def _shared_libs(cls, python_dir): return python_dir.glob("libpypy*.*")
@property def lib(self): return self.dest / "lib"
@classmethod def sources(cls, interpreter): for src in super(PyPy2Posix, cls).sources(interpreter): yield src host_lib = Path(interpreter.system_prefix) / "lib" if host_lib.exists(): yield PathRefToDest(host_lib, dest=lambda self, _: self.lib)
class Pypy2Windows(PyPy2, WindowsSupports): """PyPy 2 on Windows"""
@classmethod def modules(cls): return super(Pypy2Windows, cls).modules() + ["ntpath"]
@classmethod def _shared_libs(cls, python_dir): # No glob in python2 PathLib for candidate in ["libpypy-c.dll", "libffi-7.dll", "libffi-8.dll"]: dll = python_dir / candidate if dll.exists(): yield dll
@classmethod def sources(cls, interpreter): for src in super(Pypy2Windows, cls).sources(interpreter): yield src yield PathRefToDest(Path(interpreter.system_prefix) / "libs", dest=lambda self, s: self.dest / s.name)
|