add scripts for building rust libs

This commit is contained in:
Kevin Gorham 2018-11-21 02:04:53 -05:00
parent 19212b14c4
commit a30f338a39
4 changed files with 189 additions and 78 deletions

60
build-ndk-standalone.sh Executable file
View File

@ -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"

View File

@ -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."

View File

@ -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

View File

@ -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
}