add scripts for building rust libs
This commit is contained in:
parent
19212b14c4
commit
a30f338a39
|
@ -0,0 +1,60 @@
|
|||
#!/usr/bin/zsh
|
||||
|
||||
# put this somewhere that's often ignored by git
|
||||
output_dir=out/ndk/standalone
|
||||
|
||||
# check for NDK standalone
|
||||
[[ -d "$output_dir" ]] && echo "Standalone NDK files found!" && exit 0
|
||||
|
||||
standalone_script=$(find $ANDROID_HOME -name "*make_standalone_toolchain.py")
|
||||
|
||||
# Try to find and print some info about the NDK based on the location of the toolchain script
|
||||
if [ ! -f "$standalone_script" ]; then
|
||||
echo "NDK not found. Please make sure that ANDROID_HOME is set and the NDK has been installed there"
|
||||
else
|
||||
echo "Standalone NDK files appear to be missing.\n Attempting to install them..."
|
||||
ndk_dir=$(dirname $(dirname $(dirname $standalone_script 2>/dev/null) 2>/dev/null) 2>/dev/null)
|
||||
ndk_version=$(grep -oE "[0-9.]{5,}" /home/gmale/kg/setup/android/sdk/ndk-bundle/source.properties 2>/dev/null)
|
||||
echo " NDK version $ndk_version found at $ndk_dir"
|
||||
fi
|
||||
|
||||
echo " Installing the standalone NDK for x86|arm|arm64 into $output_dir"
|
||||
mkdir -p $output_dir
|
||||
"$standalone_script" --arch x86 --api 16 --install-dir "$output_dir/x86"
|
||||
"$standalone_script" --arch arm --api 16 --install-dir "$output_dir/arm"
|
||||
"$standalone_script" --arch arm64 --api 21 --install-dir "$output_dir/arm64"
|
||||
|
||||
# check for our generated cargo file
|
||||
generated_cargo_config=../.cargo/config
|
||||
|
||||
if [ -f "$generated_cargo_config" ]; then
|
||||
backup_config_filename="config.$(date +%s).backup"
|
||||
echo " existing config found. Backing it up from $generated_cargo_config to $(dirname $generated_cargo_config)/$backup_config_filename"
|
||||
cp $generated_cargo_config $(dirname $generated_cargo_config)/$backup_config_filename
|
||||
fi
|
||||
|
||||
echo " generating cargo config at $generated_cargo_config"
|
||||
|
||||
mkdir -p $(dirname $generated_cargo_config)
|
||||
|
||||
awk -v SA_NDK=$output_dir -v SCRIPT_DIR=$PWD 'BEGIN{
|
||||
|
||||
printf "#auto-generated by build-ndk-standalone.sh\n\n"
|
||||
|
||||
printf "[target.i686-linux-android]\n"
|
||||
printf "ar = \"%s/%s/x86/bin/i686-linux-android-ar\"\n", SCRIPT_DIR, SA_NDK
|
||||
printf "linker = \"%s/%s/x86/bin/i686-linux-android-clang\"\n\n", SCRIPT_DIR, SA_NDK
|
||||
|
||||
printf "[target.armv7-linux-androideabi]\n"
|
||||
printf "ar = \"%s/%s/arm/bin/arm-linux-androideabi-ar\"\n", SCRIPT_DIR, SA_NDK
|
||||
printf "linker = \"%s/%s/arm/bin/arm-linux-androideabi-clang\"\n\n", SCRIPT_DIR, SA_NDK
|
||||
|
||||
printf "[target.aarch64-linux-android]\n"
|
||||
printf "ar = \"%s/%s/arm64/bin/aarch64-linux-android-ar\"\n", SCRIPT_DIR, SA_NDK
|
||||
printf "linker = \"%s/%s/arm64/bin/aarch64-linux-android-clang\"\n\n", SCRIPT_DIR, SA_NDK
|
||||
|
||||
}' > $generated_cargo_config
|
||||
|
||||
echo "Done"
|
||||
|
||||
|
|
@ -1,3 +1,37 @@
|
|||
cargo build --target aarch64-linux-android --release
|
||||
cargo build --target i686-linux-android --release
|
||||
cargo build --target armv7-linux-androideabi --release
|
||||
#!/usr/bin/zsh
|
||||
|
||||
# check for cargo installation
|
||||
if ! type -p ~/.cargo/bin/cargo > /dev/null; then
|
||||
echo "Cargo appears to be missing.\nTry installing it with the following command:\n curl https://sh.rustup.rs -sSf | sh"
|
||||
echo "and then run this script again."
|
||||
exit 1
|
||||
fi
|
||||
echo "Cargo found!"
|
||||
|
||||
# check for android targets
|
||||
installed_android_target_count=$(~/.cargo/bin/rustup target list | grep android | grep installed | wc -l)
|
||||
if [ "$installed_android_target_count" -lt "3" ]; then
|
||||
echo "The android targets do not appear to be installed."
|
||||
echo "attempting to install them...\n ~/.cargo/bin/rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android"
|
||||
~/.cargo/bin/rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android
|
||||
[[ $(~/.cargo/bin/rustup target list | grep android | grep installed | wc -l) -lt 3 ]] && echo "install failed. Aborting!" && exit 1
|
||||
echo "Done."
|
||||
fi
|
||||
|
||||
echo "Android targets found!"
|
||||
|
||||
# check for standalone NDK
|
||||
./build-ndk-standalone.sh || exit 1
|
||||
|
||||
|
||||
echo "Building..."
|
||||
echo " building aarch64..."
|
||||
cargo build --target aarch64-linux-android --release || exit 10
|
||||
|
||||
echo " building i686..."
|
||||
cargo build --target i686-linux-android --release || exit 20
|
||||
|
||||
echo " building armv7..."
|
||||
cargo build --target armv7-linux-androideabi --release || exit 30
|
||||
|
||||
echo "Done."
|
||||
|
|
69
build.gradle
69
build.gradle
|
@ -1,59 +1,68 @@
|
|||
import org.jetbrains.kotlin.config.KotlinCompilerVersion
|
||||
|
||||
buildscript {
|
||||
ext.buildConfig = [
|
||||
'compileSdkVersion': 28,
|
||||
'minSdkVersion': 16,
|
||||
'targetSdkVersion': 28
|
||||
]
|
||||
ext.versions = [
|
||||
'kotlin': '1.3.0'
|
||||
]
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
dependencies {
|
||||
classpath("com.android.tools.build:gradle:3.4.0-alpha04")
|
||||
// classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.0")
|
||||
classpath(kotlin("gradle-plugin", version = "1.3.0"))
|
||||
classpath 'com.android.tools.build:gradle:3.4.0-alpha04'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${versions.kotlin}"
|
||||
classpath "com.github.ben-manes:gradle-versions-plugin:0.20.0"
|
||||
}
|
||||
}
|
||||
|
||||
apply from: 'custom-tasks.gradle'
|
||||
apply plugin: 'com.android.library'
|
||||
|
||||
repositories {
|
||||
google()
|
||||
jcenter()
|
||||
}
|
||||
|
||||
|
||||
apply(from = "custom-tasks.gradle.kts")
|
||||
|
||||
plugins {
|
||||
id("com.android.library")
|
||||
id("kotlin-android-extensions")
|
||||
id("kotlin-android")
|
||||
jcenter()
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion(28)
|
||||
compileSdkVersion 28
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion(16)
|
||||
targetSdkVersion(28)
|
||||
minSdkVersion 16
|
||||
targetSdkVersion 28
|
||||
versionCode = 1
|
||||
versionName = "1.0"
|
||||
testInstrumentationRunner = "android.support.test.runner.AndroidJUnitRunner"
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
getByName("release") {
|
||||
isMinifyEnabled = false
|
||||
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
|
||||
release {
|
||||
minifyEnabled false
|
||||
proguardFiles getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro"
|
||||
}
|
||||
}
|
||||
sourceSets {
|
||||
main {
|
||||
java {
|
||||
srcDir "build/generated/source/wire"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sourceSets["main"].java.srcDirs("build/generated/source/wire")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
api("com.squareup.wire:wire-runtime:2.2.0")
|
||||
api "com.squareup.wire:wire-runtime:2.2.0"
|
||||
|
||||
implementation(kotlin("stdlib-jdk7", KotlinCompilerVersion.VERSION))
|
||||
implementation(fileTree(mapOf("dir" to "libs", "include" to listOf("*.jar"))))
|
||||
implementation("com.android.support:appcompat-v7:28.0.0")
|
||||
testImplementation("junit:junit:4.12")
|
||||
androidTestImplementation("com.android.support.test:runner:1.0.2")
|
||||
androidTestImplementation("com.android.support.test.espresso:espresso-core:3.0.2")
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${versions.kotlin}"
|
||||
implementation "com.android.support:appcompat-v7:28.0.0"
|
||||
testImplementation "junit:junit:4.12"
|
||||
androidTestImplementation "com.android.support.test:runner:1.0.2"
|
||||
androidTestImplementation "com.android.support.test.espresso:espresso-core:3.0.2"
|
||||
}
|
||||
|
||||
|
||||
preBuild.dependsOn generateProtobufClasses
|
||||
preBuild.dependsOn generateJniLibs
|
||||
preBuild.dependsOn copyLibArmeabi
|
|
@ -1,64 +1,72 @@
|
|||
val protoSrcDir = "src/main/proto"
|
||||
val protoDestDir = "build/generated/source/wire"
|
||||
val jniSrcDir = "src/main/rust"
|
||||
val jniDestDir = "build/rust/target"
|
||||
def protoSrcDir = "src/main/proto"
|
||||
def protoDestDir = "build/generated/source/wire"
|
||||
def jniSrcDir = "src/main/rust"
|
||||
def jniDestDir = "build/rust/target"
|
||||
|
||||
|
||||
fun fileTreeWith(dir: String, vararg include: String): ConfigurableFileTree {
|
||||
return fileTree(mapOf("dir" to dir, "include" to include))
|
||||
}
|
||||
def libFile = "libzcashwalletsdk.so"
|
||||
def libX86File = "build/rust/target/i686-linux-android/release/$libFile"
|
||||
def libX86Dir = "src/main/jniLibs/x86"
|
||||
def libArm64File = "build/rust/target/aarch64-linux-android/release/$libFile"
|
||||
def libArm64Dir = "src/main/jniLibs/arm64-v8a"
|
||||
def libArmeabiFile = "build/rust/target/armv7-linux-androideabi/release/$libFile"
|
||||
def libArmeabiDir = "src/main/jniLibs/armeabi-v7a"
|
||||
|
||||
buildscript {
|
||||
dependencies {
|
||||
classpath("com.squareup.wire:wire-compiler:2.2.0")
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
val generateProtobufClasses: TaskProvider<Task> = tasks.register("generateProtobufClasses").apply {
|
||||
configure {
|
||||
doFirst {
|
||||
println("**** CREATING PROTOS ****")
|
||||
delete(protoDestDir)
|
||||
mkdir(protoDestDir)
|
||||
}
|
||||
description = "Generate Java classes from protocol buffer (.proto) schema files for use with Square's Wire library"
|
||||
|
||||
fileTreeWith(protoSrcDir, "**/*.proto").forEach { file ->
|
||||
doLast {
|
||||
javaexec {
|
||||
main = "com.squareup.wire.WireCompiler"
|
||||
classpath = buildscript.configurations.getByName("classpath")
|
||||
args = listOf("--proto_path=$protoSrcDir", "--java_out=$protoDestDir", file.path)
|
||||
}
|
||||
}
|
||||
}
|
||||
inputs.files(fileTreeWith(protoSrcDir, "**/*.proto"))
|
||||
outputs.files(fileTreeWith(protoDestDir, "**"))
|
||||
tasks.register("generateProtobufClasses").configure {
|
||||
doFirst {
|
||||
println("**** CREATING PROTOS ****")
|
||||
delete(protoDestDir)
|
||||
mkdir(protoDestDir)
|
||||
}
|
||||
}
|
||||
description = "Generate Java classes from protocol buffer (.proto) schema files for use with Square's Wire library"
|
||||
|
||||
val generateJniLibs: TaskProvider<Task> = tasks.register("generateJniLibs").apply {
|
||||
configure {
|
||||
doFirst {
|
||||
println("**** CREATING JNI LIBS ****")
|
||||
delete(jniDestDir)
|
||||
mkdir(jniDestDir)
|
||||
}
|
||||
description = "Generate *.so files for connecting to the Rust wallet logic through the JNI"
|
||||
fileTree(dir: protoSrcDir, include: '**/*.proto').each { File file ->
|
||||
doLast {
|
||||
exec {
|
||||
commandLine("./build-rust.sh")
|
||||
javaexec {
|
||||
main = "com.squareup.wire.WireCompiler"
|
||||
classpath = buildscript.configurations.classpath
|
||||
args = ["--proto_path=$protoSrcDir", "--java_out=$protoDestDir", file.path]
|
||||
}
|
||||
}
|
||||
inputs.files(fileTreeWith(jniSrcDir, "**/*"))
|
||||
outputs.files(fileTreeWith(jniDestDir, "**/*.so"))
|
||||
}
|
||||
inputs.files(fileTree(dir: protoSrcDir, include: '**/*.proto'))
|
||||
outputs.files(fileTree(dir: protoDestDir, include: '**'))
|
||||
}
|
||||
|
||||
tasks["preBuild"]!!.dependsOn(generateProtobufClasses)
|
||||
tasks["preBuild"]!!.dependsOn(generateJniLibs)
|
||||
tasks.register("generateJniLibs").configure {
|
||||
doFirst {
|
||||
println("**** CREATING JNI LIBS ****")
|
||||
delete(jniDestDir)
|
||||
mkdir(jniDestDir)
|
||||
}
|
||||
description = "Generate *.so files for connecting to the Rust wallet logic through the JNI"
|
||||
doLast {
|
||||
exec {
|
||||
commandLine("./build-rust.sh")
|
||||
}
|
||||
}
|
||||
inputs.files(fileTree(dir: jniSrcDir, include: '**/*'))
|
||||
outputs.files(fileTree(dir: jniDestDir, include: '**/*.so'))
|
||||
}
|
||||
|
||||
tasks.register("copyLibX86", Copy) {
|
||||
from libX86File
|
||||
into libX86Dir
|
||||
}
|
||||
tasks.register("copyLibArm64", Copy) {
|
||||
from libArm64File
|
||||
into libArm64Dir
|
||||
}
|
||||
tasks.register("copyLibArmeabi", Copy) {
|
||||
dependsOn copyLibArm64, copyLibX86
|
||||
from libArmeabiFile
|
||||
into libArmeabiDir
|
||||
}
|
Loading…
Reference in New Issue