This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
ScriptCraft/buildSrc/src/main/kotlin/JNIPlugin.kt

77 lines
2.2 KiB
Kotlin

import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.Delete
import org.gradle.api.tasks.Exec
import org.gradle.kotlin.dsl.*
import java.io.File
class JNIPlugin : Plugin<Project> {
open class JNIConfig(private val project: Project) {
fun addPlatform(name: String, libExtension: String) = project.run {
val cDir = File(projectDir.absolutePath, "src/main/c")
val buildDir = File(cDir, "build-${name}")
tasks.register<Exec>("cmake-${name}") {
doFirst {
if (!buildDir.exists()) {
buildDir.mkdir()
}
}
group = "jni"
workingDir(buildDir)
executable("cmake")
args("-DCMAKE_TOOLCHAIN_FILE=${projectDir.absolutePath}/cmake/${name}-toolchain.cmake", "..")
}
tasks.register<Exec>("compileJNI-${name}") {
group = "jni"
workingDir(buildDir)
executable("make")
dependsOn(tasks["cmake-${name}"])
}
tasks.named("compileJNI") {
dependsOn(tasks["compileJNI-${name}"])
}
tasks.register<Delete>("cleanJNI-${name}") {
group = "jni"
delete(buildDir)
}
tasks.named("cleanJNI") {
dependsOn(tasks["cleanJNI-${name}"])
}
tasks.named<Copy>("processResources") {
from(buildDir) {
include("*${libExtension}")
into(File("natives", name).path)
}
}
}
}
override fun apply(project: Project): Unit = project.run {
tasks.register("cleanJNI") {
group = "jni"
}
tasks.named("clean") {
dependsOn(tasks["cleanJNI"])
}
tasks.register("compileJNI") {
group = "jni"
}
tasks.named<Copy>("processResources") {
dependsOn(tasks["compileJNI"])
}
project.extensions.create<JNIConfig>("jni", project)
}
}