port(2P step 3c): stage python27.zip into the mobile sandbox
CPython opens the stdlib zip with its own stdio, so it needs a real path.
On the desktop res:// is a directory and globalize_path() is enough; in an
exported build res:// is inside the PCK, which nothing outside Godot reads.
make_stdlib_zip.py now also writes <out>.sha256
mtpython_stdlib_project copies python27.zip + .sha256 into project/
(gitignored), and both export presets' include_filter lists them, so
they enter the PCK — checked with --export-pack
extension/src/python_stdlib.{h,cpp} (Metin2Python.stdlib_path in
GDScript): reads the bytes out of the PCK, writes
user://python27.zip.part, hashes the file as written against the
shipped digest, then renames. A sandbox copy is reused only when it
matches, so a first start killed mid-copy and a zip replaced by a new
build both re-stage instead of feeding zipimport a torn file.
PythonHost::SetDefaultStdLibPath / DefaultStdLibPath() answer with that
path ($MT_PYTHON_STDLIB still wins). python_stdlib.cpp is the only unit
that knows res:// / user://; port_platform stays godot-free.
Also fixes the Windows gate, which step 3b broke: without mtpython the
MinGW build compiled UserInterface/StdAfx.h (it includes ScriptLib/StdAfx.h,
as the original PCH does). port/CMakeLists.txt excludes that header and
PythonPackModule.cpp with ScriptLib, and platform/CMakeLists.txt excludes
platform/ScriptLib/ the same way.
Not done: on-device staging. The macOS test drives the mobile path with
force_stage=true, and nothing in the app boot calls it yet — the
interpreter only starts in the process with 2V0.
gates: python_stdlib_test.gd PASS (in-place path, staging, sha256, bytes
equal res://, no .part, ZIPReader finds encodings/__init__.py, no re-copy
on a second call, corrupted copy re-staged) · macOS ctest 27/27 ·
mingw + android + ios port_platform compile clean · port_map.py check 0
errors · key leak check 8/8 none.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -198,10 +198,29 @@ add_library(mtgodot ${MT_LIB_KIND}
|
||||
src/net/m2_client.cpp
|
||||
src/proto/proto_node.cpp
|
||||
src/pack40250_node.cpp
|
||||
src/python_stdlib.cpp
|
||||
)
|
||||
target_compile_features(mtgodot PRIVATE cxx_std_20)
|
||||
target_link_libraries(mtgodot PRIVATE godot::cpp xrender::libgr2 xrender::formats mtnet mtproto port_platform)
|
||||
|
||||
# The embedded interpreter's standard library (批次 2P step 3c). python27.zip and its digest are
|
||||
# copied next to project.godot so the exporter packs them into the APK/IPA (the export presets'
|
||||
# include_filter lists them); src/python_stdlib.cpp stages them out of the PCK at runtime.
|
||||
if(TARGET mtpython_stdlib)
|
||||
target_compile_definitions(mtgodot PRIVATE MTGODOT_HAVE_PYTHON)
|
||||
# A target rather than a custom command on the two files: the command that produces them lives in
|
||||
# third_party/, and a Makefile generator only resolves a generated-file dependency inside the
|
||||
# directory that declared it. copy_if_different keeps the no-op build a compare.
|
||||
add_custom_target(mtpython_stdlib_project ALL
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
"${MT_PYTHON_STDLIB_ZIP}" "${CMAKE_SOURCE_DIR}/project/python27.zip"
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
||||
"${MT_PYTHON_STDLIB_SHA}" "${CMAKE_SOURCE_DIR}/project/python27.zip.sha256"
|
||||
COMMENT "Copying python27.zip into project/ (res://)")
|
||||
add_dependencies(mtpython_stdlib_project mtpython_stdlib)
|
||||
add_dependencies(mtgodot mtpython_stdlib_project)
|
||||
endif()
|
||||
|
||||
# Godot's .gdextension expects, per platform:
|
||||
# project/bin/libmtgodot.macos.template_{debug,release}.dylib
|
||||
# project/bin/libmtgodot.ios.template_{debug,release}.a
|
||||
|
||||
Reference in New Issue
Block a user