diff --git a/native/dockcross-linux-x64 b/cross-scripts/dockcross-linux-x64 similarity index 100% rename from native/dockcross-linux-x64 rename to cross-scripts/dockcross-linux-x64 diff --git a/native/dockcross-windows-x64 b/cross-scripts/dockcross-windows-x64 similarity index 100% rename from native/dockcross-windows-x64 rename to cross-scripts/dockcross-windows-x64 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a4b4429..186b715 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.3-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/jni/android/src/main/CMakeLists.txt b/jni/android/src/main/CMakeLists.txt index b044a0e..aca194d 100644 --- a/jni/android/src/main/CMakeLists.txt +++ b/jni/android/src/main/CMakeLists.txt @@ -1,14 +1,14 @@ cmake_minimum_required(VERSION 3.10.0) add_library( secp256k1-jni SHARED - ${CMAKE_CURRENT_LIST_DIR}/../../../../native/jni/src/org_bitcoin_Secp256k1CFunctions.c + ${CMAKE_CURRENT_LIST_DIR}/../../../c/src/org_bitcoin_Secp256k1CFunctions.c ) target_include_directories( secp256k1-jni PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../../native/secp256k1 - PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../../native/jni/headers/java + PUBLIC ${CMAKE_CURRENT_LIST_DIR}/../../../c/headers/java ) target_link_libraries( secp256k1-jni - ${CMAKE_CURRENT_LIST_DIR}/../../../../native/build/android/${ANDROID_ABI}/libsecp256k1.a + ${CMAKE_CURRENT_LIST_DIR}/../../../../native/build/android-${ANDROID_ABI}/libsecp256k1.a ) diff --git a/jni/build.gradle.kts b/jni/build.gradle.kts index da1bf8c..22b8072 100644 --- a/jni/build.gradle.kts +++ b/jni/build.gradle.kts @@ -2,6 +2,8 @@ plugins { kotlin("jvm") } +val currentOs = org.gradle.internal.os.OperatingSystem.current() + kotlin { explicitApi() } @@ -25,3 +27,46 @@ val generateJniHeaders by tasks.creating(JavaCompile::class) { delete(file("${buildDir}/generated/jni-tmp")) } } + +sealed class Cross { + abstract fun cmd(target: String, project: Project): List + class DockCross(val cross: String) : Cross() { + override fun cmd(target: String, project: Project): List = listOf("${project.rootDir}/cross-scripts/dockcross-$cross", "bash", "-c", "CROSS=1 TARGET=$target jni/build.sh") + } + class MultiArch(val crossTriple: String) : Cross() { + override fun cmd(target: String, project: Project): List { + val uid = Runtime.getRuntime().exec("id -u").inputStream.use { it.reader().readText() }.trim().toInt() + return listOf( + "docker", "run", "--rm", "-v", "${project.rootDir.absolutePath}:/workdir", + "-e", "CROSS_TRIPLE=$crossTriple", "-e", "TARGET=$target", "-e", "TO_UID=$uid", "-e", "CROSS=1", + "multiarch/crossbuild", "jni/build.sh" + ) + } + } +} + +val buildNativeJni by tasks.creating { + group = "build" +} +fun creatingBuildNativeJni(target: String, cross: Cross?) = tasks.creating(Exec::class) { + group = "build" + dependsOn(generateJniHeaders) + dependsOn(":native:buildSecp256k1${target.capitalize()}") + buildNativeJni.dependsOn(this) + + inputs.files(projectDir.resolve("build.sh")) + outputs.dir(buildDir.resolve("build/cmake/$target")) + + workingDir = rootDir + environment("TARGET", target) + commandLine((cross?.cmd(target, project) ?: emptyList()) + "jni/build.sh") +} +val buildNativeJniDarwin by creatingBuildNativeJni("darwin", if (currentOs.isMacOsX) null else Cross.MultiArch("x86_64-apple-darwin")) +val buildNativeJniLinux by creatingBuildNativeJni("linux", if (currentOs.isLinux) null else Cross.DockCross("linux-x64")) +val buildNativeJniMingw by creatingBuildNativeJni("mingw", if (currentOs.isWindows) null else Cross.DockCross("windows-x64")) + +afterEvaluate { + tasks["clean"].doLast { + delete(buildDir.resolve("build/cmake")) + } +} \ No newline at end of file diff --git a/jni/build.sh b/jni/build.sh new file mode 100755 index 0000000..a3add99 --- /dev/null +++ b/jni/build.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash +set -e + +[[ -z "$TARGET" ]] && echo "Please set the TARGET variable" && exit 1 + +if [ "$(id -u)" == "0" ]; then + [[ -z "$TO_UID" ]] && echo "Please set the TO_UID variable" && exit 1 +fi + +cd "$(dirname "$0")" + +CC=gcc +JNI_HEADERS=$TARGET + +if [ "$TARGET" == "linux" ]; then + OUTFILE=libsecp256k1-jni.so + ADD_LIB=-lgmp +elif [ "$TARGET" == "darwin" ]; then + OUTFILE=libsecp256k1-jni.dylib + if [ -z "$CROSS_TRIPLE" ]; then + ADD_LIB=-lgmp + fi +elif [ "$TARGET" == "mingw" ]; then + OUTFILE=secp256k1-jni.dll + CC=/usr/src/mxe/usr/bin/x86_64-w64-mingw32.static-gcc + JNI_HEADERS=linux + CC_OPTS="-fpic" +fi + +mkdir -p build/jni/$TARGET + +$CC -shared $CC_OPTS -o build/jni/$TARGET/$OUTFILE c/src/org_bitcoin_Secp256k1CFunctions.c -Ic/headers/ -Ic/headers/java -Ic/headers/$JNI_HEADERS/ -I../native/secp256k1/ -lsecp256k1 -L../native/build/$TARGET/ $ADD_LIB + +[[ ! -z "$TO_UID" ]] && chown -R $TO_UID:$TO_UID . + +echo "Build done for $TARGET" diff --git a/native/jni/headers/darwin/jni_md.h b/jni/c/headers/darwin/jni_md.h similarity index 100% rename from native/jni/headers/darwin/jni_md.h rename to jni/c/headers/darwin/jni_md.h diff --git a/native/jni/headers/java/org_bitcoin_Secp256k1CFunctions.h b/jni/c/headers/java/org_bitcoin_Secp256k1CFunctions.h similarity index 100% rename from native/jni/headers/java/org_bitcoin_Secp256k1CFunctions.h rename to jni/c/headers/java/org_bitcoin_Secp256k1CFunctions.h diff --git a/native/jni/headers/jni.h b/jni/c/headers/jni.h similarity index 100% rename from native/jni/headers/jni.h rename to jni/c/headers/jni.h diff --git a/native/jni/headers/linux/jni_md.h b/jni/c/headers/linux/jni_md.h similarity index 100% rename from native/jni/headers/linux/jni_md.h rename to jni/c/headers/linux/jni_md.h diff --git a/native/jni/headers/mingw/jni_md.h b/jni/c/headers/mingw/jni_md.h similarity index 100% rename from native/jni/headers/mingw/jni_md.h rename to jni/c/headers/mingw/jni_md.h diff --git a/native/jni/src/org_bitcoin_Secp256k1CFunctions.c b/jni/c/src/org_bitcoin_Secp256k1CFunctions.c similarity index 100% rename from native/jni/src/org_bitcoin_Secp256k1CFunctions.c rename to jni/c/src/org_bitcoin_Secp256k1CFunctions.c diff --git a/native/build-android.sh b/native/build-android.sh index d36522f..0b409df 100755 --- a/native/build-android.sh +++ b/native/build-android.sh @@ -41,5 +41,5 @@ make cd .. -mkdir -p build/android/$ARCH -cp -v secp256k1/.libs/libsecp256k1.a build/android/$ARCH +mkdir -p build/android-$ARCH +cp -v secp256k1/.libs/libsecp256k1.a build/android-$ARCH diff --git a/native/build.gradle.kts b/native/build.gradle.kts index 83bb75e..eed1c8a 100644 --- a/native/build.gradle.kts +++ b/native/build.gradle.kts @@ -4,29 +4,23 @@ val currentOs = org.gradle.internal.os.OperatingSystem.current() val buildSecp256k1 by tasks.creating { group = "build" } -val generateJniHeaders by tasks.creating(Sync::class) { - group = "build" - dependsOn(":jni:generateJniHeaders") - from(rootDir.resolve("jni/build/generated/jni")) - into(projectDir.resolve("jni/headers/java")) -} - sealed class Cross { - abstract fun cmd(target: String, nativeDir: File): List + abstract fun cmd(target: String, project: Project): List class DockCross(val cross: String) : Cross() { - override fun cmd(target: String, nativeDir: File): List = listOf("./dockcross-$cross", "bash", "-c", "CROSS=1 TARGET=$target ./build.sh") + override fun cmd(target: String, project: Project): List = listOf("${project.rootDir}/cross-scripts/dockcross-$cross", "bash", "-c", "CROSS=1 TARGET=$target ./build.sh") } class MultiArch(val crossTriple: String) : Cross() { - override fun cmd(target: String, nativeDir: File): List { + override fun cmd(target: String, project: Project): List { val uid = Runtime.getRuntime().exec("id -u").inputStream.use { it.reader().readText() }.trim().toInt() return listOf( - "docker", "run", "--rm", "-v", "${nativeDir.absolutePath}:/workdir", + "docker", "run", "--rm", "-v", "${project.projectDir.absolutePath}:/workdir", "-e", "CROSS_TRIPLE=$crossTriple", "-e", "TARGET=$target", "-e", "TO_UID=$uid", "-e", "CROSS=1", "multiarch/crossbuild", "./build.sh" ) } } } + val buildSecp256k1Jvm by tasks.creating { group = "build" buildSecp256k1.dependsOn(this) @@ -40,7 +34,7 @@ fun creatingBuildSecp256k1(target: String, cross: Cross?) = tasks.creating(Exec: workingDir = projectDir environment("TARGET", target) - commandLine((cross?.cmd(target, workingDir) ?: emptyList()) + "./build.sh") + commandLine((cross?.cmd(target, project) ?: emptyList()) + "./build.sh") } val buildSecp256k1Darwin by creatingBuildSecp256k1("darwin", if (currentOs.isMacOsX) null else Cross.MultiArch("x86_64-apple-darwin")) val buildSecp256k1Linux by creatingBuildSecp256k1("linux", if (currentOs.isLinux) null else Cross.DockCross("linux-x64")) diff --git a/native/build.sh b/native/build.sh index af1c7c5..f94ec8d 100755 --- a/native/build.sh +++ b/native/build.sh @@ -7,6 +7,8 @@ if [ "$(id -u)" == "0" ]; then [[ -z "$TO_UID" ]] && echo "Please set the TO_UID variable" && exit 1 fi +cd "$(dirname "$0")" + cd secp256k1 if [ "$TARGET" == "mingw" ]; then @@ -32,26 +34,4 @@ cp -v secp256k1/.libs/libsecp256k1.a build/$TARGET/ [[ ! -z "$TO_UID" ]] && chown -R $TO_UID:$TO_UID build -CC=gcc -JNI_HEADERS=$TARGET - -if [ "$TARGET" == "linux" ]; then - OUTFILE=libsecp256k1-jni.so - ADD_LIB=-lgmp -elif [ "$TARGET" == "darwin" ]; then - OUTFILE=libsecp256k1-jni.dylib - if [ -z "$CROSS_TRIPLE" ]; then - ADD_LIB=-lgmp - fi -elif [ "$TARGET" == "mingw" ]; then - OUTFILE=secp256k1-jni.dll - CC=/usr/src/mxe/usr/bin/x86_64-w64-mingw32.static-gcc - JNI_HEADERS=linux - CC_OPTS="-fpic" -fi - -$CC -shared $CC_OPTS -o build/$TARGET/$OUTFILE jni/src/org_bitcoin_Secp256k1CFunctions.c -Ijni/headers/ -Ijni/headers/java -Ijni/headers/$JNI_HEADERS/ -Isecp256k1/ -lsecp256k1 -Lbuild/$TARGET/ $ADD_LIB - -[[ ! -z "$TO_UID" ]] && chown -R $TO_UID:$TO_UID build - echo "Build done for $TARGET"