1+ import com.android.build.gradle.internal.tasks.factory.dependsOn
12import com.powersync.plugins.sonatype.setupGithubRepository
23import de.undercouch.gradle.tasks.download.Download
34import org.gradle.internal.os.OperatingSystem
45import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
56import org.jetbrains.kotlin.gradle.dsl.JvmTarget
67import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
8+ import org.jetbrains.kotlin.gradle.plugin.mpp.TestExecutable
79import org.jetbrains.kotlin.gradle.targets.jvm.tasks.KotlinJvmTest
10+ import org.jetbrains.kotlin.konan.target.Family
811
912plugins {
1013 alias(libs.plugins.kotlinMultiplatform)
@@ -74,6 +77,56 @@ val buildCInteropDef by tasks.registering {
7477 outputs.files(defFile)
7578}
7679
80+ val binariesFolder = project.layout.buildDirectory.dir(" binaries/desktop" )
81+ val downloadPowersyncDesktopBinaries by tasks.registering(Download ::class ) {
82+ val coreVersion = libs.versions.powersync.core.get()
83+ val linux_aarch64 = " https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v$coreVersion /libpowersync_aarch64.so"
84+ val linux_x64 = " https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v$coreVersion /libpowersync_x64.so"
85+ val macos_aarch64 = " https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v$coreVersion /libpowersync_aarch64.dylib"
86+ val macos_x64 = " https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v$coreVersion /libpowersync_x64.dylib"
87+ val windows_x64 = " https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v$coreVersion /powersync_x64.dll"
88+
89+ if (binariesAreProvided) {
90+ src(listOf (linux_aarch64, linux_x64, macos_aarch64, macos_x64, windows_x64))
91+ } else {
92+ val (aarch64, x64) = when {
93+ os.isLinux -> linux_aarch64 to linux_x64
94+ os.isMacOsX -> macos_aarch64 to macos_x64
95+ os.isWindows -> null to windows_x64
96+ else -> error(" Unknown operating system: $os " )
97+ }
98+ val arch = System .getProperty(" os.arch" )
99+ src(when {
100+ crossArch -> listOfNotNull(aarch64, x64)
101+ arch == " aarch64" -> listOfNotNull(aarch64)
102+ arch == " amd64" || arch == " x86_64" -> listOfNotNull(x64)
103+ else -> error(" Unsupported architecture: $arch " )
104+ })
105+ }
106+ dest(binariesFolder.map { it.dir(" powersync" ) })
107+ onlyIfModified(true )
108+ }
109+
110+ val downloadPowersyncFramework by tasks.registering(Download ::class ) {
111+ val coreVersion = libs.versions.powersync.core.get()
112+ val framework = " https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v$coreVersion /powersync-sqlite-core.xcframework.zip"
113+
114+ src(framework)
115+ dest(binariesFolder.map { it.file(" framework/powersync-sqlite-core.xcframework.zip" ) })
116+ onlyIfModified(true )
117+ }
118+
119+ val unzipPowersyncFramework by tasks.registering(Copy ::class ) {
120+ dependsOn(downloadPowersyncFramework)
121+
122+ from(
123+ zipTree(downloadPowersyncFramework.get().dest).matching {
124+ include(" powersync-sqlite-core.xcframework/**" )
125+ },
126+ )
127+ into(binariesFolder.map { it.dir(" framework" ) })
128+ }
129+
77130kotlin {
78131 androidTarget {
79132 publishLibraryVariants(" release" , " debug" )
@@ -92,7 +145,7 @@ kotlin {
92145 }
93146 }
94147
95- iosX64()
148+ // iosX64()
96149 iosArm64()
97150 iosSimulatorArm64()
98151
@@ -112,6 +165,29 @@ kotlin {
112165 }
113166 cinterops.create(" powersync-sqlite-core" )
114167 }
168+
169+ if (konanTarget.family == Family .IOS ) {
170+ binaries.withType<TestExecutable >().configureEach {
171+ linkTaskProvider.dependsOn(unzipPowersyncFramework)
172+ linkerOpts(" -framework" , " powersync-sqlite-core" )
173+
174+ val framework = if (konanTarget.name.contains(" simulator" )) {
175+ " ios-arm64_x86_64-simulator"
176+ } else {
177+ " ios-arm64"
178+ }
179+ val frameworkRoot = binariesFolder.map { it.dir(" framework/powersync-sqlite-core.xcframework/$framework " ) }.get().asFile.path
180+
181+ linkerOpts(" -F" , frameworkRoot)
182+ linkerOpts(" -rpath" , frameworkRoot)
183+ }
184+ } else {
185+ binaries.withType<TestExecutable >().configureEach {
186+ linkTaskProvider.dependsOn(downloadPowersyncDesktopBinaries)
187+ linkerOpts(" -lpowersync" )
188+ linkerOpts(" -L" , binariesFolder.map { it.dir(" powersync" ) }.get().asFile.path)
189+ }
190+ }
115191 }
116192
117193 explicitApi()
@@ -138,7 +214,6 @@ kotlin {
138214 api(libs.kermit)
139215 }
140216
141- androidMain.get()
142217 androidMain.dependencies {
143218 implementation(libs.ktor.client.okhttp)
144219 }
@@ -155,8 +230,8 @@ kotlin {
155230 commonTest.dependencies {
156231 implementation(libs.kotlin.test)
157232 implementation(libs.test.coroutines)
158- implementation(libs.kermit.test)
159233 implementation(libs.test.turbine)
234+ implementation(libs.kermit.test)
160235 }
161236 }
162237}
@@ -212,40 +287,11 @@ android {
212287val os = OperatingSystem .current()
213288val binariesAreProvided = project.findProperty(" powersync.binaries.provided" ) == " true"
214289val crossArch = project.findProperty(" powersync.binaries.cross-arch" ) == " true"
215- val binariesFolder = project.layout.buildDirectory.dir(" binaries/desktop" )
216290
217291if (binariesAreProvided && crossArch) {
218292 error(" powersync.binaries.provided and powersync.binaries.cross-arch must not be both defined." )
219293}
220294
221- val downloadPowersyncDesktopBinaries = tasks.register<Download >(" downloadPowersyncDesktopBinaries" ) {
222- val coreVersion = libs.versions.powersync.core.get()
223- val linux_aarch64 = " https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v$coreVersion /libpowersync_aarch64.so"
224- val linux_x64 = " https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v$coreVersion /libpowersync_x64.so"
225- val macos_aarch64 = " https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v$coreVersion /libpowersync_aarch64.dylib"
226- val macos_x64 = " https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v$coreVersion /libpowersync_x64.dylib"
227- val windows_x64 = " https://github.com/powersync-ja/powersync-sqlite-core/releases/download/v$coreVersion /powersync_x64.dll"
228- if (binariesAreProvided) {
229- src(listOf (linux_aarch64, linux_x64, macos_aarch64, macos_x64, windows_x64))
230- } else {
231- val (aarch64, x64) = when {
232- os.isLinux -> linux_aarch64 to linux_x64
233- os.isMacOsX -> macos_aarch64 to macos_x64
234- os.isWindows -> null to windows_x64
235- else -> error(" Unknown operating system: $os " )
236- }
237- val arch = System .getProperty(" os.arch" )
238- src(when {
239- crossArch -> listOfNotNull(aarch64, x64)
240- arch == " aarch64" -> listOfNotNull(aarch64)
241- arch == " amd64" || arch == " x86_64" -> listOfNotNull(x64)
242- else -> error(" Unsupported architecture: $arch " )
243- })
244- }
245- dest(binariesFolder.map { it.dir(" powersync" ) })
246- onlyIfModified(true )
247- }
248-
249295tasks.named<ProcessResources >(kotlin.jvm().compilations[" main" ].processResourcesTaskName) {
250296 from(downloadPowersyncDesktopBinaries)
251297}
0 commit comments