From 9f68375dc6bf7673155d5e8d2917df139d21a558 Mon Sep 17 00:00:00 2001 From: TheBrokenRail Date: Tue, 26 May 2020 15:48:44 -0400 Subject: [PATCH] Improve Gradle Plugins --- build.gradle.kts | 17 ++- buildSrc/build.gradle.kts | 13 ++ buildSrc/src/main/kotlin/JNIPlugin.kt | 77 +++++++++++ buildSrc/src/main/kotlin/TypeScriptPlugin.kt | 122 ++++++++++++++++++ buildSrc/src/main/kotlin/jni.gradle.kts | 83 ------------ .../src/main/kotlin/typescript.gradle.kts | 101 --------------- 6 files changed, 225 insertions(+), 188 deletions(-) create mode 100644 buildSrc/src/main/kotlin/JNIPlugin.kt create mode 100644 buildSrc/src/main/kotlin/TypeScriptPlugin.kt delete mode 100644 buildSrc/src/main/kotlin/jni.gradle.kts delete mode 100644 buildSrc/src/main/kotlin/typescript.gradle.kts diff --git a/build.gradle.kts b/build.gradle.kts index 0e3beb5..5387fa3 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -19,10 +19,19 @@ dependencies { modImplementation("net.fabricmc.fabric-api:fabric-api:${project.property("fabric_api_version")}") } +jni { + addPlatform("linux-x86_64", ".so") + addPlatform("linux-x86", ".so") + addPlatform("linux-armhf", ".so") + addPlatform("linux-arm64", ".so") + addPlatform("windows-x86_64", ".dll") + addPlatform("windows-x86", ".dll") +} + tasks.register("eslint") { group = "verification" - workingDir(project.extra.get("typescriptRoot") as File) + workingDir(typescript.root) executable("npm") @@ -34,12 +43,12 @@ tasks.register("eslint") { tasks.register("typedoc") { group = "documentation" - val typedocOut = File(project.extra.get("typescriptRoot") as File, "build/typedoc") + val typedocOut = File(typescript.root, "build/typedoc") - inputs.dir(project.extra.get("typescriptRoot") as File) + inputs.dir(typescript.root) outputs.dir(typedocOut) - workingDir(project.extra.get("typescriptRoot") as File) + workingDir(typescript.root) executable("npm") diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index f01e2c3..e432480 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -4,4 +4,17 @@ repositories { plugins { `kotlin-dsl` +} + +gradlePlugin { + plugins { + register("jni-plugin") { + id = "jni" + implementationClass = "JNIPlugin" + } + register("typescript-plugin") { + id = "typescript" + implementationClass = "TypeScriptPlugin" + } + } } \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/JNIPlugin.kt b/buildSrc/src/main/kotlin/JNIPlugin.kt new file mode 100644 index 0000000..0bf47d8 --- /dev/null +++ b/buildSrc/src/main/kotlin/JNIPlugin.kt @@ -0,0 +1,77 @@ +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 { + 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("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("compileJNI-${name}") { + group = "jni" + workingDir(buildDir) + + executable("make") + + dependsOn(tasks["cmake-${name}"]) + } + + tasks.named("compileJNI") { + dependsOn(tasks["compileJNI-${name}"]) + } + + tasks.register("cleanJNI-${name}") { + group = "jni" + delete(buildDir) + } + + tasks.named("cleanJNI") { + dependsOn(tasks["cleanJNI-${name}"]) + } + + tasks.named("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("processResources") { + dependsOn(tasks["compileJNI"]) + } + + project.extensions.create("jni", project) + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/TypeScriptPlugin.kt b/buildSrc/src/main/kotlin/TypeScriptPlugin.kt new file mode 100644 index 0000000..ae71a3b --- /dev/null +++ b/buildSrc/src/main/kotlin/TypeScriptPlugin.kt @@ -0,0 +1,122 @@ +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.tasks.Copy +import org.gradle.api.tasks.Exec +import org.gradle.api.tasks.Sync +import org.gradle.api.tasks.bundling.Jar +import org.gradle.kotlin.dsl.* +import java.io.File +import java.util.concurrent.Callable + +class TypeScriptPlugin : Plugin { + open class TypeScriptConfig(rootDir: File) { + val root: File = File(rootDir, "src/main/ts") + + fun getOutDir(): File { + return File(root, "build/ts") + } + + fun getDeclarationDir(): File { + return File(root, "build/dts") + } + + fun getDependenciesDir(): File { + return File(root, "build/dependencies") + } + } + + override fun apply(project: Project): Unit = project.run { + val extension = project.extensions.create("typescript", projectDir) + + configurations { + create("typescript") { + isTransitive = false + } + } + + tasks.register("extractTypescriptDependencies") { + group = "typescript" + + dependsOn(configurations["typescript"]) + + from(Callable { + configurations["typescript"].map { + zipTree(it).matching { + exclude("META-INF", "META-INF/**") + } + } + }) + + into(extension.getDependenciesDir()) + } + + tasks.register("npmInstall") { + group = "typescript" + + inputs.file(File(extension.root, "package.json")) + outputs.dir(File(extension.root, "node_modules")) + + workingDir(extension.root) + + executable("npm") + + args("install") + + doFirst { + project.delete { + delete(File(extension.root, "node_modules")) + } + } + + dependsOn(tasks["extractTypescriptDependencies"]) + } + + tasks.register("typescript") { + group = "typescript" + + inputs.dir(extension.root) + outputs.dirs(extension.getOutDir()) + + workingDir(extension.root) + + executable("npm") + + args("run", "build") + + doFirst { + project.delete { + delete(extension.getOutDir()) + } + } + + dependsOn(tasks["npmInstall"]) + } + + tasks.register("apiJar") { + group = "typescript" + + into("/types") { + from(File(extension.root, "types")) + } + into("/src") { + from(extension.getDeclarationDir()) + } + + archiveClassifier.set("api") + + dependsOn(tasks["typescript"]) + } + + artifacts { + add("archives", tasks["apiJar"]) + } + + tasks.named("processResources") { + dependsOn(tasks["typescript"]) + + from(extension.getOutDir()) { + into("scriptcraft") + } + } + } +} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/jni.gradle.kts b/buildSrc/src/main/kotlin/jni.gradle.kts deleted file mode 100644 index a15fc98..0000000 --- a/buildSrc/src/main/kotlin/jni.gradle.kts +++ /dev/null @@ -1,83 +0,0 @@ -val cDir = File(rootProject.projectDir.absolutePath, "src/main/c") - -class JNIPlatform(val name: String, val libExtension: String, rootDir: File) { - val cmakeArgs: Array = arrayOf("-DCMAKE_TOOLCHAIN_FILE=${rootDir.absolutePath}/cmake/${name}-toolchain.cmake") -} - -val jniPlatforms = arrayOf( - JNIPlatform("linux-x86_64", ".so", rootDir), - JNIPlatform("linux-x86", ".so", rootDir), - JNIPlatform("linux-armhf", ".so", rootDir), - JNIPlatform("linux-arm64", ".so", rootDir), - JNIPlatform("windows-x86_64", ".dll", rootDir), - JNIPlatform("windows-x86", ".dll", rootDir) -) - -tasks.register("cleanJNI") { - group = "jni" -} -tasks.register("compileJNI") { - group = "jni" -} - -jniPlatforms.forEach { - val buildDir = File(cDir, "build-${it.name}") - - tasks.register("cmake-${it.name}") { - doFirst { - if (!buildDir.exists()) { - buildDir.mkdir() - } - } - - group = "jni" - workingDir(buildDir) - - executable("cmake") - args(it.cmakeArgs, "..") - } - - tasks.register("compileJNI-${it.name}") { - group = "jni" - workingDir(buildDir) - - executable("make") - - dependsOn(tasks["cmake-${it.name}"]) - } - - tasks.named("compileJNI") { - dependsOn(tasks["compileJNI-${it.name}"]) - } - - tasks.register("cleanJNI-${it.name}") { - group = "jni" - delete(buildDir) - } - - tasks.named("cleanJNI") { - dependsOn(tasks["cleanJNI-${it.name}"]) - } -} - -tasks.named("clean") { - dependsOn(tasks["cleanJNI"]) -} - -tasks.named("processResources") { - dependsOn(tasks["compileJNI"]) - - jniPlatforms.forEach { - val buildDir = File(cDir, "build-${it.name}") - if (!buildDir.exists()) { - buildDir.mkdir() - } - - val file = File(buildDir, "libscriptcraft${it.libExtension}") - inputs.files(file) - - from(file.absolutePath) { - into(File("natives", it.name).path) - } - } -} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/typescript.gradle.kts b/buildSrc/src/main/kotlin/typescript.gradle.kts deleted file mode 100644 index 1b27344..0000000 --- a/buildSrc/src/main/kotlin/typescript.gradle.kts +++ /dev/null @@ -1,101 +0,0 @@ -val typescriptRoot = File(rootDir.absolutePath, "src/main/ts") - -extra.set("typescriptRoot", typescriptRoot) - -val typescriptOut = File(typescriptRoot, "build/ts") - -val nodeModules = File(typescriptRoot, "node_modules") - -val typescriptDependencies = File(typescriptRoot, "build/dependencies") - -configurations { - create("typescript") { - isTransitive = false - } -} - -tasks.register("extractTypescriptDependencies") { - group = "typescript" - - dependsOn(configurations["typescript"]) - - from(Callable { - configurations["typescript"].map { - zipTree(it).matching { - exclude("META-INF", "META-INF/**") - } - } - }) - - into(typescriptDependencies) -} - -tasks.register("npmInstall") { - group = "typescript" - - inputs.file(File(typescriptRoot, "package.json")) - outputs.dir(nodeModules) - - workingDir(typescriptRoot) - - executable("npm") - - args("install") - - doFirst { - project.delete { - delete(nodeModules) - } - } - - dependsOn(tasks["extractTypescriptDependencies"]) -} - -tasks.register("typescript") { - group = "typescript" - - inputs.dir(typescriptRoot) - outputs.dirs(typescriptOut) - - workingDir(typescriptRoot) - - executable("npm") - - args("run", "build") - - doFirst { - project.delete { - delete(typescriptOut) - } - } - - dependsOn(tasks["npmInstall"]) -} - -tasks.register("apiJar") { - group = "typescript" - - val dtsOut = File(typescriptRoot, "build/dts") - - into("/types") { - from(File(typescriptRoot, "types")) - } - into("/src") { - from(dtsOut) - } - - archiveClassifier.set("api") - - dependsOn(tasks["typescript"]) -} -artifacts { - add("archives", tasks["apiJar"]) -} - -tasks.named("processResources") { - dependsOn(tasks["typescript"]) - - from(typescriptOut.absolutePath) { - into("scriptcraft") - } -} \ No newline at end of file