mirror of
https://github.com/ethauvin/kobalt.git
synced 2025-04-26 08:27:12 -07:00
ICompilerAction for the Java plug-in too.
This commit is contained in:
parent
d568507624
commit
f38182c5cb
6 changed files with 65 additions and 46 deletions
|
@ -5,10 +5,17 @@ import com.beust.kobalt.api.Project
|
||||||
import com.beust.kobalt.maven.DependencyManager
|
import com.beust.kobalt.maven.DependencyManager
|
||||||
import com.beust.kobalt.maven.IClasspathDependency
|
import com.beust.kobalt.maven.IClasspathDependency
|
||||||
import com.google.inject.Inject
|
import com.google.inject.Inject
|
||||||
|
import java.io.File
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract the compilation process by running an ICompilerAction parameterized by a CompilerActionInfo.
|
||||||
|
* Also validates the classpath and run all the classpath contributors.
|
||||||
|
*/
|
||||||
class JvmCompiler @Inject constructor(val dependencyManager: DependencyManager) {
|
class JvmCompiler @Inject constructor(val dependencyManager: DependencyManager) {
|
||||||
fun doCompile(project: Project?, context: KobaltContext?, action: ICompilerAction, info: CompilerActionInfo)
|
fun doCompile(project: Project?, context: KobaltContext?, action: ICompilerAction, info: CompilerActionInfo)
|
||||||
: TaskResult {
|
: TaskResult {
|
||||||
|
File(info.outputDir).mkdirs()
|
||||||
|
|
||||||
val allDependencies = arrayListOf<IClasspathDependency>()
|
val allDependencies = arrayListOf<IClasspathDependency>()
|
||||||
allDependencies.addAll(info.dependencies)
|
allDependencies.addAll(info.dependencies)
|
||||||
allDependencies.addAll(calculateDependencies(project, context, info.dependencies))
|
allDependencies.addAll(calculateDependencies(project, context, info.dependencies))
|
||||||
|
|
|
@ -6,8 +6,8 @@ import java.io.InputStream
|
||||||
import java.io.InputStreamReader
|
import java.io.InputStreamReader
|
||||||
|
|
||||||
public class RunCommand(val command: String) {
|
public class RunCommand(val command: String) {
|
||||||
val defaultSuccess = { output: List<String> -> log(1, "Success:\n " + output.join("\n"))}
|
val defaultSuccess = { output: List<String> -> log(1, "Success:\n " + output.joinToString("\n"))}
|
||||||
val defaultError = { output: List<String> -> log(1, "Error:\n " + output.join("\n"))}
|
val defaultError = { output: List<String> -> log(1, "Error:\n " + output.joinToString("\n"))}
|
||||||
|
|
||||||
var directory = File(".")
|
var directory = File(".")
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ public class RunCommand(val command: String) {
|
||||||
|
|
||||||
val pb = ProcessBuilder(allArgs)
|
val pb = ProcessBuilder(allArgs)
|
||||||
pb.directory(directory)
|
pb.directory(directory)
|
||||||
log(1, "Running command: " + allArgs.join(" "))
|
log(1, "Running command: " + allArgs.joinToString(" "))
|
||||||
val process = pb.start()
|
val process = pb.start()
|
||||||
pb.environment().put("ANDROID_HOME", "/Users/beust/android/adt-bundle-mac-x86_64-20140702/sdk")
|
pb.environment().put("ANDROID_HOME", "/Users/beust/android/adt-bundle-mac-x86_64-20140702/sdk")
|
||||||
val errorCode = process.waitFor()
|
val errorCode = process.waitFor()
|
||||||
|
|
|
@ -12,7 +12,6 @@ import com.beust.kobalt.misc.RunCommand
|
||||||
import com.beust.kobalt.misc.log
|
import com.beust.kobalt.misc.log
|
||||||
import com.beust.kobalt.plugin.java.JavaCompiler
|
import com.beust.kobalt.plugin.java.JavaCompiler
|
||||||
import com.beust.kobalt.plugin.packaging.JarUtils
|
import com.beust.kobalt.plugin.packaging.JarUtils
|
||||||
import com.google.common.collect.ArrayListMultimap
|
|
||||||
import com.google.common.collect.HashMultimap
|
import com.google.common.collect.HashMultimap
|
||||||
import com.google.inject.Inject
|
import com.google.inject.Inject
|
||||||
import com.google.inject.Singleton
|
import com.google.inject.Singleton
|
||||||
|
@ -37,8 +36,11 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler) :
|
||||||
val ANDROID_HOME = "/Users/beust/android/adt-bundle-mac-x86_64-20140702/sdk"
|
val ANDROID_HOME = "/Users/beust/android/adt-bundle-mac-x86_64-20140702/sdk"
|
||||||
override val name = "android"
|
override val name = "android"
|
||||||
|
|
||||||
|
var context: KobaltContext? = null
|
||||||
|
|
||||||
override fun apply(project: Project, context: KobaltContext) {
|
override fun apply(project: Project, context: KobaltContext) {
|
||||||
log(1, "Applying plug-in Android on project $project")
|
log(1, "Applying plug-in Android on project $project")
|
||||||
|
this.context = context
|
||||||
if (accept(project)) {
|
if (accept(project)) {
|
||||||
project.compileDependencies.add(FileDependency(androidJar(project).toString()))
|
project.compileDependencies.add(FileDependency(androidJar(project).toString()))
|
||||||
}
|
}
|
||||||
|
@ -144,8 +146,7 @@ public class AndroidPlugin @Inject constructor(val javaCompiler: JavaCompiler) :
|
||||||
val sourceFiles = arrayListOf(Paths.get(rDirectory, "R.java").toFile().path)
|
val sourceFiles = arrayListOf(Paths.get(rDirectory, "R.java").toFile().path)
|
||||||
val buildDir = Paths.get(project.buildDirectory, "generated", "classes").toFile()
|
val buildDir = Paths.get(project.buildDirectory, "generated", "classes").toFile()
|
||||||
|
|
||||||
javaCompiler.compile("Compiling R.java", null, listOf<String>(), listOf<IClasspathDependency>(),
|
javaCompiler.compile(project, context, listOf(), sourceFiles, buildDir.absolutePath, listOf())
|
||||||
sourceFiles, buildDir)
|
|
||||||
return buildDir
|
return buildDir
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,11 @@ package com.beust.kobalt.plugin.java
|
||||||
|
|
||||||
import com.beust.kobalt.JavaInfo
|
import com.beust.kobalt.JavaInfo
|
||||||
import com.beust.kobalt.SystemProperties
|
import com.beust.kobalt.SystemProperties
|
||||||
|
import com.beust.kobalt.api.KobaltContext
|
||||||
import com.beust.kobalt.api.Project
|
import com.beust.kobalt.api.Project
|
||||||
import com.beust.kobalt.internal.JvmCompilerPlugin
|
import com.beust.kobalt.internal.CompilerActionInfo
|
||||||
|
import com.beust.kobalt.internal.ICompilerAction
|
||||||
|
import com.beust.kobalt.internal.JvmCompiler
|
||||||
import com.beust.kobalt.internal.TaskResult
|
import com.beust.kobalt.internal.TaskResult
|
||||||
import com.beust.kobalt.maven.DependencyManager
|
import com.beust.kobalt.maven.DependencyManager
|
||||||
import com.beust.kobalt.maven.IClasspathDependency
|
import com.beust.kobalt.maven.IClasspathDependency
|
||||||
|
@ -13,43 +16,47 @@ import com.google.inject.Singleton
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@Singleton
|
@Singleton
|
||||||
class JavaCompiler @Inject constructor(val dependencyManager: DependencyManager){
|
class JavaCompiler @Inject constructor(val dependencyManager: DependencyManager,
|
||||||
fun compile(name: String, directory: String?, compilerArgs: List<String>, cpList: List<IClasspathDependency>,
|
val jvmCompiler: JvmCompiler){
|
||||||
sourceFiles: List<String>, outputDirectory: File): TaskResult {
|
/**
|
||||||
|
* Create an ICompilerAction and a CompilerActionInfo suitable to be passed to doCompiler() to perform the
|
||||||
|
* actual compilation.
|
||||||
|
*/
|
||||||
|
fun compile(project: Project?, context: KobaltContext?, dependencies: List<IClasspathDependency>,
|
||||||
|
sourceFiles: List<String>, outputDir: String, args: List<String>) : TaskResult {
|
||||||
|
|
||||||
outputDirectory.mkdirs()
|
val info = CompilerActionInfo(dependencies, sourceFiles, outputDir, args)
|
||||||
val jvm = JavaInfo.create(File(SystemProperties.javaBase))
|
val compilerAction = object : ICompilerAction {
|
||||||
val javac = jvm.javacExecutable
|
override fun compile(info: CompilerActionInfo): TaskResult {
|
||||||
|
|
||||||
val args = arrayListOf(
|
val jvm = JavaInfo.create(File(SystemProperties.javaBase))
|
||||||
javac!!.absolutePath,
|
val javac = jvm.javacExecutable
|
||||||
"-d", outputDirectory.absolutePath)
|
|
||||||
if (cpList.size > 0) {
|
val args = arrayListOf(
|
||||||
val fullClasspath = dependencyManager.transitiveClosure(cpList)
|
javac!!.absolutePath,
|
||||||
val stringClasspath = fullClasspath.map { it.jarFile.get().absolutePath }
|
"-d", info.outputDir)
|
||||||
JvmCompilerPlugin.validateClasspath(stringClasspath)
|
if (dependencies.size > 0) {
|
||||||
args.add("-classpath")
|
args.add("-classpath")
|
||||||
args.add(stringClasspath.joinToString(File.pathSeparator))
|
args.add(info.dependencies.map {it.jarFile.get()}.joinToString(File.pathSeparator))
|
||||||
|
}
|
||||||
|
args.addAll(info.compilerArgs)
|
||||||
|
args.addAll(info.sourceFiles)
|
||||||
|
|
||||||
|
val pb = ProcessBuilder(args)
|
||||||
|
if (outputDir != null) {
|
||||||
|
pb.directory(File(outputDir))
|
||||||
|
}
|
||||||
|
pb.inheritIO()
|
||||||
|
val line = args.joinToString(" ")
|
||||||
|
log(1, " Compiling ${sourceFiles.size} files with classpath size " + info.dependencies.size)
|
||||||
|
log(2, " Compiling ${project?.name}:\n$line")
|
||||||
|
val process = pb.start()
|
||||||
|
val errorCode = process.waitFor()
|
||||||
|
|
||||||
|
return if (errorCode == 0) TaskResult(true, "Compilation succeeded")
|
||||||
|
else TaskResult(false, "There were errors")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
args.addAll(compilerArgs)
|
return jvmCompiler.doCompile(project, context, compilerAction, info)
|
||||||
args.addAll(sourceFiles)
|
|
||||||
|
|
||||||
val pb = ProcessBuilder(args)
|
|
||||||
if (directory != null) {
|
|
||||||
pb.directory(File(directory))
|
|
||||||
}
|
|
||||||
pb.inheritIO()
|
|
||||||
// pb.redirectErrorStream(true)
|
|
||||||
// pb.redirectError(File("/tmp/kobalt-err"))
|
|
||||||
// pb.redirectOutput(File("/tmp/kobalt-out"))
|
|
||||||
val line = args.joinToString(" ")
|
|
||||||
log(1, " Compiling ${sourceFiles.size} files")
|
|
||||||
log(2, " Compiling $name:\n$line")
|
|
||||||
val process = pb.start()
|
|
||||||
val errorCode = process.waitFor()
|
|
||||||
|
|
||||||
return if (errorCode == 0) TaskResult(true, "Compilation succeeded")
|
|
||||||
else TaskResult(false, "There were errors")
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,8 +48,8 @@ public class JavaPlugin @Inject constructor(
|
||||||
|
|
||||||
private fun compilePrivate(project: Project, cpList: List<IClasspathDependency>, sourceFiles: List<String>,
|
private fun compilePrivate(project: Project, cpList: List<IClasspathDependency>, sourceFiles: List<String>,
|
||||||
outputDirectory: File): TaskResult {
|
outputDirectory: File): TaskResult {
|
||||||
val result = javaCompiler.compile(project.name!!, project.directory, compilerArgs, cpList, sourceFiles,
|
val result = javaCompiler.compile(project, context, cpList, sourceFiles, outputDirectory.absolutePath,
|
||||||
outputDirectory)
|
compilerArgs)
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,12 @@ class KotlinCompiler @Inject constructor(override val localRepo : LocalRepo,
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an ICompilerAction and a CompilerActionInfo suitable to be passed to doCompiler() to perform the
|
||||||
|
* actual compilation.
|
||||||
|
*/
|
||||||
fun compile(project: Project?, compileDependencies: List<IClasspathDependency>, otherClasspath: List<String>,
|
fun compile(project: Project?, compileDependencies: List<IClasspathDependency>, otherClasspath: List<String>,
|
||||||
source: List<String>, output: String, args: List<String>) : TaskResult {
|
source: List<String>, outputDir: String, args: List<String>) : TaskResult {
|
||||||
|
|
||||||
val executor = executors.newExecutor("KotlinCompiler", 10)
|
val executor = executors.newExecutor("KotlinCompiler", 10)
|
||||||
val compilerDep = depFactory.create("org.jetbrains.kotlin:kotlin-compiler-embeddable:$KOTLIN_VERSION", executor)
|
val compilerDep = depFactory.create("org.jetbrains.kotlin:kotlin-compiler-embeddable:$KOTLIN_VERSION", executor)
|
||||||
|
@ -57,7 +61,7 @@ class KotlinCompiler @Inject constructor(override val localRepo : LocalRepo,
|
||||||
.plus(compileDependencies)
|
.plus(compileDependencies)
|
||||||
.plus(classpathList)
|
.plus(classpathList)
|
||||||
.plus(otherClasspath.map { FileDependency(it)})
|
.plus(otherClasspath.map { FileDependency(it)})
|
||||||
val info = CompilerActionInfo(dependencies, source, output, args)
|
val info = CompilerActionInfo(dependencies, source, outputDir, args)
|
||||||
val compilerAction = object: ICompilerAction {
|
val compilerAction = object: ICompilerAction {
|
||||||
override fun compile(info: CompilerActionInfo): TaskResult {
|
override fun compile(info: CompilerActionInfo): TaskResult {
|
||||||
log(1, "Compiling ${source.size} files")
|
log(1, "Compiling ${source.size} files")
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue