[IC] Relocatable IC caches for projects with custom buildDir
IC caches often contain file paths. To make them relocatable, we need
to convert these file paths into relative paths, relative to a base
directory.
- If the file paths are source files, we can use the root project
directory as base.
- If the file paths are class files, we should use the classes
directory as base (before this commit, we used the root project
directory in both cases, that's why we hit KT-58547).
The key changes in this commit include:
- RelocatableFileToPathConverter: converts paths to relative paths
- IncrementalCompilationContext: contains 2 different path converters,
one for source files and one for class files
- SourceToOutputFilesMap: maps source files to class files using the
above path converters
- IncrementalCompilerRunner: creates the path converters based on file
locations
Test: RelocatableFileToPathConverterTest unit test
SourceToOutputFilesMapTest unit test
BuildCacheRelocationIT.testCustomBuildDirectory integration test
^KT-58547 Fixed
This commit is contained in:
@@ -113,10 +113,11 @@ public abstract interface class org/jetbrains/kotlin/buildtools/api/jvm/Classpat
|
||||
public abstract fun forceNonIncrementalMode (Z)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration;
|
||||
public abstract fun getAssuredNoClasspathSnapshotsChanges ()Z
|
||||
public abstract fun keepIncrementalCompilationCachesInMemory (Z)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration;
|
||||
public abstract fun setBuildDir (Ljava/io/File;)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration;
|
||||
public abstract fun setRootProjectDir (Ljava/io/File;)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration;
|
||||
public abstract fun useOutputDirs (Ljava/util/Collection;)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration;
|
||||
public abstract fun usePreciseCompilationResultsBackup (Z)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration;
|
||||
public abstract fun usePreciseJavaTracking (Z)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration;
|
||||
public abstract fun useProjectDir (Ljava/io/File;)Lorg/jetbrains/kotlin/buildtools/api/jvm/ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration;
|
||||
}
|
||||
|
||||
public abstract interface class org/jetbrains/kotlin/buildtools/api/jvm/InaccessibleClassSnapshot : org/jetbrains/kotlin/buildtools/api/jvm/ClassSnapshot {
|
||||
@@ -128,17 +129,19 @@ public abstract interface class org/jetbrains/kotlin/buildtools/api/jvm/Incremen
|
||||
public abstract interface class org/jetbrains/kotlin/buildtools/api/jvm/IncrementalJvmCompilationConfiguration {
|
||||
public abstract fun forceNonIncrementalMode (Z)Lorg/jetbrains/kotlin/buildtools/api/jvm/IncrementalJvmCompilationConfiguration;
|
||||
public static synthetic fun forceNonIncrementalMode$default (Lorg/jetbrains/kotlin/buildtools/api/jvm/IncrementalJvmCompilationConfiguration;ZILjava/lang/Object;)Lorg/jetbrains/kotlin/buildtools/api/jvm/IncrementalJvmCompilationConfiguration;
|
||||
public abstract fun getBuildDir ()Ljava/io/File;
|
||||
public abstract fun getForcedNonIncrementalMode ()Z
|
||||
public abstract fun getIncrementalCompilationCachesKeptInMemory ()Z
|
||||
public abstract fun getOutputDirs ()Ljava/util/Set;
|
||||
public abstract fun getPreciseCompilationResultsBackupEnabled ()Z
|
||||
public abstract fun getPreciseJavaTrackingEnabled ()Z
|
||||
public abstract fun getProjectDir ()Ljava/io/File;
|
||||
public abstract fun getRootProjectDir ()Ljava/io/File;
|
||||
public abstract fun keepIncrementalCompilationCachesInMemory (Z)Lorg/jetbrains/kotlin/buildtools/api/jvm/IncrementalJvmCompilationConfiguration;
|
||||
public abstract fun setBuildDir (Ljava/io/File;)Lorg/jetbrains/kotlin/buildtools/api/jvm/IncrementalJvmCompilationConfiguration;
|
||||
public abstract fun setRootProjectDir (Ljava/io/File;)Lorg/jetbrains/kotlin/buildtools/api/jvm/IncrementalJvmCompilationConfiguration;
|
||||
public abstract fun useOutputDirs (Ljava/util/Collection;)Lorg/jetbrains/kotlin/buildtools/api/jvm/IncrementalJvmCompilationConfiguration;
|
||||
public abstract fun usePreciseCompilationResultsBackup (Z)Lorg/jetbrains/kotlin/buildtools/api/jvm/IncrementalJvmCompilationConfiguration;
|
||||
public abstract fun usePreciseJavaTracking (Z)Lorg/jetbrains/kotlin/buildtools/api/jvm/IncrementalJvmCompilationConfiguration;
|
||||
public abstract fun useProjectDir (Ljava/io/File;)Lorg/jetbrains/kotlin/buildtools/api/jvm/IncrementalJvmCompilationConfiguration;
|
||||
}
|
||||
|
||||
public abstract interface class org/jetbrains/kotlin/buildtools/api/jvm/JvmCompilationConfiguration {
|
||||
|
||||
+30
-12
@@ -78,20 +78,36 @@ public interface JvmCompilationConfiguration {
|
||||
*/
|
||||
@ExperimentalBuildToolsApi
|
||||
public interface IncrementalJvmCompilationConfiguration<P : IncrementalCompilationApproachParameters> {
|
||||
/**
|
||||
* A directory used as a base path for computing relative paths in the incremental compilation caches.
|
||||
*
|
||||
* If is not specified, incremental compilation caches will be non-relocatable
|
||||
*
|
||||
* Managed by [useProjectDir]
|
||||
* Default values is `null`
|
||||
*/
|
||||
public val projectDir: File?
|
||||
|
||||
/**
|
||||
* @see [IncrementalJvmCompilationConfiguration.projectDir]
|
||||
* The root project directory, used for computing relative paths in the incremental compilation caches.
|
||||
*
|
||||
* If it is not specified, incremental compilation caches will be non-relocatable.
|
||||
*
|
||||
* Managed by [setRootProjectDir]
|
||||
* Default value is `null`
|
||||
*/
|
||||
public fun useProjectDir(projectDir: File): IncrementalJvmCompilationConfiguration<P>
|
||||
public val rootProjectDir: File?
|
||||
|
||||
/**
|
||||
* @see [IncrementalJvmCompilationConfiguration.rootProjectDir]
|
||||
*/
|
||||
public fun setRootProjectDir(rootProjectDir: File): IncrementalJvmCompilationConfiguration<P>
|
||||
|
||||
/**
|
||||
* The build directory, used for computing relative paths in the incremental compilation caches.
|
||||
*
|
||||
* If it is not specified, incremental compilation caches will be non-relocatable.
|
||||
*
|
||||
* Managed by [setBuildDir]
|
||||
* Default value is `null`
|
||||
*/
|
||||
public val buildDir: File?
|
||||
|
||||
/**
|
||||
* @see [IncrementalJvmCompilationConfiguration.buildDir]
|
||||
*/
|
||||
public fun setBuildDir(buildDir: File): IncrementalJvmCompilationConfiguration<P>
|
||||
|
||||
/**
|
||||
* An indicator whether incremental compilation will analyze Java files precisely for better changes detection
|
||||
@@ -186,7 +202,9 @@ public interface ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration :
|
||||
*/
|
||||
public fun assureNoClasspathSnapshotsChanges(value: Boolean = true): ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration
|
||||
|
||||
override fun useProjectDir(projectDir: File): ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration
|
||||
override fun setRootProjectDir(rootProjectDir: File): ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration
|
||||
|
||||
override fun setBuildDir(buildDir: File): ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration
|
||||
|
||||
override fun usePreciseJavaTracking(value: Boolean): ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration
|
||||
|
||||
|
||||
+16
-5
@@ -50,12 +50,18 @@ internal abstract class JvmIncrementalCompilationConfigurationImpl<P : Increment
|
||||
override var preciseJavaTrackingEnabled: Boolean = true,
|
||||
override var preciseCompilationResultsBackupEnabled: Boolean = false,
|
||||
override var incrementalCompilationCachesKeptInMemory: Boolean = false,
|
||||
override var projectDir: File? = null,
|
||||
override var rootProjectDir: File? = null,
|
||||
override var buildDir: File? = null,
|
||||
override var forcedNonIncrementalMode: Boolean = false,
|
||||
override var outputDirs: Set<File> = emptySet(),
|
||||
) : IncrementalJvmCompilationConfiguration<P> {
|
||||
override fun useProjectDir(projectDir: File): IncrementalJvmCompilationConfiguration<P> {
|
||||
this.projectDir = projectDir
|
||||
override fun setRootProjectDir(rootProjectDir: File): IncrementalJvmCompilationConfiguration<P> {
|
||||
this.rootProjectDir = rootProjectDir
|
||||
return this
|
||||
}
|
||||
|
||||
override fun setBuildDir(buildDir: File): IncrementalJvmCompilationConfiguration<P> {
|
||||
this.buildDir = buildDir
|
||||
return this
|
||||
}
|
||||
|
||||
@@ -90,8 +96,13 @@ internal class ClasspathSnapshotBasedIncrementalJvmCompilationConfigurationImpl(
|
||||
) :
|
||||
JvmIncrementalCompilationConfigurationImpl<ClasspathSnapshotBasedIncrementalCompilationApproachParameters>(),
|
||||
ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration {
|
||||
override fun useProjectDir(projectDir: File): ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration {
|
||||
super.useProjectDir(projectDir)
|
||||
override fun setRootProjectDir(rootProjectDir: File): ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration {
|
||||
super.setRootProjectDir(rootProjectDir)
|
||||
return this
|
||||
}
|
||||
|
||||
override fun setBuildDir(buildDir: File): ClasspathSnapshotBasedIncrementalJvmCompilationConfiguration {
|
||||
super.setBuildDir(buildDir)
|
||||
return this
|
||||
}
|
||||
|
||||
|
||||
+2
-1
@@ -56,7 +56,8 @@ internal val JvmCompilationConfigurationImpl.asDaemonCompilationOptions: Compila
|
||||
outputFiles = options.outputDirs,
|
||||
multiModuleICSettings = null, // required only for the build history approach
|
||||
modulesInfo = null, // required only for the build history approach
|
||||
rootProjectDir = options.projectDir,
|
||||
rootProjectDir = options.rootProjectDir,
|
||||
buildDir = options.buildDir,
|
||||
kotlinScriptExtensions = ktsExtensionsAsArray,
|
||||
withAbiSnapshot = false,
|
||||
preciseCompilationResultsBackup = options.preciseCompilationResultsBackupEnabled,
|
||||
|
||||
Reference in New Issue
Block a user