From f8d2533b4874d8d24943eba36df459260b3cdb04 Mon Sep 17 00:00:00 2001 From: sergeych Date: Wed, 15 Apr 2026 23:47:38 +0300 Subject: [PATCH] Make SQLite native linker lookup portable --- lyng/build.gradle.kts | 42 ++++++++++++++++++++++++++++----- lyngio/build.gradle.kts | 52 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 82 insertions(+), 12 deletions(-) diff --git a/lyng/build.gradle.kts b/lyng/build.gradle.kts index a91245f..9afe2b2 100644 --- a/lyng/build.gradle.kts +++ b/lyng/build.gradle.kts @@ -19,11 +19,39 @@ plugins { alias(libs.plugins.kotlinMultiplatform) } +import org.gradle.api.Project import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeTest group = "net.sergeych" version = "unspecified" +private fun Project.sqliteLinuxLinkerOpts(vararg defaultDirs: String): List { + val overrideDir = providers.gradleProperty("sqlite3.lib.dir").orNull + ?: providers.environmentVariable("SQLITE3_LIB_DIR").orNull + val candidateDirs = buildList { + if (!overrideDir.isNullOrBlank()) { + add(file(overrideDir)) + } + defaultDirs.forEach { add(file(it)) } + }.distinctBy { it.absolutePath } + + val discoveredLib = sequenceOf("libsqlite3.so", "libsqlite3.so.0") + .mapNotNull { libraryName -> + candidateDirs.firstOrNull { it.resolve(libraryName).isFile }?.let { dir -> + listOf("-L${dir.absolutePath}", "-l:$libraryName") + } + } + .firstOrNull() + ?: listOf("-lsqlite3") + + return discoveredLib + listOf( + "-ldl", + "-lpthread", + "-lm", + "-Wl,--allow-shlib-undefined" + ) +} + repositories { mavenCentral() maven("https://maven.universablockchain.com/") @@ -56,12 +84,14 @@ kotlin { executable() all { linkerOpts( - "-L/lib/x86_64-linux-gnu", - "-l:libsqlite3.so.0", - "-ldl", - "-lpthread", - "-lm", - "-Wl,--allow-shlib-undefined" + *project.sqliteLinuxLinkerOpts( + "/lib/x86_64-linux-gnu", + "/usr/lib/x86_64-linux-gnu", + "/lib64", + "/usr/lib64", + "/lib", + "/usr/lib" + ).toTypedArray() ) if (buildType == org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType.RELEASE) { debuggable = false diff --git a/lyngio/build.gradle.kts b/lyngio/build.gradle.kts index 76f8155..e57216a 100644 --- a/lyngio/build.gradle.kts +++ b/lyngio/build.gradle.kts @@ -19,6 +19,7 @@ * LyngIO: Compose Multiplatform library module depending on :lynglib */ +import org.gradle.api.Project import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget @@ -31,6 +32,33 @@ plugins { group = "net.sergeych" version = "0.0.1-SNAPSHOT" +private fun Project.sqliteLinuxLinkerOpts(vararg defaultDirs: String): List { + val overrideDir = providers.gradleProperty("sqlite3.lib.dir").orNull + ?: providers.environmentVariable("SQLITE3_LIB_DIR").orNull + val candidateDirs = buildList { + if (!overrideDir.isNullOrBlank()) { + add(file(overrideDir)) + } + defaultDirs.forEach { add(file(it)) } + }.distinctBy { it.absolutePath } + + val discoveredLib = sequenceOf("libsqlite3.so", "libsqlite3.so.0") + .mapNotNull { libraryName -> + candidateDirs.firstOrNull { it.resolve(libraryName).isFile }?.let { dir -> + listOf("-L${dir.absolutePath}", "-l:$libraryName") + } + } + .firstOrNull() + ?: listOf("-lsqlite3") + + return discoveredLib + listOf( + "-ldl", + "-lpthread", + "-lm", + "-Wl,--allow-shlib-undefined" + ) +} + kotlin { jvmToolchain(17) jvm() @@ -67,12 +95,24 @@ kotlin { binaries.all { when (konanTarget.name) { "linux_x64" -> linkerOpts( - "-L/lib/x86_64-linux-gnu", - "-l:libsqlite3.so.0", - "-ldl", - "-lpthread", - "-lm", - "-Wl,--allow-shlib-undefined" + *project.sqliteLinuxLinkerOpts( + "/lib/x86_64-linux-gnu", + "/usr/lib/x86_64-linux-gnu", + "/lib64", + "/usr/lib64", + "/lib", + "/usr/lib" + ).toTypedArray() + ) + "linux_arm64" -> linkerOpts( + *project.sqliteLinuxLinkerOpts( + "/lib/aarch64-linux-gnu", + "/usr/lib/aarch64-linux-gnu", + "/lib64", + "/usr/lib64", + "/lib", + "/usr/lib" + ).toTypedArray() ) else -> linkerOpts("-lsqlite3") }