Zinc is a standalone version of sbt's incremental compiler meant to be run in nailgun.
—
Incremental compilation analysis, dependency tracking, and caching infrastructure for optimized build performance.
Analysis cache facade for incremental compilation with dependency tracking.
case class AnalysisMap private[AnalysisMap] (
analysisLocations: Map[File, FileFPrint], // Map of classpath entries to cache file fingerprints
log: Logger // Logger for analysis operations
) {
/**
* Check if a classpath entry defines a specific class
* @param classpathEntry Classpath entry to check
* @return Function to test class definition
*/
def definesClass(classpathEntry: File): String => Boolean
/**
* Get analysis information for a classpath entry
* @param classpathEntry Classpath entry to analyze
* @return Optional analysis data
*/
def getAnalysis(classpathEntry: File): Option[Analysis]
}
object AnalysisMap {
/**
* Create AnalysisMap with file fingerprints for cache validation
* @param analysisLocations Mapping of classpath entries to analysis cache file locations
* @param log Logger for analysis operations
* @return AnalysisMap instance with fingerprint validation
*/
def create(analysisLocations: Map[File, File], log: Logger): AnalysisMap
/**
* Create analysis store for cache file management
* @param cacheFile Analysis cache file location
* @return AnalysisStore for reading/writing analysis data
*/
def cachedStore(cacheFile: File): AnalysisStore
}File fingerprint management for cache invalidation and dependency tracking.
class FileFPrint(val file: File, val fprint: String)
object FileFPrint {
/**
* Generate file fingerprint for cache validation
* @param file File to fingerprint
* @return Optional file fingerprint (None if file doesn't exist)
*/
def fprint(file: File): Option[FileFPrint]
}LRU cache implementation with soft references for memory-efficient caching.
object Cache {
/**
* Create LRU cache with soft references
* @param maxSize Maximum cache size
* @return Cache instance with specified size limit
*/
def apply[K <: AnyRef, V <: AnyRef](maxSize: Int): gcache.Cache[K, V]
}
// Implicit extensions for cache operations
implicit class CacheExtensions[K <: AnyRef, V <: AnyRef](cache: gcache.Cache[K, V]) {
/**
* Get value from cache or compute and store if absent
* @param key Cache key
* @param value Value computation function
* @return Cached or computed value
*/
def getOrElseUpdate(key: K)(value: => V): V
/**
* Get all cache entries as sequence
* @return Sequence of key-value pairs
*/
def entries: Seq[(K, V)]
}import org.pantsbuild.zinc._
import org.pantsbuild.zinc.cache._
import java.io.File
// Create analysis mapping for dependency tracking
val analysisLocations = Map(
new File("/path/to/upstream.jar") -> new File("/path/to/upstream-analysis.cache"),
new File("/path/to/library.jar") -> new File("/path/to/library-analysis.cache")
)
val log = Loggers.create(Level.Info, color = true)
val analysisMap = AnalysisMap.create(analysisLocations, log)
// Check if a jar defines a specific class
val definesMyClass = analysisMap.definesClass(new File("/path/to/upstream.jar"))
val hasMyClass = definesMyClass("com.example.MyClass")
// Get analysis data for incremental compilation
val upstreamAnalysis = analysisMap.getAnalysis(new File("/path/to/upstream.jar"))import org.pantsbuild.zinc.FileFPrint
import java.io.File
// Generate fingerprints for cache validation
val sourceFile = new File("src/main/scala/Example.scala")
val fingerprint = FileFPrint.fprint(sourceFile)
fingerprint match {
case Some(fp) =>
println(s"File: ${fp.file}, Fingerprint: ${fp.fprint}")
case None =>
println("File does not exist or cannot be read")
}import org.pantsbuild.zinc.cache.Cache
import java.io.File
// Create LRU cache for compiler instances
val compilerCache = Cache[String, AnyRef](maxSize = 10)
// Cache operations with automatic computation
val cachedValue = compilerCache.getOrElseUpdate("scala-2.12.17") {
// Expensive compiler creation operation
createCompilerInstance("2.12.17")
}
// View all cached entries
val allEntries = compilerCache.entries
println(s"Cache contains ${allEntries.size} entries")import org.pantsbuild.zinc._
import java.io.File
// Set up analysis mapping for incremental compilation
val settings = Settings.parse(args.toSeq).get
val inputs = Inputs(log, settings)
// Analysis mapping is automatically created from settings
val analysisMap = inputs.analysisMap
// Use in compilation process
val compiler = Compiler(Setup(settings), log)
compiler.compile(inputs, Some(new File(".")), reporter, progress)(log)
// Analysis data is automatically cached and reused for subsequent compilationsConfiguration options specific to analysis and caching behavior.
case class AnalysisOptions(
cache: Option[File], // Analysis cache file location
cacheMap: Map[File, File] // Mapping of dependency analysis locations
)The analysis and caching system provides several performance optimization features:
Analysis operations handle various error conditions gracefully:
Install with Tessl CLI
npx tessl i tessl/maven-org-pantsbuild--zinc