Rust implementation of NextGraph, a Decentralized and local-first web 3.0 ecosystem
https://nextgraph.org
byzantine-fault-tolerancecrdtsdappsdecentralizede2eeeventual-consistencyjson-ldlocal-firstmarkdownocapoffline-firstp2pp2p-networkprivacy-protectionrdfrich-text-editorself-hostedsemantic-websparqlweb3collaboration
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
3.3 KiB
85 lines
3.3 KiB
import com.android.build.api.dsl.ApplicationExtension
|
|
import org.gradle.api.DefaultTask
|
|
import org.gradle.api.Plugin
|
|
import org.gradle.api.Project
|
|
import org.gradle.kotlin.dsl.configure
|
|
import org.gradle.kotlin.dsl.get
|
|
|
|
const val TASK_GROUP = "rust"
|
|
|
|
open class Config {
|
|
lateinit var rootDirRel: String
|
|
}
|
|
|
|
open class RustPlugin : Plugin<Project> {
|
|
private lateinit var config: Config
|
|
|
|
override fun apply(project: Project) = with(project) {
|
|
config = extensions.create("rust", Config::class.java)
|
|
|
|
val defaultAbiList = listOf("arm64-v8a", "armeabi-v7a", "x86", "x86_64");
|
|
val abiList = (findProperty("abiList") as? String)?.split(',') ?: defaultAbiList
|
|
|
|
val defaultArchList = listOf("arm64", "arm", "x86", "x86_64");
|
|
val archList = (findProperty("archList") as? String)?.split(',') ?: defaultArchList
|
|
|
|
val targetsList = (findProperty("targetList") as? String)?.split(',') ?: listOf("aarch64", "armv7", "i686", "x86_64")
|
|
|
|
extensions.configure<ApplicationExtension> {
|
|
@Suppress("UnstableApiUsage")
|
|
flavorDimensions.add("abi")
|
|
productFlavors {
|
|
create("universal") {
|
|
dimension = "abi"
|
|
ndk {
|
|
abiFilters += abiList
|
|
}
|
|
}
|
|
defaultArchList.forEachIndexed { index, arch ->
|
|
create(arch) {
|
|
dimension = "abi"
|
|
ndk {
|
|
abiFilters.add(defaultAbiList[index])
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
afterEvaluate {
|
|
for (profile in listOf("debug", "release")) {
|
|
val profileCapitalized = profile.replaceFirstChar { it.uppercase() }
|
|
val buildTask = tasks.maybeCreate(
|
|
"rustBuildUniversal$profileCapitalized",
|
|
DefaultTask::class.java
|
|
).apply {
|
|
group = TASK_GROUP
|
|
description = "Build dynamic library in $profile mode for all targets"
|
|
}
|
|
|
|
tasks["mergeUniversal${profileCapitalized}JniLibFolders"].dependsOn(buildTask)
|
|
|
|
for (targetPair in targetsList.withIndex()) {
|
|
val targetName = targetPair.value
|
|
val targetArch = archList[targetPair.index]
|
|
val targetArchCapitalized = targetArch.replaceFirstChar { it.uppercase() }
|
|
val targetBuildTask = project.tasks.maybeCreate(
|
|
"rustBuild$targetArchCapitalized$profileCapitalized",
|
|
BuildTask::class.java
|
|
).apply {
|
|
group = TASK_GROUP
|
|
description = "Build dynamic library in $profile mode for $targetArch"
|
|
rootDirRel = config.rootDirRel
|
|
target = targetName
|
|
release = profile == "release"
|
|
}
|
|
|
|
buildTask.dependsOn(targetBuildTask)
|
|
tasks["merge$targetArchCapitalized${profileCapitalized}JniLibFolders"].dependsOn(
|
|
targetBuildTask
|
|
)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
} |