From eb92fccbd63b0ba64e8ea3f4cc9a467c15b1113d Mon Sep 17 00:00:00 2001 From: Fabrice Drouin Date: Tue, 12 Mar 2024 10:09:34 +0100 Subject: [PATCH] Build a universal JNI binary for macos (#106) Universal libraries embed both arm64 and x64 binaries. --- build.gradle.kts | 2 +- jni/jvm/build.sh | 1 + jni/jvm/darwin/build.gradle.kts | 6 +----- .../main/kotlin/fr/acinq/secp256k1/jni/OSInfo.kt | 3 ++- native/build.sh | 14 ++++++-------- 5 files changed, 11 insertions(+), 15 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 57eae5b..4daa485 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -22,7 +22,7 @@ buildscript { allprojects { group = "fr.acinq.secp256k1" - version = "0.15.0" + version = "0.16.0-SNAPSHOT" repositories { google() diff --git a/jni/jvm/build.sh b/jni/jvm/build.sh index 3ca84eb..519d3ec 100755 --- a/jni/jvm/build.sh +++ b/jni/jvm/build.sh @@ -17,6 +17,7 @@ if [ "$TARGET" == "linux" ]; then CC_OPTS="-fPIC" elif [ "$TARGET" == "darwin" ]; then OUTFILE=libsecp256k1-jni.dylib + CC_OPTS="-arch arm64 -arch x86_64" elif [ "$TARGET" == "mingw" ]; then OUTFILE=secp256k1-jni.dll CC=x86_64-w64-mingw32-gcc diff --git a/jni/jvm/darwin/build.gradle.kts b/jni/jvm/darwin/build.gradle.kts index 358234c..f83de58 100644 --- a/jni/jvm/darwin/build.gradle.kts +++ b/jni/jvm/darwin/build.gradle.kts @@ -12,12 +12,8 @@ dependencies { val copyJni by tasks.creating(Sync::class) { onlyIf { org.gradle.internal.os.OperatingSystem.current().isMacOsX } dependsOn(":jni:jvm:buildNativeHost") - val arch = when (System.getProperty("os.arch")) { - "aarch64" -> "aarch64" - else -> "x86_64" - } from(rootDir.resolve("jni/jvm/build/darwin/libsecp256k1-jni.dylib")) - into(buildDir.resolve("jniResources/fr/acinq/secp256k1/jni/native/darwin-$arch")) + into(buildDir.resolve("jniResources/fr/acinq/secp256k1/jni/native/darwin")) } (tasks["processResources"] as ProcessResources).apply { diff --git a/jni/jvm/src/main/kotlin/fr/acinq/secp256k1/jni/OSInfo.kt b/jni/jvm/src/main/kotlin/fr/acinq/secp256k1/jni/OSInfo.kt index 93ebe0e..b6a106e 100644 --- a/jni/jvm/src/main/kotlin/fr/acinq/secp256k1/jni/OSInfo.kt +++ b/jni/jvm/src/main/kotlin/fr/acinq/secp256k1/jni/OSInfo.kt @@ -19,7 +19,8 @@ internal object OSInfo { private const val PPC = "ppc" private const val PPC64 = "ppc64" - @JvmStatic val nativeSuffix: String get() = "$os-$arch" + // on macos we build a universal library that contains arm64 and x64 binaries + @JvmStatic val nativeSuffix: String get() = if (os == "darwin") os else "$os-$arch" @JvmStatic val os: String get() = translateOSName(System.getProperty("os.name")) diff --git a/native/build.sh b/native/build.sh index ba3194d..edfe426 100755 --- a/native/build.sh +++ b/native/build.sh @@ -12,22 +12,20 @@ cd "$(dirname "$0")" cd secp256k1 if [ "$TARGET" == "mingw" ]; then - CONF_OPTS="CFLAGS=-fPIC --host=x86_64-w64-mingw32" + CFLAGS="-fPIC" + CONF_OPTS=" --host=x86_64-w64-mingw32" elif [ "$TARGET" == "linux" ]; then - CONF_OPTS="CFLAGS=-fPIC" + CFLAGS="-fPIC" elif [ "$TARGET" == "darwin" ]; then - CONF_OPTS="" + CFLAGS="-arch arm64 -arch x86_64" + LDFLAGS="-arch arm64 -arch x86_64" else echo "Unknown TARGET=$TARGET" exit 1 fi ./autogen.sh -if [ "$TARGET" == "darwin" ]; then - CFLAGS="-arch arm64 -arch x86_64" ./configure $CONF_OPTS --enable-experimental --enable-module_ecdh --enable-module-recovery --enable-module-schnorrsig --enable-module-musig --enable-benchmark=no --enable-shared=no --enable-exhaustive-tests=no --enable-tests=no -else - ./configure $CONF_OPTS --enable-experimental --enable-module_ecdh --enable-module-recovery --enable-module-schnorrsig --enable-module-musig --enable-benchmark=no --enable-shared=no --enable-exhaustive-tests=no --enable-tests=no -fi +CFLAGS="$CFLAGS" LDFLAGS="$LDFLAGS" ./configure $CONF_OPTS --enable-experimental --enable-module_ecdh --enable-module-recovery --enable-module-schnorrsig --enable-module-musig --enable-benchmark=no --enable-shared=no --enable-exhaustive-tests=no --enable-tests=no make clean make