From 664b4d1e5a8b021a5b67b80d2b672304e23bf7f9 Mon Sep 17 00:00:00 2001 From: BREW <81044362+b-re-w@users.noreply.github.com> Date: Sun, 25 Oct 2026 19:47:43 +0900 Subject: [PATCH] Fix: the plugin's iOS include path is the framework's Headers (#313) The 3.15 iOS support archive ships headers only in Python.xcframework//Python.framework/Headers (3.14.7 also had /include/python3.14), so CPythonIncludeLayout pointed at a directory that no longer exists and AcquiredHeaderVersionTest failed whenever other targets were extracted. The library's iOS cinterop already used the framework Headers. --- .../multiplatform/gradle/CPythonIncludeDirectories.kt | 4 +++- .../multiplatform/gradle/CPythonIncludeDirectoriesTest.kt | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/python-multiplatform-gradle-plugin/src/main/kotlin/python/multiplatform/gradle/CPythonIncludeDirectories.kt b/python-multiplatform-gradle-plugin/src/main/kotlin/python/multiplatform/gradle/CPythonIncludeDirectories.kt index 009e09163..5b4862399 100644 --- a/python-multiplatform-gradle-plugin/src/main/kotlin/python/multiplatform/gradle/CPythonIncludeDirectories.kt +++ b/python-multiplatform-gradle-plugin/src/main/kotlin/python/multiplatform/gradle/CPythonIncludeDirectories.kt @@ -53,7 +53,9 @@ object CPythonIncludeLayout { "$dir/python/include/python$tag" } in androidTargets -> "$target/prefix/include/python$tag" - else -> "ios/Python.xcframework/$target/include/python$tag" + // The framework's own Headers, which is also what the library's iOS cinterop reads: the + // 3.15 iOS support archive no longer ships `/include/python3.15` beside it (#313). + else -> "ios/Python.xcframework/$target/Python.framework/Headers" } } diff --git a/python-multiplatform-gradle-plugin/src/test/kotlin/python/multiplatform/gradle/CPythonIncludeDirectoriesTest.kt b/python-multiplatform-gradle-plugin/src/test/kotlin/python/multiplatform/gradle/CPythonIncludeDirectoriesTest.kt index 971905c64..b7b199545 100644 --- a/python-multiplatform-gradle-plugin/src/test/kotlin/python/multiplatform/gradle/CPythonIncludeDirectoriesTest.kt +++ b/python-multiplatform-gradle-plugin/src/test/kotlin/python/multiplatform/gradle/CPythonIncludeDirectoriesTest.kt @@ -22,8 +22,13 @@ class CPythonIncludeDirectoriesTest { assertEquals("linux-x86_64-freethreaded/python/include/python3.14t", l.relativePath("linux-x86_64", CPythonFlavour.FREE_THREADED, version)) assertEquals("windows-x86_64/python/include", l.relativePath("windows-x86_64", CPythonFlavour.GIL, version)) assertEquals("windows-x86_64-freethreaded/python/include", l.relativePath("windows-x86_64", CPythonFlavour.FREE_THREADED, version)) + // #313: the 3.15 iOS archive has headers only inside the framework. + assertEquals("ios/Python.xcframework/ios-arm64/Python.framework/Headers", l.relativePath("ios-arm64", CPythonFlavour.GIL, version)) + assertEquals( + "ios/Python.xcframework/ios-arm64_x86_64-simulator/Python.framework/Headers", + l.relativePath("ios-arm64_x86_64-simulator", CPythonFlavour.GIL, version), + ) assertEquals("android-aarch64/prefix/include/python3.14", l.relativePath("android-aarch64", CPythonFlavour.GIL, version)) - assertEquals("ios/Python.xcframework/ios-arm64/include/python3.14", l.relativePath("ios-arm64", CPythonFlavour.GIL, version)) } @Test