mirror of
https://github.com/bitsycore/compose-desktop-native.git
synced 2026-10-07 03:37:26 +00:00
Coil 3.6.2 publishes linux + apple klibs for its core/network/svg modules but NO mingwX64 anywhere, and NO desktop-native artifact at all for the compose layer. The sources are target-agnostic, so the port re-declares the targets and rebuilds them: :coil:coil-core coil3.* core (Skia-based decoding) :coil:coil the singleton ImageLoader facade :coil:coil-compose-core AsyncImage / rememberAsyncImagePainter internals :coil:coil-compose the public compose entry points :coil:coil-svg SVG decoding via skiko SVGDOM :coil:coil-network-core shared network-fetcher plumbing :coil:coil-network-ktor3 Ktor 3 fetcher, on the port's existing ktor pin Vendored VERBATIM from coil-kt/coil @ 3.6.2 (new COIL_REF pin + manifests); 152 files, zero local edits - all of it compiled unmodified. SOURCE-SET COLLAPSE: the port has no android, jvm or js target, so upstream's nonAndroidMain / nonJvmCommonMain / nonJsCommonMain all apply to every target here. They do NOT merge into nativeMain though: several declare `expect`s whose `actual`s live in upstream nativeMain, and siblings in one source set is a hard error. So they keep their own level above it. TWO PARALLEL SKIKO BRANCHES in coil-core / coil-svg / coil-compose-core: upstream's non-android code uses org.jetbrains.skia.* directly, so the INTERMEDIATE source set holding it needs skiko on its own compile classpath (a shared-metadata compilation is a real compile). macOS/Linux take the official skiko and mingwX64 takes the bitsycore fork, and the two cannot share an intermediate - so mingw gets a parallel branch over the same srcDirs, the same shape :compose:ui:ui-graphics already uses. Kotlin emits no metadata compilation for the single-target fork branch, so the two never collide. coil-compose-core declares the whole ui / foundation family DIRECTLY rather than leaning on foundation's transitives - the granular-metadata trap from CLAUDE.md's "Common pitfalls": a substituted coord's transitives drop off the commonMain metadata classpath. Published as com.bitsycore.coil3:<module>; bridge substitution rules added so consumers keep declaring the official io.coil-kt.coil3 coordinates.
91 lines
3.5 KiB
Kotlin
91 lines
3.5 KiB
Kotlin
// :coil:coil-core - coil3.* core, vendored VERBATIM from coil-kt/coil into src/vendor.
|
|
//
|
|
// Upstream publishes linux + apple klibs but NOT mingwX64, and the code is
|
|
// target-agnostic, so the port mostly just re-declares the targets.
|
|
//
|
|
// SOURCE-SET COLLAPSE: this module has no android, jvm or js target, so upstream's
|
|
// nonAndroidMain / nonJvmCommonMain / nonJsCommonMain / nativeMain all apply to every
|
|
// target here and are vendored into ONE tree (src/vendor/native). Only the
|
|
// apple-vs-rest split survives: appleMain is macosArm64, nonAppleMain is linux+mingw.
|
|
//
|
|
// SKIA: upstream's non-android decoder is skiko-based (SkiaImageDecoder), which is
|
|
// this port's renderer already. macOS/Linux take the official skiko; mingwX64 takes
|
|
// the bitsycore FORK, the same swap :compose:ui:ui-graphics makes.
|
|
//
|
|
// Provenance = compose-fork.txt + scripts/compose-fork/compose.properties. Never
|
|
// hand-edit src/vendor - change the manifest + re-run
|
|
// `python scripts/compose-fork/sync.py coil/coil-core`.
|
|
plugins {
|
|
alias(libs.plugins.kotlin.multiplatform)
|
|
}
|
|
|
|
val vHostSupportsMingw = rootProject.extra["vHostSupportsMingw"] as Boolean
|
|
|
|
kotlin {
|
|
linuxArm64(); linuxX64(); macosArm64(); if (vHostSupportsMingw) mingwX64()
|
|
applyDefaultHierarchyTemplate()
|
|
sourceSets {
|
|
commonMain {
|
|
dependencies {
|
|
api(libs.kotlinx.coroutines.core)
|
|
api(libs.okio)
|
|
}
|
|
kotlin.srcDir("src/vendor/common/kotlin")
|
|
}
|
|
// SKIKO BRANCHES. Upstream's nonAndroid files use org.jetbrains.skia.*, so the
|
|
// intermediate source set that holds them needs skiko on its own compile
|
|
// classpath (the shared-metadata compilation is a real compile). macOS/Linux
|
|
// take the OFFICIAL skiko; mingwX64 takes the bitsycore FORK - and the two
|
|
// cannot share an intermediate, so mingw gets a PARALLEL branch over the same
|
|
// srcDirs. Same shape as :compose:ui:ui-graphics.
|
|
//
|
|
// Each branch is two levels deep because upstream's nonAndroid sets declare
|
|
// `expect`s whose `actual`s live in nativeMain - siblings in one set is an error.
|
|
fun skikoBranch(inName: String, inSkiko: Any): org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet {
|
|
val vNonAndroid = create("${inName}NonAndroidMain") {
|
|
dependsOn(commonMain.get())
|
|
kotlin.srcDir("src/vendor/nonAndroid/kotlin")
|
|
dependencies { implementation(inSkiko) }
|
|
}
|
|
return create("${inName}NativeMain") {
|
|
dependsOn(vNonAndroid)
|
|
kotlin.srcDir("src/vendor/native/kotlin")
|
|
}
|
|
}
|
|
|
|
val vOfficial = skikoBranch("coilOfficial", libs.skiko)
|
|
val vAppleMain = create("coilAppleMain") {
|
|
dependsOn(vOfficial)
|
|
kotlin.srcDir("src/vendor/apple/kotlin")
|
|
}
|
|
val vLinuxMain = create("coilLinuxMain") {
|
|
dependsOn(vOfficial)
|
|
kotlin.srcDir("src/vendor/nonApple/kotlin")
|
|
}
|
|
get("macosArm64Main").dependsOn(vAppleMain)
|
|
get("linuxX64Main").dependsOn(vLinuxMain)
|
|
get("linuxArm64Main").dependsOn(vLinuxMain)
|
|
|
|
if (vHostSupportsMingw) {
|
|
val vFork = skikoBranch(
|
|
"coilFork",
|
|
"com.bitsycore.skiko:skiko:${providers.gradleProperty("skikoMingwVersion").getOrElse(libs.versions.skikoMingw.get())}",
|
|
)
|
|
val vMingwMain = create("coilMingwMain") {
|
|
dependsOn(vFork)
|
|
kotlin.srcDir("src/vendor/nonApple/kotlin")
|
|
}
|
|
get("mingwX64Main").dependsOn(vMingwMain)
|
|
}
|
|
}
|
|
compilerOptions {
|
|
freeCompilerArgs.addAll(
|
|
"-Xexpect-actual-classes",
|
|
"-opt-in=kotlinx.cinterop.ExperimentalForeignApi",
|
|
"-opt-in=coil3.annotation.InternalCoilApi",
|
|
"-opt-in=coil3.annotation.ExperimentalCoilApi",
|
|
"-opt-in=coil3.annotation.DelicateCoilApi",
|
|
)
|
|
}
|
|
}
|