Tachiyomi-Extensions/multisrc/build.gradle.kts
E3FxGaming 66c0ee00b8
Fix for the multi-sources not being generated properly (#6430)
* Potential fix for the multi-sources not being generated properly

As described here https://www.infoworld.com/article/2071275/when-runtime-exec---won-t.html under "Listing 4.2 BadExecJavac2.java" the limited buffer size of the standard input associated with the sub-process can cause problems with the Runtime exec method.

Consuming what the sub-process outputs should in theory allow for the process to finish (+ if you enable log level debug we could get some nice debug information in the future).

I've tested this on my local machine and it works there, please do not accept the PR with this commit before the Github checks pass successfully and I've looked further into this.

* Multi-sources not being generated properly - ErrorStream redirect

Now redirecting the errorStream of the sub-process to the standard output of the subprocess, so that we can consume it with the `javaProcess.inputStream` stream.
2021-04-05 10:37:29 -04:00

69 lines
2.1 KiB
Plaintext

import java.io.BufferedReader
import java.io.InputStreamReader
plugins {
id("com.android.library")
kotlin("android")
}
android {
compileSdkVersion(Config.compileSdk)
buildToolsVersion(Config.buildTools)
defaultConfig {
minSdkVersion(29)
targetSdkVersion(Config.targetSdk)
}
}
repositories {
mavenCentral()
}
// dependencies
apply("$rootDir/common-dependencies.gradle")
tasks {
val generateExtensions by registering {
doLast {
val isWindows = System.getProperty("os.name").toString().toLowerCase().contains("win")
var classPath = (configurations.debugCompileOnly.get().asFileTree.toList() +
listOf(
configurations.androidApis.get().asFileTree.first().absolutePath, // android.jar path
"$projectDir/build/intermediates/aar_main_jar/debug/classes.jar" // jar made from this module
))
.joinToString(if (isWindows) ";" else ":")
var javaPath = "${System.getProperty("java.home")}/bin/java"
val mainClass = "generator.GeneratorMainKt" // Main class we want to execute
if (isWindows) {
classPath = classPath.replace("/", "\\")
javaPath = javaPath.replace("/", "\\")
}
val javaProcess = ProcessBuilder()
.directory(null).command(javaPath, "-classpath", classPath, mainClass)
.redirectErrorStream(true).start()
val inputStreamReader = InputStreamReader(javaProcess.inputStream)
val bufferedReader = BufferedReader(inputStreamReader)
var s: String?
while (bufferedReader.readLine().also { s = it } != null) {
logger.info(s)
}
bufferedReader.close()
inputStreamReader.close()
val exitCode = javaProcess.waitFor()
if (exitCode != 0) {
throw Exception("Java process failed with exit code: $exitCode")
}
}
dependsOn("assembleDebug")
}
}