From 698bf848c27f224f943085d7fb01535a080d8300 Mon Sep 17 00:00:00 2001 From: Simon Binder Date: Fri, 2 May 2025 16:12:22 +0200 Subject: [PATCH] Fix symlinks in generated XCFramework --- Package.swift | 3 ++- PowerSyncKotlin/build.gradle.kts | 28 ++++++++++++++++++++++++---- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/Package.swift b/Package.swift index 9411969a..ace85123 100644 --- a/Package.swift +++ b/Package.swift @@ -6,7 +6,8 @@ let packageName = "PowerSyncKotlin" let package = Package( name: packageName, platforms: [ - .iOS(.v13) + .iOS(.v13), + .macOS(.v10_15) ], products: [ .library( diff --git a/PowerSyncKotlin/build.gradle.kts b/PowerSyncKotlin/build.gradle.kts index 8d069221..24cb4ca3 100644 --- a/PowerSyncKotlin/build.gradle.kts +++ b/PowerSyncKotlin/build.gradle.kts @@ -1,3 +1,4 @@ +import co.touchlab.faktory.KmmBridgeExtension import co.touchlab.faktory.artifactmanager.ArtifactManager import co.touchlab.faktory.capitalized import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget @@ -107,15 +108,34 @@ class SonatypePortalPublishArtifactManager( uploadTask: TaskProvider, kmmPublishTask: TaskProvider ) { + val zipXCFramework = project.tasks.named("zipXCFramework") + zipXCFramework.configure { + // KMMBridge uses the Gradle Zip tasks to create XCFramework archives, but Gradle + // doesn't support symlinks. XCFrameworks for macOS need to use symlinks though, so we + // patch the task to generate zip files properly. + doLast { + val bridge = project.extensions.getByName("kmmbridge") + val source = project.layout.buildDirectory.map { it.dir("XCFrameworks/${bridge.buildType.get().name}") }.get().asFile + + val out = archiveFile.get().asFile + out.delete() + + providers.exec { + executable = "zip" + args("-r", "--symlinks", out.absolutePath, "PowerSyncKotlin.xcframework") + workingDir(source) + }.result.get().assertNormalExitValue() + } + } + project.extensions.getByType().publications.create( publicationName, MavenPublication::class.java, ) { this.version = version - val archiveProvider = - project.tasks.named("zipXCFramework", Zip::class.java).flatMap { - it.archiveFile - } + val archiveProvider = zipXCFramework.flatMap { + it.archiveFile + } artifact(archiveProvider) { extension = "zip" }