Merge branch 'efroemling:master' into master

This commit is contained in:
Loup 2024-04-19 20:29:56 +05:30 committed by GitHub
commit b4c7f61d75
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 162 additions and 256 deletions

32
.efrocachemap generated
View File

@ -4073,18 +4073,18 @@
"build/prefab/full/linux_x86_64_gui/release/ballisticakit": "fe7a68d99dcd214fcc4048a9fc7cba15", "build/prefab/full/linux_x86_64_gui/release/ballisticakit": "fe7a68d99dcd214fcc4048a9fc7cba15",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "05a85e2cf828727b74ddcea1f4e1222c", "build/prefab/full/linux_x86_64_server/debug/dist/ballisticakit_headless": "05a85e2cf828727b74ddcea1f4e1222c",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "fd52509c4df00c5a9bb755cbf108e742", "build/prefab/full/linux_x86_64_server/release/dist/ballisticakit_headless": "fd52509c4df00c5a9bb755cbf108e742",
"build/prefab/full/mac_arm64_gui/debug/ballisticakit": "79828be9e11baaf3362de73958be3794", "build/prefab/full/mac_arm64_gui/debug/ballisticakit": "5143aa1718cd2f21cb5af06ca50a9f75",
"build/prefab/full/mac_arm64_gui/release/ballisticakit": "f73e3719c67bb542fb20b133f2e149c9", "build/prefab/full/mac_arm64_gui/release/ballisticakit": "f73e3719c67bb542fb20b133f2e149c9",
"build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "3767d48fbe6de53d3f0135440c7f3e39", "build/prefab/full/mac_arm64_server/debug/dist/ballisticakit_headless": "1a7c52d06793e3789c7edf399e130517",
"build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "2f520f7c438b6ebbdeb2c9c978821a5a", "build/prefab/full/mac_arm64_server/release/dist/ballisticakit_headless": "2f520f7c438b6ebbdeb2c9c978821a5a",
"build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "a79bfbab622090643dddeec57242c841", "build/prefab/full/mac_x86_64_gui/debug/ballisticakit": "aa47af4bd4da2f41810cf9c3f3cf77f5",
"build/prefab/full/mac_x86_64_gui/release/ballisticakit": "d3b4ab3992fb65e8ba7f2f79c662cfd4", "build/prefab/full/mac_x86_64_gui/release/ballisticakit": "d3b4ab3992fb65e8ba7f2f79c662cfd4",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "f074e021a9b01b825988867915bc4fd6", "build/prefab/full/mac_x86_64_server/debug/dist/ballisticakit_headless": "60b02233d658f7c9f6cdcbb46a1b17c8",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "f73ea5e1e7e7ae9c2a396928c4aaf200", "build/prefab/full/mac_x86_64_server/release/dist/ballisticakit_headless": "f73ea5e1e7e7ae9c2a396928c4aaf200",
"build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "8f72be8b1c92aed472681d7397ba3dfd", "build/prefab/full/windows_x86_gui/debug/BallisticaKit.exe": "e52c0dcfabc211c79eef65d986497b03",
"build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "437d490133a4abbd7e2773a22c4b1011", "build/prefab/full/windows_x86_gui/release/BallisticaKit.exe": "1ebbf093c255d64bcbcf6c6d03f58251",
"build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "6c711cb996cfef26c81abd3b0cc6668d", "build/prefab/full/windows_x86_server/debug/dist/BallisticaKitHeadless.exe": "2134c1ffd3e850089359d80d3ebe7805",
"build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "eb121e0ef12b070f0303b759d352045e", "build/prefab/full/windows_x86_server/release/dist/BallisticaKitHeadless.exe": "567b99fd31ec7a48ab640465ecd32940",
"build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "d9865523059d8cf11b2bef4b9da9a8c9", "build/prefab/lib/linux_arm64_gui/debug/libballisticaplus.a": "d9865523059d8cf11b2bef4b9da9a8c9",
"build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "56d6440f62c271c4ce9ef520400395a3", "build/prefab/lib/linux_arm64_gui/release/libballisticaplus.a": "56d6440f62c271c4ce9ef520400395a3",
"build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "d9865523059d8cf11b2bef4b9da9a8c9", "build/prefab/lib/linux_arm64_server/debug/libballisticaplus.a": "d9865523059d8cf11b2bef4b9da9a8c9",
@ -4101,14 +4101,14 @@
"build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "c2cf0dc227e41a826c913d12e117c316", "build/prefab/lib/mac_x86_64_gui/release/libballisticaplus.a": "c2cf0dc227e41a826c913d12e117c316",
"build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "fbdc80e41c5883b4a893d2f0786e377f", "build/prefab/lib/mac_x86_64_server/debug/libballisticaplus.a": "fbdc80e41c5883b4a893d2f0786e377f",
"build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "c2cf0dc227e41a826c913d12e117c316", "build/prefab/lib/mac_x86_64_server/release/libballisticaplus.a": "c2cf0dc227e41a826c913d12e117c316",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "ed02958cd913246c00b9393b99e4b8b1", "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.lib": "01fef29ef22e9054eda0d2c40d29d5bf",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "8acba69e706f7d8bf4db519066f2d270", "build/prefab/lib/windows/Debug_Win32/BallisticaKitGenericPlus.pdb": "252dfe8aa1a7f3b1f6036b766d2990e6",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "8ccaa89d0f7cadd519ae6037b811050c", "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.lib": "3f26bc4ef5159ce7f488603e8e8526b3",
"build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "57221107f2d456ed50feb9783cc4fcf7", "build/prefab/lib/windows/Debug_Win32/BallisticaKitHeadlessPlus.pdb": "606c6f95bf97b9c45af0dc1e403bd91e",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "d03c90ae9b3edbea0365df3a3e9d9327", "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.lib": "c7521fdf876f28e0f8aeecfbcf5f78df",
"build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "b6e8c5a4ad43bbe9e93beeb81d43f032", "build/prefab/lib/windows/Release_Win32/BallisticaKitGenericPlus.pdb": "fbc7f8bfd808a83027974f2cf06a05b4",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "f60b6d424bf6e8685683f1d61d555b45", "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.lib": "fc2e1fd7617c26fe37bd914236635316",
"build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "fe3c1cfb547ecd9c228e5ae51e030204", "build/prefab/lib/windows/Release_Win32/BallisticaKitHeadlessPlus.pdb": "e110986966081e3d23192c57ffaf7381",
"src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c", "src/assets/ba_data/python/babase/_mgen/__init__.py": "f885fed7f2ed98ff2ba271f9dbe3391c",
"src/assets/ba_data/python/babase/_mgen/enums.py": "b611c090513a21e2fe90e56582724e9d", "src/assets/ba_data/python/babase/_mgen/enums.py": "b611c090513a21e2fe90e56582724e9d",
"src/ballistica/base/mgen/pyembed/binding_base.inc": "72bfed2cce8ff19741989dec28302f3f", "src/ballistica/base/mgen/pyembed/binding_base.inc": "72bfed2cce8ff19741989dec28302f3f",

