cleanup cache-related code, aiming for unknown cause of #292

This commit is contained in:
Mark Harrah 2012-01-15 12:29:53 -05:00
parent a0300cd3b3
commit d146c7f84c
3 changed files with 19 additions and 13 deletions

View File

@ -31,6 +31,8 @@ package sbt
object Defaults extends BuildCommon object Defaults extends BuildCommon
{ {
final val CacheDirectoryName = "cache"
def configSrcSub(key: SettingKey[File]): Initialize[File] = (key in ThisScope.copy(config = Global), configuration) { (src, conf) => src / nameForSrc(conf.name) } def configSrcSub(key: SettingKey[File]): Initialize[File] = (key in ThisScope.copy(config = Global), configuration) { (src, conf) => src / nameForSrc(conf.name) }
def nameForSrc(config: String) = if(config == "compile") "main" else config def nameForSrc(config: String) = if(config == "compile") "main" else config
def prefix(config: String) = if(config == "compile") "" else config + "-" def prefix(config: String) = if(config == "compile") "" else config + "-"
@ -131,7 +133,7 @@ object Defaults extends BuildCommon
sourceDirectory <<= baseDirectory / "src", sourceDirectory <<= baseDirectory / "src",
sourceManaged <<= crossTarget / "src_managed", sourceManaged <<= crossTarget / "src_managed",
resourceManaged <<= crossTarget / "resource_managed", resourceManaged <<= crossTarget / "resource_managed",
cacheDirectory <<= (target, thisProject)(_ / "cache" / _.id) cacheDirectory <<= (crossTarget, thisProject)(_ / CacheDirectoryName / _.id / "global")
) )
lazy val configPaths = sourceConfigPaths ++ resourceConfigPaths ++ outputConfigPaths lazy val configPaths = sourceConfigPaths ++ resourceConfigPaths ++ outputConfigPaths
@ -168,7 +170,7 @@ object Defaults extends BuildCommon
resources <<= Classpaths.concat(managedResources, unmanagedResources) resources <<= Classpaths.concat(managedResources, unmanagedResources)
) )
lazy val outputConfigPaths = Seq( lazy val outputConfigPaths = Seq(
cacheDirectory <<= (cacheDirectory, configuration) { _ / _.name }, cacheDirectory <<= (crossTarget, thisProject, configuration) { _ / CacheDirectoryName / _.id / _.name },
classDirectory <<= (crossTarget, configuration) { (outDir, conf) => outDir / (prefix(conf.name) + "classes") }, classDirectory <<= (crossTarget, configuration) { (outDir, conf) => outDir / (prefix(conf.name) + "classes") },
docDirectory <<= (crossTarget, configuration) { (outDir, conf) => outDir / (prefix(conf.name) + "api") } docDirectory <<= (crossTarget, configuration) { (outDir, conf) => outDir / (prefix(conf.name) + "api") }
) )
@ -189,8 +191,7 @@ object Defaults extends BuildCommon
scalaVersion in GlobalScope <<= appConfiguration( _.provider.scalaProvider.version), scalaVersion in GlobalScope <<= appConfiguration( _.provider.scalaProvider.version),
scalaBinaryVersion <<= scalaVersion(v => binaryVersion(v, "2.10")), scalaBinaryVersion <<= scalaVersion(v => binaryVersion(v, "2.10")),
crossScalaVersions in GlobalScope <<= Seq(scalaVersion).join, crossScalaVersions in GlobalScope <<= Seq(scalaVersion).join,
crossTarget <<= (target, scalaBinaryVersion, sbtBinaryVersion, sbtPlugin, crossPaths)(makeCrossTarget), crossTarget <<= (target, scalaBinaryVersion, sbtBinaryVersion, sbtPlugin, crossPaths)(makeCrossTarget)
cacheDirectory <<= (crossTarget, thisProject)(_ / "cache" / _.id)
) )
def makeCrossTarget(t: File, sv: String, sbtv: String, plugin: Boolean, cross: Boolean): File = def makeCrossTarget(t: File, sv: String, sbtv: String, plugin: Boolean, cross: Boolean): File =
{ {
@ -396,6 +397,10 @@ object Defaults extends BuildCommon
else else
base.configurations base.configurations
def pairID[A,B] = (a: A, b: B) => (a,b) def pairID[A,B] = (a: A, b: B) => (a,b)
def perTaskCache(key: TaskKey[_]): Setting[File] =
cacheDirectory ~= { _ / ("for_" + key.key.label) }
def packageTasks(key: TaskKey[File], mappingsTask: Initialize[Task[Seq[(File,String)]]]) = def packageTasks(key: TaskKey[File], mappingsTask: Initialize[Task[Seq[(File,String)]]]) =
inTask(key)( Seq( inTask(key)( Seq(
key in TaskGlobal <<= packageTask, key in TaskGlobal <<= packageTask,
@ -403,7 +408,7 @@ object Defaults extends BuildCommon
mappings <<= mappingsTask, mappings <<= mappingsTask,
packagedArtifact <<= (artifact, key) map pairID, packagedArtifact <<= (artifact, key) map pairID,
artifact <<= artifactSetting, artifact <<= artifactSetting,
cacheDirectory <<= cacheDirectory / key.key.label, perTaskCache(key),
artifactPath <<= artifactPathSetting(artifact) artifactPath <<= artifactPathSetting(artifact)
)) ))
def packageTask: Initialize[Task[File]] = def packageTask: Initialize[Task[File]] =
@ -458,7 +463,7 @@ object Defaults extends BuildCommon
} }
def docSetting(key: TaskKey[File]): Seq[Setting[_]] = inTask(key)(compileInputsSettings ++ Seq( def docSetting(key: TaskKey[File]): Seq[Setting[_]] = inTask(key)(compileInputsSettings ++ Seq(
cacheDirectory ~= (_ / key.key.label), perTaskCache(key),
target <<= docDirectory, // deprecate docDirectory in favor of 'target in doc'; remove when docDirectory is removed target <<= docDirectory, // deprecate docDirectory in favor of 'target in doc'; remove when docDirectory is removed
scalacOptions <<= scaladocOptions or scalacOptions, // deprecate scaladocOptions in favor of 'scalacOptions in doc'; remove when scaladocOptions is removed scalacOptions <<= scaladocOptions or scalacOptions, // deprecate scaladocOptions in favor of 'scalacOptions in doc'; remove when scaladocOptions is removed
key in TaskGlobal <<= (cacheDirectory, compileInputs, target, configuration, streams) map { (cache, in, out, config, s) => key in TaskGlobal <<= (cacheDirectory, compileInputs, target, configuration, streams) map { (cache, in, out, config, s) =>
@ -502,7 +507,7 @@ object Defaults extends BuildCommon
def compileTask = (compileInputs, streams) map { (i,s) => Compiler(i,s.log) } def compileTask = (compileInputs, streams) map { (i,s) => Compiler(i,s.log) }
def compileIncSetupTask = def compileIncSetupTask =
(dependencyClasspath, cacheDirectory, skip in compile, definesClass) map { (cp, cacheDir, skip, definesC) => (dependencyClasspath, cacheDirectory, skip in compile, definesClass) map { (cp, cacheDir, skip, definesC) =>
Compiler.IncSetup(analysisMap(cp), definesC, skip, cacheDir / "compile") Compiler.IncSetup(analysisMap(cp), definesC, skip, cacheDir / "inc_compile")
} }
def compileInputsSettings: Seq[Setting[_]] = { def compileInputsSettings: Seq[Setting[_]] = {
val optionsPair = TaskKey.local[(Seq[String], Seq[String])] val optionsPair = TaskKey.local[(Seq[String], Seq[String])]

View File

@ -20,7 +20,7 @@ final class CompileConfiguration(val sources: Seq[File], val classpath: Seq[File
val previousAnalysis: Analysis, val previousSetup: Option[CompileSetup], val currentSetup: CompileSetup, val getAnalysis: File => Option[Analysis], val definesClass: DefinesClass, val previousAnalysis: Analysis, val previousSetup: Option[CompileSetup], val currentSetup: CompileSetup, val getAnalysis: File => Option[Analysis], val definesClass: DefinesClass,
val maxErrors: Int, val compiler: AnalyzingCompiler, val javac: JavaCompiler) val maxErrors: Int, val compiler: AnalyzingCompiler, val javac: JavaCompiler)
class AggressiveCompile(cacheDirectory: File) class AggressiveCompile(cacheFile: File)
{ {
def apply(compiler: AnalyzingCompiler, javac: JavaCompiler, sources: Seq[File], classpath: Seq[File], outputDirectory: File, options: Seq[String] = Nil, javacOptions: Seq[String] = Nil, analysisMap: Map[File, Analysis] = Map.empty, definesClass: DefinesClass = Locate.definesClass _, maxErrors: Int = 100, compileOrder: CompileOrder.Value = Mixed, skip: Boolean = false)(implicit log: Logger): Analysis = def apply(compiler: AnalyzingCompiler, javac: JavaCompiler, sources: Seq[File], classpath: Seq[File], outputDirectory: File, options: Seq[String] = Nil, javacOptions: Seq[String] = Nil, analysisMap: Map[File, Analysis] = Map.empty, definesClass: DefinesClass = Locate.definesClass _, maxErrors: Int = 100, compileOrder: CompileOrder.Value = Mixed, skip: Boolean = false)(implicit log: Logger): Analysis =
{ {
@ -106,7 +106,7 @@ class AggressiveCompile(cacheDirectory: File)
options.dropWhile(_ != CompilerArguments.BootClasspathOption).drop(1).take(1).headOption.toList.flatMap(IO.parseClasspath) options.dropWhile(_ != CompilerArguments.BootClasspathOption).drop(1).take(1).headOption.toList.flatMap(IO.parseClasspath)
import AnalysisFormats._ import AnalysisFormats._
val store = AggressiveCompile.staticCache(cacheDirectory, AnalysisStore.sync(AnalysisStore.cached(FileBasedStore(cacheDirectory)))) val store = AggressiveCompile.staticCache(cacheFile, AnalysisStore.sync(AnalysisStore.cached(FileBasedStore(cacheFile))))
} }
private object AggressiveCompile private object AggressiveCompile
{ {

View File

@ -25,16 +25,17 @@ object Compiler
final case class Inputs(compilers: Compilers, config: Options, incSetup: IncSetup) final case class Inputs(compilers: Compilers, config: Options, incSetup: IncSetup)
final case class Options(classpath: Seq[File], sources: Seq[File], classesDirectory: File, options: Seq[String], javacOptions: Seq[String], maxErrors: Int, order: CompileOrder.Value) final case class Options(classpath: Seq[File], sources: Seq[File], classesDirectory: File, options: Seq[String], javacOptions: Seq[String], maxErrors: Int, order: CompileOrder.Value)
final case class IncSetup(analysisMap: Map[File, Analysis], definesClass: DefinesClass, skip: Boolean, cacheDirectory: File) final case class IncSetup(analysisMap: Map[File, Analysis], definesClass: DefinesClass, skip: Boolean, cacheFile: File)
final case class Compilers(scalac: AnalyzingCompiler, javac: JavaCompiler) final case class Compilers(scalac: AnalyzingCompiler, javac: JavaCompiler)
@deprecated("Use the other inputs variant.", "0.12.0")
def inputs(classpath: Seq[File], sources: Seq[File], outputDirectory: File, options: Seq[String], javacOptions: Seq[String], definesClass: DefinesClass, maxErrors: Int, order: CompileOrder.Value)(implicit compilers: Compilers, log: Logger): Inputs = def inputs(classpath: Seq[File], sources: Seq[File], outputDirectory: File, options: Seq[String], javacOptions: Seq[String], definesClass: DefinesClass, maxErrors: Int, order: CompileOrder.Value)(implicit compilers: Compilers, log: Logger): Inputs =
{ {
import Path._ import Path._
val classesDirectory = outputDirectory / "classes" val classesDirectory = outputDirectory / "classes"
val cacheDirectory = outputDirectory / "cache" val cacheFile = outputDirectory / "cache_old_style"
val augClasspath = classesDirectory.asFile +: classpath val augClasspath = classesDirectory.asFile +: classpath
val incSetup = IncSetup(Map.empty, definesClass, false, cacheDirectory) val incSetup = IncSetup(Map.empty, definesClass, false, cacheFile)
inputs(augClasspath, sources, classesDirectory, options, javacOptions, maxErrors, order)(compilers, incSetup, log) inputs(augClasspath, sources, classesDirectory, options, javacOptions, maxErrors, order)(compilers, incSetup, log)
} }
def inputs(classpath: Seq[File], sources: Seq[File], classesDirectory: File, options: Seq[String], javacOptions: Seq[String], maxErrors: Int, order: CompileOrder.Value)(implicit compilers: Compilers, incSetup: IncSetup, log: Logger): Inputs = def inputs(classpath: Seq[File], sources: Seq[File], classesDirectory: File, options: Seq[String], javacOptions: Seq[String], maxErrors: Int, order: CompileOrder.Value)(implicit compilers: Compilers, incSetup: IncSetup, log: Logger): Inputs =
@ -103,7 +104,7 @@ object Compiler
import in.config._ import in.config._
import in.incSetup._ import in.incSetup._
val agg = new AggressiveCompile(cacheDirectory) val agg = new AggressiveCompile(cacheFile)
agg(scalac, javac, sources, classpath, classesDirectory, options, javacOptions, analysisMap, definesClass, maxErrors, order, skip)(log) agg(scalac, javac, sources, classpath, classesDirectory, options, javacOptions, analysisMap, definesClass, maxErrors, order, skip)(log)
} }
} }