summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSam Gross <colesbury@gmail.com>2024-07-11 20:21:37 (GMT)
committerGitHub <noreply@github.com>2024-07-11 20:21:37 (GMT)
commite8c91d90ba8fab410a27fad4f709cc73f6ffcbf4 (patch)
tree36cb7333d35e61f7665ce16fc11c75749ed6677b /Lib
parent5250a031332eb9499d5fc190d7287642e5a144b9 (diff)
downloadcpython-e8c91d90ba8fab410a27fad4f709cc73f6ffcbf4.zip
cpython-e8c91d90ba8fab410a27fad4f709cc73f6ffcbf4.tar.gz
cpython-e8c91d90ba8fab410a27fad4f709cc73f6ffcbf4.tar.bz2
gh-121103: Put free-threaded libraries in `lib/python3.14t` (#121293)
On POSIX systems, excluding macOS framework installs, the lib directory for the free-threaded build now includes a "t" suffix to avoid conflicts with a co-located default build installation.
Diffstat (limited to 'Lib')
-rw-r--r--Lib/site.py12
-rw-r--r--Lib/sysconfig/__init__.py33
-rw-r--r--Lib/test/test_embed.py14
-rw-r--r--Lib/test/test_getpath.py1
-rw-r--r--Lib/test/test_site.py4
-rw-r--r--Lib/test/test_sysconfig.py2
-rw-r--r--Lib/test/test_venv.py5
7 files changed, 45 insertions, 26 deletions
diff --git a/Lib/site.py b/Lib/site.py
index daa56e1..4602694 100644
--- a/Lib/site.py
+++ b/Lib/site.py
@@ -312,6 +312,10 @@ def _getuserbase():
# Same to sysconfig.get_path('purelib', os.name+'_user')
def _get_path(userbase):
version = sys.version_info
+ if hasattr(sys, 'abiflags') and 't' in sys.abiflags:
+ abi_thread = 't'
+ else:
+ abi_thread = ''
implementation = _get_implementation()
implementation_lower = implementation.lower()
@@ -322,7 +326,7 @@ def _get_path(userbase):
if sys.platform == 'darwin' and sys._framework:
return f'{userbase}/lib/{implementation_lower}/site-packages'
- return f'{userbase}/lib/python{version[0]}.{version[1]}/site-packages'
+ return f'{userbase}/lib/python{version[0]}.{version[1]}{abi_thread}/site-packages'
def getuserbase():
@@ -390,6 +394,10 @@ def getsitepackages(prefixes=None):
implementation = _get_implementation().lower()
ver = sys.version_info
+ if hasattr(sys, 'abiflags') and 't' in sys.abiflags:
+ abi_thread = 't'
+ else:
+ abi_thread = ''
if os.sep == '/':
libdirs = [sys.platlibdir]
if sys.platlibdir != "lib":
@@ -397,7 +405,7 @@ def getsitepackages(prefixes=None):
for libdir in libdirs:
path = os.path.join(prefix, libdir,
- f"{implementation}{ver[0]}.{ver[1]}",
+ f"{implementation}{ver[0]}.{ver[1]}{abi_thread}",
"site-packages")
sitepackages.append(path)
else:
diff --git a/Lib/sysconfig/__init__.py b/Lib/sysconfig/__init__.py
index 98a14e5..83e057c 100644
--- a/Lib/sysconfig/__init__.py
+++ b/Lib/sysconfig/__init__.py
@@ -27,10 +27,10 @@ _ALWAYS_STR = {
_INSTALL_SCHEMES = {
'posix_prefix': {
- 'stdlib': '{installed_base}/{platlibdir}/{implementation_lower}{py_version_short}',
- 'platstdlib': '{platbase}/{platlibdir}/{implementation_lower}{py_version_short}',
- 'purelib': '{base}/lib/{implementation_lower}{py_version_short}/site-packages',
- 'platlib': '{platbase}/{platlibdir}/{implementation_lower}{py_version_short}/site-packages',
+ 'stdlib': '{installed_base}/{platlibdir}/{implementation_lower}{py_version_short}{abi_thread}',
+ 'platstdlib': '{platbase}/{platlibdir}/{implementation_lower}{py_version_short}{abi_thread}',
+ 'purelib': '{base}/lib/{implementation_lower}{py_version_short}{abi_thread}/site-packages',
+ 'platlib': '{platbase}/{platlibdir}/{implementation_lower}{py_version_short}{abi_thread}/site-packages',
'include':
'{installed_base}/include/{implementation_lower}{py_version_short}{abiflags}',
'platinclude':
@@ -77,10 +77,10 @@ _INSTALL_SCHEMES = {
# Downstream distributors who patch posix_prefix/nt scheme are encouraged to
# leave the following schemes unchanged
'posix_venv': {
- 'stdlib': '{installed_base}/{platlibdir}/{implementation_lower}{py_version_short}',
- 'platstdlib': '{platbase}/{platlibdir}/{implementation_lower}{py_version_short}',
- 'purelib': '{base}/lib/{implementation_lower}{py_version_short}/site-packages',
- 'platlib': '{platbase}/{platlibdir}/{implementation_lower}{py_version_short}/site-packages',
+ 'stdlib': '{installed_base}/{platlibdir}/{implementation_lower}{py_version_short}{abi_thread}',
+ 'platstdlib': '{platbase}/{platlibdir}/{implementation_lower}{py_version_short}{abi_thread}',
+ 'purelib': '{base}/lib/{implementation_lower}{py_version_short}{abi_thread}/site-packages',
+ 'platlib': '{platbase}/{platlibdir}/{implementation_lower}{py_version_short}{abi_thread}/site-packages',
'include':
'{installed_base}/include/{implementation_lower}{py_version_short}{abiflags}',
'platinclude':
@@ -148,11 +148,11 @@ if _HAS_USER_BASE:
'data': '{userbase}',
},
'posix_user': {
- 'stdlib': '{userbase}/{platlibdir}/{implementation_lower}{py_version_short}',
- 'platstdlib': '{userbase}/{platlibdir}/{implementation_lower}{py_version_short}',
- 'purelib': '{userbase}/lib/{implementation_lower}{py_version_short}/site-packages',
- 'platlib': '{userbase}/lib/{implementation_lower}{py_version_short}/site-packages',
- 'include': '{userbase}/include/{implementation_lower}{py_version_short}',
+ 'stdlib': '{userbase}/{platlibdir}/{implementation_lower}{py_version_short}{abi_thread}',
+ 'platstdlib': '{userbase}/{platlibdir}/{implementation_lower}{py_version_short}{abi_thread}',
+ 'purelib': '{userbase}/lib/{implementation_lower}{py_version_short}{abi_thread}/site-packages',
+ 'platlib': '{userbase}/lib/{implementation_lower}{py_version_short}{abi_thread}/site-packages',
+ 'include': '{userbase}/include/{implementation_lower}{py_version_short}{abi_thread}',
'scripts': '{userbase}/bin',
'data': '{userbase}',
},
@@ -487,6 +487,9 @@ def _init_config_vars():
# the init-function.
_CONFIG_VARS['userbase'] = _getuserbase()
+ # e.g., 't' for free-threaded or '' for default build
+ _CONFIG_VARS['abi_thread'] = 't' if _CONFIG_VARS.get('Py_GIL_DISABLED') else ''
+
# Always convert srcdir to an absolute path
srcdir = _CONFIG_VARS.get('srcdir', _PROJECT_BASE)
if os.name == 'posix':
@@ -655,6 +658,10 @@ def get_python_version():
return _PY_VERSION_SHORT
+def _get_python_version_abi():
+ return _PY_VERSION_SHORT + get_config_var("abi_thread")
+
+
def expand_makefile_vars(s, vars):
"""Expand Makefile-style variables -- "${foo}" or "$(foo)" -- in
'string' according to 'vars' (a dictionary mapping variable names to
diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
index 634513e..30dab1f 100644
--- a/Lib/test/test_embed.py
+++ b/Lib/test/test_embed.py
@@ -48,6 +48,8 @@ API_ISOLATED = 3
INIT_LOOPS = 4
MAX_HASH_SEED = 4294967295
+ABI_THREAD = 't' if sysconfig.get_config_var('Py_GIL_DISABLED') else ''
+
# If we are running from a build dir, but the stdlib has been installed,
# some tests need to expect different results.
@@ -1285,11 +1287,11 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
ver = sys.version_info
return [
os.path.join(prefix, sys.platlibdir,
- f'python{ver.major}{ver.minor}.zip'),
+ f'python{ver.major}{ver.minor}{ABI_THREAD}.zip'),
os.path.join(prefix, sys.platlibdir,
- f'python{ver.major}.{ver.minor}'),
+ f'python{ver.major}.{ver.minor}{ABI_THREAD}'),
os.path.join(exec_prefix, sys.platlibdir,
- f'python{ver.major}.{ver.minor}', 'lib-dynload'),
+ f'python{ver.major}.{ver.minor}{ABI_THREAD}', 'lib-dynload'),
]
@contextlib.contextmanager
@@ -1343,7 +1345,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
expected_paths = [paths[0], os.path.join(home, 'DLLs'), stdlib]
else:
version = f'{sys.version_info.major}.{sys.version_info.minor}'
- stdlib = os.path.join(home, sys.platlibdir, f'python{version}')
+ stdlib = os.path.join(home, sys.platlibdir, f'python{version}{ABI_THREAD}')
expected_paths = self.module_search_paths(prefix=home, exec_prefix=home)
config = {
@@ -1384,7 +1386,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
expected_paths = [paths[0], os.path.join(home, 'DLLs'), stdlib]
else:
version = f'{sys.version_info.major}.{sys.version_info.minor}'
- stdlib = os.path.join(home, sys.platlibdir, f'python{version}')
+ stdlib = os.path.join(home, sys.platlibdir, f'python{version}{ABI_THREAD}')
expected_paths = self.module_search_paths(prefix=home, exec_prefix=home)
config = {
@@ -1515,7 +1517,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
if not MS_WINDOWS:
lib_dynload = os.path.join(pyvenv_home,
sys.platlibdir,
- f'python{ver.major}.{ver.minor}',
+ f'python{ver.major}.{ver.minor}{ABI_THREAD}',
'lib-dynload')
os.makedirs(lib_dynload)
else:
diff --git a/Lib/test/test_getpath.py b/Lib/test/test_getpath.py
index 2f7aa69..6c86c3d 100644
--- a/Lib/test/test_getpath.py
+++ b/Lib/test/test_getpath.py
@@ -844,6 +844,7 @@ DEFAULT_NAMESPACE = dict(
PYDEBUGEXT="",
VERSION_MAJOR=9, # fixed version number for ease
VERSION_MINOR=8, # of testing
+ ABI_THREAD="",
PYWINVER=None,
EXE_SUFFIX=None,
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
index bcdc232..035913c 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
@@ -328,13 +328,13 @@ class HelperFunctionsTests(unittest.TestCase):
if sys.platlibdir != "lib":
self.assertEqual(len(dirs), 2)
wanted = os.path.join('xoxo', sys.platlibdir,
- 'python%d.%d' % sys.version_info[:2],
+ f'python{sysconfig._get_python_version_abi()}',
'site-packages')
self.assertEqual(dirs[0], wanted)
else:
self.assertEqual(len(dirs), 1)
wanted = os.path.join('xoxo', 'lib',
- 'python%d.%d' % sys.version_info[:2],
+ f'python{sysconfig._get_python_version_abi()}',
'site-packages')
self.assertEqual(dirs[-1], wanted)
else:
diff --git a/Lib/test/test_sysconfig.py b/Lib/test/test_sysconfig.py
index 9233304..37cee92 100644
--- a/Lib/test/test_sysconfig.py
+++ b/Lib/test/test_sysconfig.py
@@ -157,7 +157,7 @@ class TestSysConfig(unittest.TestCase):
binpath = 'bin'
incpath = 'include'
libpath = os.path.join('lib',
- 'python%d.%d' % sys.version_info[:2],
+ f'python{sysconfig._get_python_version_abi()}',
'site-packages')
# Resolve the paths in an imaginary venv/ directory
diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py
index 1769ed6..2b7d297 100644
--- a/Lib/test/test_venv.py
+++ b/Lib/test/test_venv.py
@@ -75,7 +75,7 @@ class BaseTest(unittest.TestCase):
self.include = 'Include'
else:
self.bindir = 'bin'
- self.lib = ('lib', 'python%d.%d' % sys.version_info[:2])
+ self.lib = ('lib', f'python{sysconfig._get_python_version_abi()}')
self.include = 'include'
executable = sys._base_executable
self.exe = os.path.split(executable)[-1]
@@ -593,7 +593,8 @@ class BasicTest(BaseTest):
libdir = os.path.join(non_installed_dir, platlibdir, self.lib[1])
os.makedirs(libdir)
landmark = os.path.join(libdir, "os.py")
- stdlib_zip = "python%d%d.zip" % sys.version_info[:2]
+ abi_thread = "t" if sysconfig.get_config_var("Py_GIL_DISABLED") else ""
+ stdlib_zip = f"python{sys.version_info.major}{sys.version_info.minor}{abi_thread}"
zip_landmark = os.path.join(non_installed_dir,
platlibdir,
stdlib_zip)