View File

@ -13,14 +13,14 @@ from dataclasses import dataclass
from efrotools import readfile, writefile, replace_exact from efrotools import readfile, writefile, replace_exact
# Python version we build here (not necessarily same as we use in repo). # Python version we build here (not necessarily same as we use in repo).
PY_VER_ANDROID = '3.11' PY_VER_ANDROID = '3.12'
PY_VER_EXACT_ANDROID = '3.11.6' PY_VER_EXACT_ANDROID = '3.12.3'
PY_VER_APPLE = '3.11' PY_VER_APPLE = '3.12'
PY_VER_EXACT_APPLE = '3.11.5' PY_VER_EXACT_APPLE = '3.12.0'
# Can bump these up to whatever the min we need is. Though perhaps # Can bump these up to whatever the min we need is. Though perhaps
# leaving them at what the repo uses would lead to fewer build issues. # leaving them at what the repo uses would lead to fewer build issues.
VERSION_MIN_MACOS = '10.15' VERSION_MIN_MACOS = '11.0'
VERSION_MIN_IOS = '12.0' VERSION_MIN_IOS = '12.0'
VERSION_MIN_TVOS = '9.0' VERSION_MIN_TVOS = '9.0'
@ -37,24 +37,24 @@ VERSION_MIN_TVOS = '9.0'
# why-is-lldb-generating-exc-bad-instruction-with-user-compiled-library-on-macos # why-is-lldb-generating-exc-bad-instruction-with-user-compiled-library-on-macos
# #
# For now will try to ride out this 3.0 LTS version as long as possible. # For now will try to ride out this 3.0 LTS version as long as possible.
OPENSSL_VER_APPLE = '3.0.13' OPENSSL_VER_APPLE = '3.0.12-1'
OPENSSL_VER_ANDROID = '3.0.13' OPENSSL_VER_ANDROID = '3.0.13'
LIBFFI_VER_APPLE = '3.4.4' LIBFFI_VER_APPLE = '3.4.4-1'
BZIP2_VER_APPLE = '1.0.8' BZIP2_VER_APPLE = '1.0.8-1'
XZ_VER_APPLE = '5.4.4' XZ_VER_APPLE = '5.4.4-1'
# Android repo doesn't seem to be getting updated much so manually # Android repo doesn't seem to be getting updated much so manually
# bumping various versions to keep things up to date. # bumping various versions to keep things up to date.
ZLIB_VER_ANDROID = '1.3.1' ZLIB_VER_ANDROID = '1.3.1'
XZ_VER_ANDROID = '5.4.5' XZ_VER_ANDROID = '5.4.4'
BZIP2_VER_ANDROID = '1.0.8' BZIP2_VER_ANDROID = '1.0.8'
GDBM_VER_ANDROID = '1.23' GDBM_VER_ANDROID = '1.23'
LIBFFI_VER_ANDROID = '3.4.4' LIBFFI_VER_ANDROID = '3.4.6'
LIBUUID_VER_ANDROID = ('2.39', '2.39.2') LIBUUID_VER_ANDROID = ('2.39', '2.39.3')
NCURSES_VER_ANDROID = '6.4' NCURSES_VER_ANDROID = '6.4'
READLINE_VER_ANDROID = '8.2' READLINE_VER_ANDROID = '8.2'
SQLITE_VER_ANDROID = ('2023', '3440000') SQLITE_VER_ANDROID = ('2024', '3450200')
# Filenames we prune from Python lib dirs in source repo to cut down on # Filenames we prune from Python lib dirs in source repo to cut down on
# size. # size.
@ -136,7 +136,7 @@ def build_apple(arch: str, debug: bool = False) -> None:
# re-test things and probably make adjustments. Holding off for now. # re-test things and probably make adjustments. Holding off for now.
# Might just do this when I update everything to 3.12 which will be # Might just do this when I update everything to 3.12 which will be
# a bit of work anyway. # a bit of work anyway.
if bool(True): if bool(False):
subprocess.run( subprocess.run(
['git', 'checkout', 'a8c93fed2bdf0122fc2ca663faa1e46e5cf28d69'], ['git', 'checkout', 'a8c93fed2bdf0122fc2ca663faa1e46e5cf28d69'],
check=True, check=True,
@ -183,7 +183,7 @@ def build_apple(arch: str, debug: bool = False) -> None:
# Customize our minimum OS version requirements. # Customize our minimum OS version requirements.
txt = replace_exact( txt = replace_exact(
txt, txt,
'VERSION_MIN-macOS=10.15\n', 'VERSION_MIN-macOS=11.0\n',
f'VERSION_MIN-macOS={VERSION_MIN_MACOS}\n', f'VERSION_MIN-macOS={VERSION_MIN_MACOS}\n',
) )
txt = replace_exact( txt = replace_exact(
@ -198,18 +198,17 @@ def build_apple(arch: str, debug: bool = False) -> None:
) )
txt = replace_exact( txt = replace_exact(
txt, txt,
'OPENSSL_VERSION=3.1.2\n', 'OPENSSL_VERSION=3.0.12-1\n',
f'OPENSSL_VERSION={OPENSSL_VER_APPLE}\n', f'OPENSSL_VERSION={OPENSSL_VER_APPLE}\n',
) )
# Don't copy in lib-dynload; we don't make it so it errors if we try. # Don't copy in lib-dynload; we don't build it so it errors if we try.
txt = replace_exact( txt = replace_exact(
txt, txt,
'\t$$(foreach sdk,$$(SDKS-$(os)),' '\t$$(foreach sdk,$$(SDKS-$(os)),cp $$(PYTHON_STDLIB-$$(sdk))/'
'cp $$(PYTHON_FATSTDLIB-$$(sdk))/lib-dynload/*', 'lib-dynload/*',
'\t# (ericf disabled) $$(foreach sdk,$$(SDKS-$(os)),' '\t# (ericf disabled) $$(foreach sdk,$$(SDKS-$(os)),'
'cp $$(PYTHON_FATSTDLIB-$$(sdk))/lib-dynload/*', 'cp $$(PYTHON_STDLIB-$$(sdk))/lib-dynload/*',
count=1,
) )
assert '--with-pydebug' not in txt assert '--with-pydebug' not in txt
@ -237,10 +236,10 @@ def build_apple(arch: str, debug: bool = False) -> None:
count=3, count=3,
) )
txt = replace_exact( txt = replace_exact(
txt, '/config-$(PYTHON_VER)-', '/config-$(PYTHON_VER)d-', count=3 txt, '/config-$(PYTHON_VER)-', '/config-$(PYTHON_VER)d-', count=2
) )
txt = replace_exact( txt = replace_exact(
txt, '/_sysconfigdata__', '/_sysconfigdata_d_', count=6 txt, '/_sysconfigdata__', '/_sysconfigdata_d_', count=3
) )
# Rename the patch files corresponding to these as well. # Rename the patch files corresponding to these as well.
@ -289,9 +288,11 @@ def build_apple(arch: str, debug: bool = False) -> None:
[ [
'make', 'make',
'-j1', '-j1',
{'mac': 'Python-macOS', 'ios': 'Python-iOS', 'tvos': 'Python-tvOS'}[ {
arch 'mac': 'macOS',
], 'ios': 'iOS',
'tvos': 'tvOS',
}[arch],
], ],
check=True, check=True,
) )
@ -334,8 +335,8 @@ def build_android(rootdir: str, arch: str, debug: bool = False) -> None:
# TEMP - hard coding old ndk for the moment; looks like libffi needs to # TEMP - hard coding old ndk for the moment; looks like libffi needs to
# be fixed to build with it. I *think* this has already been done; we just # be fixed to build with it. I *think* this has already been done; we just
# need to wait for the official update beyond 3.4.4. # need to wait for the official update beyond 3.4.4.
print('TEMP TEMP TEMP HARD-CODING OLD NDK FOR LIBFFI BUG') # print('TEMP TEMP TEMP HARD-CODING OLD NDK FOR LIBFFI BUG')
os.environ['ANDROID_NDK'] = '/home/ubuntu/AndroidSDK/ndk/25.2.9519653' # os.environ['ANDROID_NDK'] = '/home/ubuntu/AndroidSDK/ndk/25.2.9519653'
# Disable builds for dependencies we don't use. # Disable builds for dependencies we don't use.
ftxt = readfile('Android/build_deps.py') ftxt = readfile('Android/build_deps.py')
@ -465,9 +466,11 @@ def build_android(rootdir: str, arch: str, debug: bool = False) -> None:
# Ok; let 'er rip! # Ok; let 'er rip!
exargs = ' --with-pydebug' if debug else '' exargs = ' --with-pydebug' if debug else ''
pyvershort = PY_VER_ANDROID.replace('.', '')
subprocess.run( subprocess.run(
f'ARCH={arch} ANDROID_API=23 ./build.sh{exargs} --without-ensurepip' f'ARCH={arch} ANDROID_API=23 ./build.sh{exargs} --without-ensurepip'
f' --with-build-python=/home/ubuntu/.py311/bin/python3.11', f' --with-build-python='
f'/home/ubuntu/.py{pyvershort}/bin/python{PY_VER_ANDROID}',
shell=True, shell=True,
check=True, check=True,
) )
@ -482,6 +485,7 @@ def apple_patch(python_dir: str) -> None:
def patch_modules_setup(python_dir: str, baseplatform: str) -> None: def patch_modules_setup(python_dir: str, baseplatform: str) -> None:
"""Muck with the Setup.* files Python uses to build modules.""" """Muck with the Setup.* files Python uses to build modules."""
# pylint: disable=too-many-locals # pylint: disable=too-many-locals
del baseplatform # Unused.
assert ' ' not in python_dir assert ' ' not in python_dir
@ -514,79 +518,78 @@ def patch_modules_setup(python_dir: str, baseplatform: str) -> None:
# #
# TODO(ericf): could automate a warning for at least the last part # TODO(ericf): could automate a warning for at least the last part
# of that. # of that.
cmodules = { cmodules: set[tuple[str, int]] = {
'_asyncio', ('_asyncio', 1),
'_bisect', ('_bisect', 1),
'_blake2', ('_blake2', 1),
'_codecs_cn', ('_codecs_cn', 1),
'_codecs_hk', ('_codecs_hk', 1),
'_codecs_iso2022', ('_codecs_iso2022', 1),
'_codecs_jp', ('_codecs_jp', 1),
'_codecs_kr', ('_codecs_kr', 1),
'_codecs_tw', ('_codecs_tw', 1),
'_contextvars', ('_contextvars', 1),
'_crypt', ('_crypt', 1),
'_csv', ('_csv', 1),
'_ctypes_test', ('_ctypes_test', 1),
'_curses_panel', ('_curses_panel', 1),
'_curses', ('_curses', 1),
'_datetime', ('_datetime', 1),
'_decimal', ('_decimal', 1),
'_gdbm', ('_gdbm', 1),
'_dbm', ('_dbm', 1),
'_elementtree', ('_elementtree', 1),
'_heapq', ('_heapq', 1),
'_json', ('_json', 1),
'_lsprof', ('_lsprof', 1),
'_lzma', ('_lzma', 1),
'_md5', ('_md5', 1),
'_multibytecodec', ('_multibytecodec', 1),
'_multiprocessing', ('_multiprocessing', 1),
'_opcode', ('_opcode', 1),
'_pickle', ('_pickle', 1),
'_posixsubprocess', ('_posixsubprocess', 1),
'_posixshmem', ('_posixshmem', 1),
'_queue', ('_queue', 1),
'_random', ('_random', 1),
'_sha1', ('_sha1', 1),
'_sha3', ('_sha2', 1),
'_sha256', ('_sha3', 1),
'_sha512', ('_socket', 1),
'_socket', ('_statistics', 1),
'_statistics', ('_struct', 1),
'_struct', ('_testbuffer', 1),
'_testbuffer', ('_testcapi', 1),
'_testcapi', ('_testimportmultiple', 1),
'_testimportmultiple', ('_testinternalcapi', 1),
'_testinternalcapi', ('_testmultiphase', 2),
'_testmultiphase', ('_testclinic', 1),
'_testclinic', ('_uuid', 1),
'_uuid', ('_xxsubinterpreters', 1),
'_xxsubinterpreters', ('_xxtestfuzz', 1),
'_xxtestfuzz', ('spwd', 1),
'spwd', ('_zoneinfo', 1),
'_zoneinfo', ('array', 1),
'array', ('audioop', 1),
'audioop', ('binascii', 1),
'binascii', ('cmath', 1),
'cmath', ('fcntl', 1),
'fcntl', ('grp', 1),
'grp', ('math', 1),
'math', ('_tkinter', 1),
'_tkinter', ('mmap', 1),
'mmap', ('ossaudiodev', 1),
'ossaudiodev', ('pyexpat', 1),
'pyexpat', ('resource', 1),
'resource', ('select', 1),
'select', ('nis', 1),
'nis', ('syslog', 1),
'syslog', ('termios', 1),
'termios', ('unicodedata', 1),
'unicodedata', ('xxlimited', 1),
'xxlimited', ('xxlimited_35', 1),
'xxlimited_35', ('zlib', 1),
'zlib', ('readline', 1),
'readline',
} }
# The set of modules we want statically compiled into our Python lib. # The set of modules we want statically compiled into our Python lib.
@ -613,10 +616,6 @@ def patch_modules_setup(python_dir: str, baseplatform: str) -> None:
'mmap', 'mmap',
'_csv', '_csv',
'_socket', '_socket',
'_sha1',
'_sha3',
'_sha256',
'_sha512',
'_blake2', '_blake2',
'_lzma', '_lzma',
'binascii', 'binascii',
@ -629,141 +628,48 @@ def patch_modules_setup(python_dir: str, baseplatform: str) -> None:
disable_at_end = set[str]() disable_at_end = set[str]()
for cmodule in cmodules: for cmodule, expected_instances in cmodules:
linebegin = f'@MODULE_{cmodule.upper()}_TRUE@' linebegin = f'@MODULE_{cmodule.upper()}_TRUE@'
indices = [i for i, val in enumerate(lines) if linebegin in val] indices = [i for i, val in enumerate(lines) if linebegin in val]
if len(indices) != 1: if len(indices) != expected_instances:
raise RuntimeError( raise RuntimeError(
f'Expected to find exact 1 entry for {cmodule};' f'Expected to find exactly {expected_instances}'
f' entry for {cmodule};'
f' found {len(indices)}.' f' found {len(indices)}.'
) )
line = lines[indices[0]] for index in indices:
line = lines[index]
is_enabled = not line.startswith('#') is_enabled = not line.startswith('#')
should_enable = cmodule in enables should_enable = cmodule in enables
if not should_enable: if not should_enable:
# If something is enabled but we don't want it, comment it # If something is enabled but we don't want it, comment it
# out. Also stick all disabled stuff in a *disabled* section # out. Also stick all disabled stuff in a *disabled* section
# at the bottom so it won't get built even as shared. # at the bottom so it won't get built even as shared.
if is_enabled: if is_enabled:
lines[indices[0]] = f'#{line}' lines[index] = f'#{line}'
disable_at_end.add(cmodule) disable_at_end.add(cmodule)
elif not is_enabled: elif not is_enabled:
# Ok; its enabled and shouldn't be. What to do... # Ok; its enabled and shouldn't be. What to do...
if bool(False): if bool(False):
# Uncomment the line to enable it. # Uncomment the line to enable it.
# #
# UPDATE: Seems this doesn't work; will have to figure # UPDATE: Seems this doesn't work; will have to figure
# out the right way to get things like _ctypes compiling # out the right way to get things like _ctypes compiling
# statically. # statically.
lines[indices[0]] = replace_exact( lines[index] = replace_exact(
line, f'#{linebegin}', linebegin, count=1 line, f'#{linebegin}', linebegin, count=1
) )
else: else:
# Don't support this currently. # Don't support this currently.
raise RuntimeError( raise RuntimeError(
f'UNEXPECTED is_enabled=False' f'UNEXPECTED is_enabled=False'
f' should_enable=True for {cmodule}' f' should_enable=True for {cmodule}'
) )
ftxt = '\n'.join(lines) + '\n' ftxt = '\n'.join(lines) + '\n'
# ftxt = replace_exact(
# ftxt,
# '# Some testing modules MUST be built as shared libraries.\n'
# '*shared*\n',
# '# Some testing modules MUST be built as shared libraries.\n'
# '#*static*\n',
# )
# Now for the one remaining ULTRA-HACKY bit: getting _ctypes
# building statically.
#
# It seems that as of 3.11 it is not possible to do this through
# Setup.stdlib.in like we do with our other stuff, as the line is
# commented out and we get errors if we change that. Looks like its
# not commented out anymore in 3.12 so we'll have to revisit this
# next year, but for now... hacks!
# To get this working for now we can dump an exact set of build
# flags for _ctypes into the Setup.stdlib.in. We just need to
# provide those per-platform. So, to get those:
#
# - Run 'vanilla' ios/android/etc Python builds which generate .so versions
# - Look for the flags in the compiler command lines for those .c files
# - Stuff those flags in here for the associated platform.
#
if baseplatform == 'android':
ftxt = replace_exact(
ftxt,
'#@MODULE__CTYPES_TRUE@_ctypes _ctypes/_ctypes.c'
' _ctypes/callbacks.c'
' _ctypes/callproc.c _ctypes/stgdict.c _ctypes/cfield.c\n',
'_ctypes _ctypes/_ctypes.c'
' _ctypes/callbacks.c'
' _ctypes/callproc.c _ctypes/stgdict.c _ctypes/cfield.c'
' -I$(srcdir)/Android/sysroot/usr/include'
' -L$(srcdir)/Android/sysroot/usr/lib'
' -DHAVE_FFI_PREP_CIF_VAR=1 -DHAVE_FFI_PREP_CLOSURE_LOC=1'
' -DHAVE_FFI_CLOSURE_ALLOC=1'
' -lffi'
'\n',
)
elif baseplatform == 'apple' and python_dir.split('/')[-2] == 'macosx':
ftxt = replace_exact(
ftxt,
'#@MODULE__CTYPES_TRUE@_ctypes _ctypes/_ctypes.c'
' _ctypes/callbacks.c'
' _ctypes/callproc.c _ctypes/stgdict.c _ctypes/cfield.c\n',
'_ctypes _ctypes/_ctypes.c _ctypes/callbacks.c'
' _ctypes/callproc.c _ctypes/stgdict.c _ctypes/cfield.c'
' _ctypes/malloc_closure.c'
' -I_ctypes/darwin -I/Applications/Xcode.app/Contents/Developer'
'/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/'
'usr/include/ffi'
' -DUSING_MALLOC_CLOSURE_DOT_C=1 -DMACOSX'
' -DUSING_APPLE_OS_LIBFFI=1 -DHAVE_FFI_PREP_CIF_VAR=1'
' -DHAVE_FFI_PREP_CLOSURE_LOC=1 -DHAVE_FFI_CLOSURE_ALLOC=1'
' -lffi'
'\n',
)
elif baseplatform == 'apple':
arch = python_dir.split('/')[-2]
if '.' not in arch or arch.split('.')[0] not in {
'iphoneos',
'iphonesimulator',
'appletvos',
'appletvsimulator',
}:
raise RuntimeError(
f'Unable to determine apple platform; got {arch}'
)
archbase = arch.split('.')[0]
archos = 'iOS' if 'iphone' in archbase else 'tvOS'
ftxt = replace_exact(
ftxt,
'#@MODULE__CTYPES_TRUE@_ctypes _ctypes/_ctypes.c'
' _ctypes/callbacks.c'
' _ctypes/callproc.c _ctypes/stgdict.c _ctypes/cfield.c\n',
'_ctypes _ctypes/_ctypes.c _ctypes/callbacks.c'
' _ctypes/callproc.c _ctypes/stgdict.c _ctypes/cfield.c'
' _ctypes/malloc_closure.c'
' -I_ctypes/darwin'
f' -I$(srcdir)/../../../../merge/{archos}'
f'/{archbase}/libffi-{LIBFFI_VER_APPLE}/include'
f' -L$(srcdir)/../../../../merge/{archos}'
f'/{archbase}/libffi-{LIBFFI_VER_APPLE}/lib'
' -DUSING_MALLOC_CLOSURE_DOT_C'
' -DHAVE_FFI_PREP_CIF_VAR=1'
' -DHAVE_FFI_PREP_CLOSURE_LOC=1 -DHAVE_FFI_CLOSURE_ALLOC=1'
' -lffi'
'\n',
)
else:
raise RuntimeError(f'Invalid platform {baseplatform}')
# There is one last hacky bit, which is a holdover from previous years. # There is one last hacky bit, which is a holdover from previous years.
# Seems makesetup still has a bug where *any* line containing an equals # Seems makesetup still has a bug where *any* line containing an equals
# gets interpreted as a global DEF instead of a target, which means our # gets interpreted as a global DEF instead of a target, which means our
@ -772,15 +678,15 @@ def patch_modules_setup(python_dir: str, baseplatform: str) -> None:
# To fix it we need to revert the *=* case to what it apparently used to # To fix it we need to revert the *=* case to what it apparently used to
# be: [A-Z]*=*. I wonder why this got changed and how has it not broken # be: [A-Z]*=*. I wonder why this got changed and how has it not broken
# tons of stuff? Maybe I'm missing something. # tons of stuff? Maybe I'm missing something.
fname2 = os.path.join(python_dir, 'Modules', 'makesetup') # fname2 = os.path.join(python_dir, 'Modules', 'makesetup')
ftxt2 = readfile(fname2) # ftxt2 = readfile(fname2)
ftxt2 = replace_exact( # ftxt2 = replace_exact(
ftxt2, # ftxt2,
' *=*) DEFS="$line$NL$DEFS"; continue;;', # ' *=*) DEFS="$line$NL$DEFS"; continue;;',
' [A-Z]*=*) DEFS="$line$NL$DEFS"; continue;;', # ' [A-Z]*=*) DEFS="$line$NL$DEFS"; continue;;',
) # )
assert ftxt2.count('[A-Z]*=*') == 1 # assert ftxt2.count('[A-Z]*=*') == 1
writefile(fname2, ftxt2) # writefile(fname2, ftxt2)
# Explicitly mark the remaining ones as disabled # Explicitly mark the remaining ones as disabled
# (so Python won't try to build them as dynamic libs). # (so Python won't try to build them as dynamic libs).