summaryrefslogtreecommitdiff
path: root/python
diff options
context:
space:
mode:
authorOlivier Certner <olce.palemoon@certner.fr>2021-04-07 15:20:32 +0200
committerOlivier Certner <olce.palemoon@certner.fr>2021-04-07 16:12:20 +0200
commit1ec8920f0611432d2b15149a2a5a42dafe3de651 (patch)
tree1e9cd8dfbe54b154b03c1478f7da0e7bc9918af5 /python
parent69f663b244b8bc51c0143cf7c3cfbfc9bf4fcb8b (diff)
downloadaura-central-1ec8920f0611432d2b15149a2a5a42dafe3de651.tar.gz
Issue mcp-graveyard/UXP%1761 - Enable use of Tauthon instead of Python 2.7 at build
Make essential Tauthon's builtins and modules available in sandboxes, without disrupting building with Python 2.7. 1. Allow new builtins and modules. "__build_class__" is for building... new-style classes (to handle the new metaclass syntax imported from 3.x). "_oserror" is necessary because of internal changes to raise errors deriving from OSError (which are reported as IOError if not caught). 2. Look for modules and packages in the right places. This was tested on FreeBSD, and should work out of the box on Linux.
Diffstat (limited to 'python')
-rw-r--r--python/mozbuild/mozbuild/configure/__init__.py5
-rw-r--r--python/mozbuild/mozbuild/frontend/sandbox.py5
-rw-r--r--python/virtualenv/site.py24
-rwxr-xr-xpython/virtualenv/virtualenv.py12
4 files changed, 30 insertions, 16 deletions
diff --git a/python/mozbuild/mozbuild/configure/__init__.py b/python/mozbuild/mozbuild/configure/__init__.py
index 0fe640cae..a59876fca 100644
--- a/python/mozbuild/mozbuild/configure/__init__.py
+++ b/python/mozbuild/mozbuild/configure/__init__.py
@@ -192,8 +192,9 @@ class ConfigureSandbox(dict):
b: __builtins__[b]
for b in ('None', 'False', 'True', 'int', 'bool', 'any', 'all', 'len',
'list', 'tuple', 'set', 'dict', 'isinstance', 'getattr',
- 'hasattr', 'enumerate', 'range', 'zip')
- }, __import__=forbidden_import, str=unicode)
+ 'hasattr', 'enumerate', 'range', 'zip', '__build_class__')
+ if b in __builtins__},
+ __import__=forbidden_import, str=unicode)
# Expose a limited set of functions from os.path
OS = ReadOnlyNamespace(path=ReadOnlyNamespace(**{
diff --git a/python/mozbuild/mozbuild/frontend/sandbox.py b/python/mozbuild/mozbuild/frontend/sandbox.py
index 0bf1599f2..3638ec807 100644
--- a/python/mozbuild/mozbuild/frontend/sandbox.py
+++ b/python/mozbuild/mozbuild/frontend/sandbox.py
@@ -115,7 +115,10 @@ class Sandbox(dict):
def __init__(self, context, builtins=None, finder=default_finder):
"""Initialize a Sandbox ready for execution.
"""
- self._builtins = builtins or self.BUILTINS
+ self._builtins = ReadOnlyDict(
+ (builtins or self.BUILTINS).viewitems() |
+ {b: __builtins__[b] for b in ('__build_class__',)
+ if b in __builtins__}.viewitems())
dict.__setitem__(self, '__builtins__', self._builtins)
assert isinstance(self._builtins, ReadOnlyDict)
diff --git a/python/virtualenv/site.py b/python/virtualenv/site.py
index 4e426cdb6..bf23c1920 100644
--- a/python/virtualenv/site.py
+++ b/python/virtualenv/site.py
@@ -65,6 +65,7 @@ ImportError exception, it is silently ignored.
import sys
import os
+import platform
try:
import __builtin__ as builtins
@@ -85,11 +86,14 @@ USER_SITE = None
USER_BASE = None
_is_64bit = (getattr(sys, 'maxsize', None) or getattr(sys, 'maxint')) > 2**32
+_is_tauthon = platform.python_implementation() == "Tauthon"
_is_pypy = hasattr(sys, 'pypy_version_info')
_is_jython = sys.platform[:4] == 'java'
if _is_jython:
ModuleType = type(os)
+_python_libdir = "tauthon" if _is_tauthon else "python"
+
def makepath(*paths):
dir = os.path.join(*paths)
if _is_jython and (dir == '__classpath__' or
@@ -228,16 +232,16 @@ def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_pre
else: # any other Python distros on OSX work this way
sitedirs = [os.path.join(prefix, "lib",
- "python" + sys.version[:3], "site-packages")]
+ _python_libdir + sys.version[:3], "site-packages")]
elif os.sep == '/':
sitedirs = [os.path.join(prefix,
"lib",
- "python" + sys.version[:3],
+ _python_libdir + sys.version[:3],
"site-packages"),
os.path.join(prefix, "lib", "site-python"),
- os.path.join(prefix, "python" + sys.version[:3], "lib-dynload")]
- lib64_dir = os.path.join(prefix, "lib64", "python" + sys.version[:3], "site-packages")
+ os.path.join(prefix, _python_libdir + sys.version[:3], "lib-dynload")]
+ lib64_dir = os.path.join(prefix, "lib64", _python_libdir + sys.version[:3], "site-packages")
if (os.path.exists(lib64_dir) and
os.path.realpath(lib64_dir) not in [os.path.realpath(p) for p in sitedirs]):
if _is_64bit:
@@ -252,15 +256,15 @@ def addsitepackages(known_paths, sys_prefix=sys.prefix, exec_prefix=sys.exec_pre
pass
# Debian-specific dist-packages directories:
sitedirs.append(os.path.join(prefix, "local/lib",
- "python" + sys.version[:3],
+ _python_libdir + sys.version[:3],
"dist-packages"))
if sys.version[0] == '2':
sitedirs.append(os.path.join(prefix, "lib",
- "python" + sys.version[:3],
+ _python_libdir + sys.version[:3],
"dist-packages"))
else:
sitedirs.append(os.path.join(prefix, "lib",
- "python" + sys.version[0],
+ _python_libdir + sys.version[0],
"dist-packages"))
sitedirs.append(os.path.join(prefix, "lib", "dist-python"))
else:
@@ -583,9 +587,9 @@ def virtual_install_main_packages():
elif sys.platform == 'win32' and os.sep == '\\':
paths = [os.path.join(sys.real_prefix, 'Lib'), os.path.join(sys.real_prefix, 'DLLs')]
else:
- paths = [os.path.join(sys.real_prefix, 'lib', 'python'+sys.version[:3])]
+ paths = [os.path.join(sys.real_prefix, 'lib', _python_libdir + sys.version[:3])]
hardcoded_relative_dirs = paths[:] # for the special 'darwin' case below
- lib64_path = os.path.join(sys.real_prefix, 'lib64', 'python'+sys.version[:3])
+ lib64_path = os.path.join(sys.real_prefix, 'lib64', _python_libdir + sys.version[:3])
if os.path.exists(lib64_path):
if _is_64bit:
paths.insert(0, lib64_path)
@@ -602,7 +606,7 @@ def virtual_install_main_packages():
# This is a non-multiarch aware Python. Fallback to the old way.
arch = sys.platform
plat_path = os.path.join(sys.real_prefix, 'lib',
- 'python'+sys.version[:3],
+ _python_libdir + sys.version[:3],
'plat-%s' % arch)
if os.path.exists(plat_path):
paths.append(plat_path)
diff --git a/python/virtualenv/virtualenv.py b/python/virtualenv/virtualenv.py
index e363021cc..655e25cf0 100755
--- a/python/virtualenv/virtualenv.py
+++ b/python/virtualenv/virtualenv.py
@@ -44,13 +44,14 @@ if sys.version_info < (2, 6):
print('ERROR: this script requires Python 2.6 or greater.')
sys.exit(101)
+import platform
+
try:
basestring
except NameError:
basestring = str
-py_version = 'python%s.%s' % (sys.version_info[0], sys.version_info[1])
-
+is_tauthon = platform.python_implementation() == "Tauthon"
is_jython = sys.platform.startswith('java')
is_pypy = hasattr(sys, 'pypy_version_info')
is_win = (sys.platform == 'win32' and os.sep == '\\')
@@ -59,6 +60,9 @@ is_msys2 = (sys.platform == 'win32' and os.sep == '/')
is_darwin = (sys.platform == 'darwin')
abiflags = getattr(sys, 'abiflags', '')
+py_version = '%s%s.%s' % ("tauthon" if is_tauthon else "python",
+ sys.version_info[0], sys.version_info[1])
+
user_dir = os.path.expanduser('~')
if is_win:
default_storage_dir = os.path.join(user_dir, 'virtualenv')
@@ -121,7 +125,7 @@ REQUIRED_MODULES = ['os', 'posix', 'posixpath', 'nt', 'ntpath', 'genericpath',
'fnmatch', 'locale', 'encodings', 'codecs',
'stat', 'UserDict', 'readline', 'copy_reg', 'types',
're', 'sre', 'sre_parse', 'sre_constants', 'sre_compile',
- 'zlib']
+ 'zlib', 'platform', 'string']
REQUIRED_FILES = ['lib-dynload', 'config']
@@ -131,6 +135,8 @@ if majver == 2:
REQUIRED_MODULES.extend(['warnings', 'linecache', '_abcoll', 'abc'])
if minver >= 7:
REQUIRED_MODULES.extend(['_weakrefset'])
+ if is_tauthon:
+ REQUIRED_MODULES.extend(['_oserror'])
if is_msys2:
REQUIRED_MODULES.extend(['functools'])
elif majver == 3: