Skip to content

Commit ef1a93c

Browse files
committed
allow free-threading and gil builds
1 parent b60b850 commit ef1a93c

2 files changed

Lines changed: 16 additions & 6 deletions

File tree

locallibs/get.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,12 @@ def __init__(
4242
python_version=DEFAULT_PYTHON_VERSION,
4343
os_version=DEFAULT_OS_VERSION,
4444
base_url=DEFAULT_BASEURL,
45+
free_threading=False,
4546
):
4647
self.python_version = python_version
4748
self.os_version = os_version
4849
self.base_url = base_url
50+
self.free_threading = free_threading
4951
self.destination = ""
5052

5153
def __del__(self):
@@ -63,9 +65,11 @@ def download(self):
6365
base_url = self.base_url.replace('macosx', 'macos')
6466
else:
6567
base_url = self.base_url
68+
# Add 't' suffix for free-threading builds
69+
version_for_url = self.python_version + 't' if self.free_threading else self.python_version
6670
url = base_url % (
6771
self.python_version,
68-
self.python_version,
72+
version_for_url,
6973
self.os_version,
7074
)
7175
(file_handle, destination_path) = tempfile.mkstemp()
@@ -90,8 +94,8 @@ def expand(self):
9094

9195
def extract_framework(self):
9296
"""Extracts the Python framework from the expanded pkg"""
93-
# Check if this is a free-threading build (version ends with 't')
94-
if self.python_version.rstrip('0123456789.').endswith('t'):
97+
# Use PythonT_Framework for free-threading builds
98+
if self.free_threading:
9599
pkg_name = "PythonT_Framework.pkg/Payload"
96100
else:
97101
pkg_name = "Python_Framework.pkg/Payload"

make_relocatable_python_framework.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,23 +78,29 @@ def main():
7878
action="store_true",
7979
help="Do not install pip."
8080
)
81+
parser.add_option(
82+
"--free-threading",
83+
default=False,
84+
action="store_true",
85+
help="Use free-threading Python build (adds 't' suffix to version)."
86+
)
8187
parser.set_defaults(unsign=True)
8288
options, _arguments = parser.parse_args()
8389
framework_path = get.FrameworkGetter(
8490
python_version=options.python_version,
8591
os_version=options.os_version,
8692
base_url=options.baseurl,
93+
free_threading=options.free_threading,
8794
).download_and_extract(destination=options.destination)
8895

8996
if framework_path:
9097
files_relocatablized = relocatablize(framework_path)
9198
if options.unsign:
9299
fix_broken_signatures(files_relocatablized)
93-
# Extract major.minor version, preserving 't' suffix for free-threading
100+
# Extract major.minor version, adding 't' suffix for free-threading
94101
version_parts = options.python_version.split(".")
95102
short_version = ".".join(version_parts[0:2])
96-
# If the last part ends with 't', append it to short_version
97-
if version_parts[-1].endswith('t') and not short_version.endswith('t'):
103+
if options.free_threading:
98104
short_version += 't'
99105
install_extras(
100106
framework_path,

0 commit comments

Comments
 (0)