From 4e939c4570e30dd3ebb518ffc5e7ee4274003b44 Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Fri, 4 Sep 2026 22:50:59 +0200 Subject: [PATCH] build: bump lightning-kmp-app to bbba08b, building lightning-kmp from source lightning-kmp-app moves 6745d88 -> bbba08b, four commits: 57353cf Minor updates 9f3cd72 Build lightning-kmp from the experimental submodule via a composite build f22c30a Follow the submodule chain onto Gradle 9.7.1 bbba08b Declare the ios targets only on a mac, so the IDE can import the project 9f3cd72 is the substantive one. lightning-kmp no longer comes from maven central: the submodule now carries its own experimental/lightning-kmp submodule on branch `threshold` -- the branch with the FROST/prefractal signers -- and substitutes fr.acinq.lightning:lightning-kmp-core for that build's project. That build includes bitcoin-kmp, which includes secp256k1-kmp, which compiles the C library from a secp256k1-zkp fork. So this repo's build tree is now four levels deep and compiles native code. Cloning therefore needs `git submodule update --init --recursive`, and because each included build resolves the android SDK from its own local.properties rather than inheriting the root's, the three new nested builds each need a (gitignored) local.properties with sdk.dir. 57353cf changed two signatures that MantraApplication implements -- LightningApplication gained getApplicationContext(), and BusinessManager.initialize now takes the application rather than a Context. Neither needed a source change: MantraApplication extends android.app.Application, which already supplies getApplicationContext(), and it was already passing `this`, which satisfies the narrowed parameter type. The rest of this commit is what the update forces on the outer build. gradle-wrapper.properties, 9.3.1 -> 9.7.1: f22c30a moved every build in the chain onto 9.7.1. An included build does not use its own wrapper -- the root build's gradle version runs the whole tree -- so this repo has to follow for the chain to build at all. gradle.properties, configuration cache off: secp256k1-kmp's `:jni:generateHeaders` and `:native:buildSecp256k1` both hold gradle script object references and cannot be serialized. The configuration cache covers a whole build tree and has no per-build opt-out, so an included build's incompatibility is this build's problem. The comment records how to undo this once those tasks are fixed upstream. composeApp/build.gradle.kts, ios targets gated on the host: secp256k1-kmp declares a libsecp256k1 cinterop, which makes gradle switch off klib cross compilation for apple targets. On linux nothing in the tree then offers an ios variant of fr.acinq.phoenix:lightning-kmp-app, and the ios compilations failed with "No matching variant of project ':lightning-kmp-app:library'" -- not a warning, a build failure. The gate covers the target declarations, the iosMain dependencies (the source set only exists when the targets do) and the kspIos* configurations (likewise). This mirrors bbba08b, which applied the same gate inside the submodule for the same reason. secp256k1-frost-kmp d3b294d applies that gate there too. Substitution rules apply across a whole build tree, so that project's own lightning-kmp-core coordinate started resolving to the source project without it asking, and every apple source set stopped resolving. The android build masked it -- ios compilations are not in its task graph -- but kmpPartiallyResolvedDependenciesChecker reported it and compileAppleMainKotlinMetadata failed outright, which would have broken IDE import. Note that `:composeApp:compileCommonMainKotlinMetadata` no longer exists on a linux host. With ios gated off, androidTarget is the only declared target (jvm() is still commented out), and KMP does not generate a commonMain metadata compilation for a single-target project. `:composeApp:compileDebugKotlinAndroid` is the check now; it passes clean, with none of the resolution errors above. Co-Authored-By: Claude Opus 5 --- composeApp/build.gradle.kts | 40 +++++++++++++++++------- gradle.properties | 8 ++++- gradle/wrapper/gradle-wrapper.properties | 2 +- lightning-kmp-app | 2 +- secp256k1-frost-kmp | 2 +- 5 files changed, 38 insertions(+), 16 deletions(-) diff --git a/composeApp/build.gradle.kts b/composeApp/build.gradle.kts index d3a2975d..bb8eed65 100644 --- a/composeApp/build.gradle.kts +++ b/composeApp/build.gradle.kts @@ -25,13 +25,21 @@ kotlin { } } - listOf( - iosArm64(), - iosSimulatorArm64() - ).forEach { iosTarget -> - iosTarget.binaries.framework { - baseName = "ComposeApp" - isStatic = true + // Declared only on a mac, mirroring the gate lightning-kmp-app's :library applies to its own ios + // targets. Down the composite chain secp256k1-kmp declares a libsecp256k1 cinterop, which makes + // gradle switch off klib cross compilation for apple targets, so on a linux/windows host nothing + // in the build tree offers an ios variant of fr.acinq.phoenix:lightning-kmp-app. Declaring these + // targets anyway leaves every ios compilation unable to resolve it and fails the build outright. + // Building an ios binary needs a mac regardless. + if (org.gradle.internal.os.OperatingSystem.current().isMacOsX) { + listOf( + iosArm64(), + iosSimulatorArm64() + ).forEach { iosTarget -> + iosTarget.binaries.framework { + baseName = "ComposeApp" + isStatic = true + } } } @@ -119,8 +127,12 @@ kotlin { implementation(compose.desktop.currentOs) implementation(libs.kotlinx.coroutinesSwing) } - iosMain.dependencies { - implementation(libs.sqldelight.native.driver) + // Only exists when the ios targets above were declared; the default hierarchy template + // creates this source set from them. + if (org.gradle.internal.os.OperatingSystem.current().isMacOsX) { + iosMain.dependencies { + implementation(libs.sqldelight.native.driver) + } } } } @@ -164,9 +176,13 @@ dependencies { debugImplementation(libs.compose.uiTooling) // ksp(libs.androidx.room3.compiler) add("kspAndroid", libs.androidx.room3.compiler) - add("kspIosSimulatorArm64", libs.androidx.room3.compiler) -// add("kspIosX64", libs.androidx.room.compiler) - add("kspIosArm64", libs.androidx.room3.compiler) + // These configurations only exist when the ios targets are declared, which the kotlin block + // above does only on a mac. + if (org.gradle.internal.os.OperatingSystem.current().isMacOsX) { + add("kspIosSimulatorArm64", libs.androidx.room3.compiler) +// add("kspIosX64", libs.androidx.room.compiler) + add("kspIosArm64", libs.androidx.room3.compiler) + } // add("kspJvm", libs.androidx.room3.compiler) // Add any other platform target you use in your project, for example kspDesktop } diff --git a/gradle.properties b/gradle.properties index 9550c009..8d436de2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,7 +4,13 @@ kotlin.daemon.jvmargs=-Xmx12g #Gradle org.gradle.jvmargs=-Xmx8g -Dfile.encoding=UTF-8 -org.gradle.configuration-cache=true +# Off because the lightning-kmp-app composite build reaches, through its experimental/lightning-kmp +# -> bitcoin-kmp -> secp256k1-kmp submodule chain, two tasks that cannot be serialized: +# secp256k1-kmp's `:jni:generateHeaders` and `:native:buildSecp256k1` both hold gradle +# script object references. The configuration cache covers a whole build tree, so an included +# build's incompatibility is this build's problem -- there is no per-build opt-out. Re-enable once +# those two tasks are fixed upstream in the secp256k1-kmp fork, or if that includeBuild goes. +org.gradle.configuration-cache=false org.gradle.caching=true #Android diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 37f78a6a..c42672d9 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.7.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/lightning-kmp-app b/lightning-kmp-app index 6745d881..bbba08b1 160000 --- a/lightning-kmp-app +++ b/lightning-kmp-app @@ -1 +1 @@ -Subproject commit 6745d881d858b50f2e7108e59323c7e18a14dbcc +Subproject commit bbba08b1224631d23768b6f5b044eca2f77518b6 diff --git a/secp256k1-frost-kmp b/secp256k1-frost-kmp index e67fe177..d3b294d4 160000 --- a/secp256k1-frost-kmp +++ b/secp256k1-frost-kmp @@ -1 +1 @@ -Subproject commit e67fe177e4873dc2af8a07a57df6c85e02305a7c +Subproject commit d3b294d4c5aab519bc91c2e2008dea223ae8b5cf