ソースツリー: packages/python
CPython を rootless 脱獄 iOS 上でセルフビルドする。
- 版: 3.14.8-1
- パッケージ構成:
python3.14: 版付きの名前のみpython3-default: 版なしのシンボリックリンク(Provides: python3、Conflicts/Replaces: python3)
Debian と同じく版付きと版なしに分ける。python3.14 は Procursus の
python3 3.9.9 と同居できる。python3-default を入れると python・python3・
pip3・pydoc3・python3-config がこちらを向き、Procursus の python3 が外れる。
idle3 と 2to3 は出さない(3.13 で lib2to3 が消え、idlelib は tkinter が要るため)。
rdepends 上 Procursus の python3 に依存する物は無く、実際に使っているのは
git の git-p4 だけで、これは新しい python3 で動く。
darwin として建てる(--build=aarch64-apple-darwin)。CPython 3.13 以降は
PEP 730 で iOS を公式にサポートしているが、App Store の制約を前提にした構成で、
プロセス生成を落とす方向に寄っている。脱獄機では subprocess が使えてこそ
意味があるため、この公式サポートは使わない。uname -m が iPhone10,1 を返すので
--build=aarch64-apple-darwin を明示する。
-target arm64-apple-ios16.0 の指定が必須。--build=...darwin と名乗ると
configure の Darwin 判定が走り、OS の版を読んで MACOSX_DEPLOYMENT_TARGET=16.7
(iOS の版)を採用する。これが環境変数として clang に渡ると iPhoneOS の sysroot を
macOS 向けに読む状態になり、可用性マクロが噛み合わず getentropy が未宣言になって
落ちる。-target を明示することで抑える。
適用するパッチは以下の3点:
Modules/posixmodule.c:systemをmayflower_systemに差し替える。Lib/urllib/request.py:_scproxy不在を許容する。Lib/subprocess.py:shell=Trueのシェルを/var/jb/bin/shに向ける。Modules/_posixsubprocess.c: shebang 直execveが Dopamine で EPERM になるので、Mach-O の/var/jb/bin/sh経由でやり直す。fishhook は使わない (iOS 16 の chained fixups で SIGSEGV する)。
_scproxy は macOS の SystemConfiguration からプロキシ設定を読むモジュールだが、
使っている定数がすべて API_UNAVAILABLE(ios) であるため Modules/Setup.local で
無効化する。
iOS SDK は宣言を出さないが libSystem にシンボルはある関数が存在する。configure は
リンクで見つけて HAVE_* を立てるが、コンパイル時に
-Werror=implicit-function-declaration で落ちるため、以下を指定して代替経路へ落とす:
ac_cv_func_getentropy=no: iOS のsys/random.hに宣言が無いため/dev/urandomへ落とす。ac_cv_func_clock_settime=no: iOS では root が要るうえ意味がないため外す。
なお、ios_compat のヘッダを -include で全体に入れてはいけない。
改名用ヘッダが <stdlib.h> を先に読むと、autoconf の古い形式の関数検出が
本物のプロトタイプを rename の前に見てしまい、wait / waitpid /
realpath / getpriority / ptsname などの一連の関数がまとめて「無い」と
判定されてしまうためである。
make install ENSUREPIP=no でインストールし、同梱の wheel を
--ignore-installed --root で手動で入れる。make install の ensurepip は
ビルドツリーの ./python(sys.prefix が /var/jb/usr)を使うため、既に
python3.14 を入れた端末で梱包し直すと Requirement already satisfied と判定され
pip が .deb に入らなくなるためである。
拡張モジュール(lib-dynload/*.so)は @rpath/... でリンクされており
dpkg -S では引けないため、依存は otool -L で辿って確認する。この追跡により
libgdbm6 と libuuid16 の依存抜けが判明し、3.14.7-2 で修正された。
gettext が入っている端末では libintl.h で _localemodule が gettext を呼ぶのに
configure の -lintl 試験は no になる。3.14.7-3 で LIBS += -lintl と
libintl8 を足した。