sbt/compile/ComponentCompiler.scala

50 lines
1.9 KiB
Scala
Raw Normal View History

2009-08-18 06:51:08 +02:00
package xsbt
import java.io.File
object ComponentCompiler
{
val xsbtiID = "xsbti"
val srcExtension = "-src"
val binSeparator = "-bin_"
val compilerInterfaceID = "compiler-interface"
val compilerInterfaceSrcID = compilerInterfaceID + srcExtension
2009-08-18 06:51:08 +02:00
}
class ComponentCompiler(scalaVersion: String, compiler: RawCompiler, manager: ComponentManager)
2009-08-18 06:51:08 +02:00
{
import ComponentCompiler._
import FileUtilities.{copy, createDirectory, zip, jars, unzip, withTemporaryDirectory}
def apply(id: String): File =
{
val binID = binaryID(id, scalaVersion)
2009-08-18 06:51:08 +02:00
try { manager.file(binID) }
catch { case e: InvalidComponent => compileAndInstall(id, binID) }
2009-08-18 06:51:08 +02:00
}
private def binaryID(id: String, scalaVersion: String) = id + binSeparator + scalaVersion
2009-08-18 06:51:08 +02:00
private def compileAndInstall(id: String, binID: String): File =
{
val srcID = id + srcExtension
2009-08-18 06:51:08 +02:00
val binaryDirectory = manager.location(binID)
createDirectory(binaryDirectory)
val targetJar = new File(binaryDirectory, id + ".jar")
compileSources(manager.files(srcID), targetJar, id)
2009-08-18 06:51:08 +02:00
manager.cache(binID)
targetJar
}
/** Extract sources from source jars, compile them with the xsbti interfaces on the classpath, and package the compiled classes and
* any resources from the source jars into a final jar.*/
private def compileSources(sourceJars: Iterable[File], targetJar: File, id: String)
2009-08-18 06:51:08 +02:00
{
import Paths._
2009-08-18 06:51:08 +02:00
withTemporaryDirectory { dir =>
val extractedSources = (Set[File]() /: sourceJars) { (extracted, sourceJar)=> extracted ++ unzip(sourceJar, dir) }
val (sourceFiles, resources) = extractedSources.partition(_.getName.endsWith(".scala"))
withTemporaryDirectory { outputDirectory =>
val xsbtiJars = manager.files(xsbtiID)
compiler(Set() ++ sourceFiles, Set() ++ xsbtiJars, outputDirectory, Nil, true)
copy(resources x (FileMapper.rebase(dir, outputDirectory)))
zip((outputDirectory ***) x (PathMapper.relativeTo(outputDirectory)), targetJar)
2009-08-18 06:51:08 +02:00
}
}
}
}