diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 076e39a..76418eb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -110,7 +110,7 @@ jobs: - name: Publish Linux if: matrix.os == 'ubuntu-latest' shell: bash - run: ./gradlew publishAndroidPublicationToMavenLocal publishLinuxX64PublicationToMavenLocal :jni:jvm:linux:publishJvmPublicationToMavenLocal + run: ./gradlew publishAndroidPublicationToMavenLocal publishLinuxArm64PublicationToMavenLocal publishLinuxX64PublicationToMavenLocal :jni:jvm:linux:publishJvmPublicationToMavenLocal - name: Publish Windows if: matrix.os == 'windows-latest' shell: msys2 {0} diff --git a/.github/workflows/snapshot.yml b/.github/workflows/snapshot.yml index 1605960..e2b97d9 100644 --- a/.github/workflows/snapshot.yml +++ b/.github/workflows/snapshot.yml @@ -31,6 +31,9 @@ jobs: echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules sudo udevadm control --reload-rules sudo udevadm trigger --name-match=kvm + - name: Install cross compiler + if: matrix.os == 'ubuntu-latest' + run: sudo apt install g++-aarch64-linux-gnu binutils-aarch64-linux-gnu - name: Cached Konan uses: actions/cache@v4 with: @@ -119,7 +122,7 @@ jobs: - name: Publish Linux if: matrix.os == 'ubuntu-latest' shell: bash - run: ./gradlew publishAndroidPublicationToMavenLocal publishLinuxX64PublicationToMavenLocal :jni:jvm:linux:publishJvmPublicationToMavenLocal -PsnapshotNumber=${{ github.run_number }} -PgitRef=${{ github.ref }} + run: ./gradlew publishAndroidPublicationToMavenLocal publishLinuxArm64PublicationToMavenLocal publishLinuxX64PublicationToMavenLocal :jni:jvm:linux:publishJvmPublicationToMavenLocal -PsnapshotNumber=${{ github.run_number }} -PgitRef=${{ github.ref }} - name: Publish Windows if: matrix.os == 'windows-latest' shell: msys2 {0} diff --git a/build.gradle.kts b/build.gradle.kts index 6c08c72..b711d12 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -23,7 +23,7 @@ buildscript { allprojects { group = "fr.acinq.secp256k1" - version = "0.17.1" + version = "0.17.2-SNAPSHOT" repositories { google() @@ -59,6 +59,10 @@ kotlin { secp256k1CInterop("host") } + linuxArm64 { + secp256k1CInterop("linuxArm64") + } + macosX64 { secp256k1CInterop("host") } @@ -91,9 +95,9 @@ allprojects { val currentOs = OperatingSystem.current() val targets = when { currentOs.isLinux -> listOf() - currentOs.isMacOsX -> listOf("linuxX64") - currentOs.isWindows -> listOf("linuxX64") - else -> listOf("linuxX64") + currentOs.isMacOsX -> listOf("linuxX64", "linuxArm64") + currentOs.isWindows -> listOf("linuxX64", "linuxArm64") + else -> listOf("linuxX64", "linuxArm64") }.mapNotNull { kotlin.targets.findByName(it) as? KotlinNativeTarget } configure(targets) { diff --git a/native/build.gradle.kts b/native/build.gradle.kts index c225e60..b7881d1 100644 --- a/native/build.gradle.kts +++ b/native/build.gradle.kts @@ -30,6 +30,21 @@ val buildSecp256k1Host by tasks.creating(Exec::class) { commandLine(bash, "-l", "build.sh") } +// specific build task for linux arm64, which is cross-compiled on a linux x64 host +val buildSecp256k1LinuxArm64 by tasks.creating(Exec::class) { + group = "build" + buildSecp256k1.dependsOn(this) + + val target = "linuxArm64" + + inputs.files(projectDir.resolve("build.sh")) + outputs.dir(projectDir.resolve("build/$target")) + + workingDir = projectDir + environment("TARGET", target) + commandLine(bash, "-l", "build.sh") +} + val buildSecp256k1Ios by tasks.creating(Exec::class) { group = "build" buildSecp256k1.dependsOn(this) diff --git a/native/build.sh b/native/build.sh index edfe426..7757a06 100755 --- a/native/build.sh +++ b/native/build.sh @@ -16,6 +16,9 @@ if [ "$TARGET" == "mingw" ]; then CONF_OPTS=" --host=x86_64-w64-mingw32" elif [ "$TARGET" == "linux" ]; then CFLAGS="-fPIC" +elif [ "$TARGET" == "linuxArm64" ]; then + CFLAGS="-fPIC" + CONF_OPTS="--host=aarch64-linux-gnu" elif [ "$TARGET" == "darwin" ]; then CFLAGS="-arch arm64 -arch x86_64" LDFLAGS="-arch arm64 -arch x86_64" diff --git a/publishing/secp256k1-kmp-snapshot-deploy.sh b/publishing/secp256k1-kmp-snapshot-deploy.sh index 0f3126b..4515f64 100755 --- a/publishing/secp256k1-kmp-snapshot-deploy.sh +++ b/publishing/secp256k1-kmp-snapshot-deploy.sh @@ -21,7 +21,7 @@ mvn deploy:deploy-file -DrepositoryId=ossrh -Durl=https://oss.sonatype.org/conte -Djavadoc=$ARTIFACT_ID_BASE-$VERSION-javadoc.jar popd pushd . -for i in iosarm64 iossimulatorarm64 iosx64 macosarm64 macosx64 jni-android jni-common jni-jvm-darwin jni-jvm-extract jni-jvm-linux jni-jvm-mingw jni-jvm jvm linuxx64; do +for i in iosarm64 iossimulatorarm64 iosx64 macosarm64 macosx64 jni-android jni-common jni-jvm-darwin jni-jvm-extract jni-jvm-linux jni-jvm-mingw jni-jvm jvm linuxarm64 linuxx64; do cd fr/acinq/secp256k1/secp256k1-kmp-$i/$VERSION case $i in @@ -35,7 +35,7 @@ for i in iosarm64 iossimulatorarm64 iosx64 macosarm64 macosx64 jni-android jni-c -Dsources=$ARTIFACT_ID_BASE-$i-$VERSION-sources.jar \ -Djavadoc=$ARTIFACT_ID_BASE-$i-$VERSION-javadoc.jar ;; - linuxx64) + linuxx64 | linuxarm64) mvn deploy:deploy-file -DrepositoryId=ossrh -Durl=https://oss.sonatype.org/content/repositories/snapshots/ \ -DpomFile=$ARTIFACT_ID_BASE-$i-$VERSION.pom \ -Dfile=$ARTIFACT_ID_BASE-$i-$VERSION.klib \ diff --git a/publishing/secp256k1-kmp-staging-upload.sh b/publishing/secp256k1-kmp-staging-upload.sh index 963da40..096bb09 100755 --- a/publishing/secp256k1-kmp-staging-upload.sh +++ b/publishing/secp256k1-kmp-staging-upload.sh @@ -28,7 +28,10 @@ for i in secp256k1-kmp \ secp256k1-kmp-jni-jvm-linux \ secp256k1-kmp-jni-jvm-mingw \ secp256k1-kmp-jvm \ - secp256k1-kmp-linuxx64 + secp256k1-kmp-linuxarm64 \ + secp256k1-kmp-linuxx64 \ + secp256k1-kmp-macosarm64 \ + secp256k1-kmp-macosx64 do pushd . cd release/fr/acinq/secp256k1/$i/$VERSION diff --git a/src/nativeInterop/cinterop/libsecp256k1.def b/src/nativeInterop/cinterop/libsecp256k1.def index 8d310d3..c500c9d 100644 --- a/src/nativeInterop/cinterop/libsecp256k1.def +++ b/src/nativeInterop/cinterop/libsecp256k1.def @@ -3,9 +3,13 @@ package = secp256k1 headers = secp256k1.h secp256k1_ecdh.h secp256k1_recovery.h secp256k1_extrakeys.h secp256k1_schnorrsig.h secp256k1_musig.h headerFilter = secp256k1/** secp256k1_ecdh.h secp256k1_recovery.h secp256k1_extrakeys.h secp256k1_schnorrsig.h secp256k1_musig.h secp256k1.h -staticLibraries.linux = libsecp256k1.a -libraryPaths.linux = c/secp256k1/build/linux/ native/build/linux/ native/build/darwin/ -linkerOpts.linux = -L/usr/lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/local/lib +staticLibraries.linux_x64 = libsecp256k1.a +libraryPaths.linux_x64 = c/secp256k1/build/linux/ native/build/linux/ +linkerOpts.linux_x64 = -L/usr/lib64 -L/usr/lib/x86_64-linux-gnu -L/usr/local/lib + +staticLibraries.linux_arm64 = libsecp256k1.a +libraryPaths.linux_arm64 = c/secp256k1/build/linuxArm65/ native/build/linuxArm64/ +linkerOpts.linux_arm64 = -L/usr/aarch64-linux-gnu/lib staticLibraries.macos_x64 = libsecp256k1.a libraryPaths.macos_x64 = c/secp256k1/build/darwin/ native/build/darwin/