[Gradle, JS] Distinguish cache directories for js ir incremental compilation
[Gradle, JS] Make cleanOutputsAndLocalState as member method ^KT-56765 fixed
This commit is contained in:
committed by
Space Team
parent
81746e5aa1
commit
bcb517d66b
+53
-4
@@ -9,6 +9,7 @@ import org.gradle.util.GradleVersion
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType
|
import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType
|
||||||
import org.jetbrains.kotlin.gradle.testbase.*
|
import org.jetbrains.kotlin.gradle.testbase.*
|
||||||
import org.junit.jupiter.api.DisplayName
|
import org.junit.jupiter.api.DisplayName
|
||||||
|
import java.io.File
|
||||||
import kotlin.io.path.appendText
|
import kotlin.io.path.appendText
|
||||||
import kotlin.io.path.readText
|
import kotlin.io.path.readText
|
||||||
import kotlin.io.path.writeText
|
import kotlin.io.path.writeText
|
||||||
@@ -34,7 +35,7 @@ class Kotlin2JsIrBeIncrementalCompilationIT : KGPBaseTest() {
|
|||||||
project("kotlin-js-ir-ic-rebuild-after-error", gradleVersion) {
|
project("kotlin-js-ir-ic-rebuild-after-error", gradleVersion) {
|
||||||
fun readCacheFiles(): Map<String, Int> {
|
fun readCacheFiles(): Map<String, Int> {
|
||||||
val cacheFiles = mutableMapOf<String, Int>()
|
val cacheFiles = mutableMapOf<String, Int>()
|
||||||
projectPath.resolve("app/build/klib/cache/").toFile().walk().forEach { cachedFile ->
|
projectPath.resolve("app/build/klib/cache/js/developmentExecutable").toFile().walk().forEach { cachedFile ->
|
||||||
if (cachedFile.isFile) {
|
if (cachedFile.isFile) {
|
||||||
cacheFiles[cachedFile.absolutePath] = cachedFile.readBytes().contentHashCode()
|
cacheFiles[cachedFile.absolutePath] = cachedFile.readBytes().contentHashCode()
|
||||||
}
|
}
|
||||||
@@ -43,7 +44,7 @@ class Kotlin2JsIrBeIncrementalCompilationIT : KGPBaseTest() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
val srcFile = projectPath.resolve("app/src/main/kotlin/App.kt").toFile()
|
val srcFile = projectPath.resolve("app/src/main/kotlin/App.kt").toFile()
|
||||||
val guardFile = projectPath.resolve("app/build/klib/cache/cache.guard").toFile()
|
val guardFile = projectPath.resolve("app/build/klib/cache/js/developmentExecutable/cache.guard").toFile()
|
||||||
val badCode = srcFile.readText()
|
val badCode = srcFile.readText()
|
||||||
|
|
||||||
var successfulBuildCacheFiles = emptyMap<String, Int>()
|
var successfulBuildCacheFiles = emptyMap<String, Int>()
|
||||||
@@ -126,7 +127,7 @@ class Kotlin2JsIrBeIncrementalCompilationIT : KGPBaseTest() {
|
|||||||
fun testMultipleArtifacts(gradleVersion: GradleVersion) {
|
fun testMultipleArtifacts(gradleVersion: GradleVersion) {
|
||||||
project("kotlin-js-ir-ic-multiple-artifacts", gradleVersion) {
|
project("kotlin-js-ir-ic-multiple-artifacts", gradleVersion) {
|
||||||
build("compileDevelopmentExecutableKotlinJs") {
|
build("compileDevelopmentExecutableKotlinJs") {
|
||||||
val cacheDir = projectPath.resolve("app/build/klib/cache/").toFile()
|
val cacheDir = projectPath.resolve("app/build/klib/cache/js/developmentExecutable").toFile()
|
||||||
val cacheRootDirName = cacheDir.list()?.singleOrNull()
|
val cacheRootDirName = cacheDir.list()?.singleOrNull()
|
||||||
assertTrue("Lib cache root dir should contain 1 element 'version.hash'") {
|
assertTrue("Lib cache root dir should contain 1 element 'version.hash'") {
|
||||||
cacheRootDirName?.startsWith("version.") ?: false
|
cacheRootDirName?.startsWith("version.") ?: false
|
||||||
@@ -213,7 +214,7 @@ class Kotlin2JsIrBeIncrementalCompilationIT : KGPBaseTest() {
|
|||||||
assertOutputContains(">>> TEST OUT: Hello, Gradle.")
|
assertOutputContains(">>> TEST OUT: Hello, Gradle.")
|
||||||
}
|
}
|
||||||
|
|
||||||
val cacheGuard = projectPath.resolve("build/klib/cache/cache.guard").toFile()
|
val cacheGuard = projectPath.resolve("build/klib/cache/js/developmentExecutable/cache.guard").toFile()
|
||||||
assertFalse(cacheGuard.exists(), "Cache guard file should be removed after successful build")
|
assertFalse(cacheGuard.exists(), "Cache guard file should be removed after successful build")
|
||||||
|
|
||||||
val srcFile = projectPath.resolve("src/main/kotlin/Main.kt").toFile()
|
val srcFile = projectPath.resolve("src/main/kotlin/Main.kt").toFile()
|
||||||
@@ -230,4 +231,52 @@ class Kotlin2JsIrBeIncrementalCompilationIT : KGPBaseTest() {
|
|||||||
assertFalse(cacheGuard.exists(), "Cache guard file should be removed after successful build")
|
assertFalse(cacheGuard.exists(), "Cache guard file should be removed after successful build")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@DisplayName("Separate caches for different binaries")
|
||||||
|
@GradleTest
|
||||||
|
fun testSeparateCachesForDifferentBinaries(gradleVersion: GradleVersion) {
|
||||||
|
project("kotlin-js-ir-ic-multiple-artifacts", gradleVersion) {
|
||||||
|
val filesToModified = mutableMapOf<File, Long>()
|
||||||
|
|
||||||
|
build("compileDevelopmentExecutableKotlinJs") {
|
||||||
|
val cacheDir = projectPath.resolve("app/build/klib/cache/js/developmentExecutable").toFile()
|
||||||
|
val cacheRootDirName = cacheDir.list()?.singleOrNull()
|
||||||
|
val cacheRootDir = cacheDir.resolve(cacheRootDirName!!)
|
||||||
|
|
||||||
|
cacheRootDir.listFiles()!!
|
||||||
|
.forEach {
|
||||||
|
it.listFiles()!!
|
||||||
|
.filter { it.isFile }
|
||||||
|
.filter { it.name == "module.js" }
|
||||||
|
.forEach {
|
||||||
|
filesToModified[it] = it.lastModified()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTasksExecuted(":app:compileDevelopmentExecutableKotlinJs")
|
||||||
|
}
|
||||||
|
|
||||||
|
build("compileTestDevelopmentExecutableKotlinJs") {
|
||||||
|
val cacheDir = projectPath.resolve("app/build/klib/cache/js/developmentExecutable").toFile()
|
||||||
|
val cacheRootDirName = cacheDir.list()?.singleOrNull()
|
||||||
|
val cacheRootDir = cacheDir.resolve(cacheRootDirName!!)
|
||||||
|
|
||||||
|
val allUpToDate = cacheRootDir.listFiles()!!
|
||||||
|
.all {
|
||||||
|
it.listFiles()!!
|
||||||
|
.filter { it.isFile }
|
||||||
|
.filter { it.name == "module.js" }
|
||||||
|
.all {
|
||||||
|
filesToModified[it] == it.lastModified()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
assertTrue { allUpToDate }
|
||||||
|
|
||||||
|
assertTasksExecuted(":app:compileTestDevelopmentExecutableKotlinJs")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
@@ -4,6 +4,7 @@ plugins {
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(":lib"))
|
implementation(project(":lib"))
|
||||||
|
testImplementation(kotlin("test-js"))
|
||||||
}
|
}
|
||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
|
|||||||
+14
@@ -0,0 +1,14 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class MainTest {
|
||||||
|
@Test
|
||||||
|
fun testHello() {
|
||||||
|
assertEquals(true, true)
|
||||||
|
}
|
||||||
|
}
|
||||||
+12
-15
@@ -22,6 +22,7 @@ import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode
|
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode.DEVELOPMENT
|
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode.DEVELOPMENT
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBinaryMode.PRODUCTION
|
||||||
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
|
import org.jetbrains.kotlin.gradle.tasks.Kotlin2JsCompile
|
||||||
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
|
import org.jetbrains.kotlin.statistics.metrics.BooleanMetrics
|
||||||
import org.jetbrains.kotlin.statistics.metrics.StringMetrics
|
import org.jetbrains.kotlin.statistics.metrics.StringMetrics
|
||||||
@@ -50,15 +51,6 @@ abstract class KotlinJsIrLink @Inject constructor(
|
|||||||
return !entryModule.get().asFile.exists()
|
return !entryModule.get().asFile.exists()
|
||||||
}
|
}
|
||||||
|
|
||||||
@get:Internal
|
|
||||||
val platformType by lazy {
|
|
||||||
compilation.platformType
|
|
||||||
}
|
|
||||||
|
|
||||||
@Transient
|
|
||||||
@get:Internal
|
|
||||||
internal lateinit var compilation: KotlinCompilation<*>
|
|
||||||
|
|
||||||
@Transient
|
@Transient
|
||||||
@get:Internal
|
@get:Internal
|
||||||
internal val propertiesProvider = PropertiesProvider(project)
|
internal val propertiesProvider = PropertiesProvider(project)
|
||||||
@@ -85,8 +77,6 @@ abstract class KotlinJsIrLink @Inject constructor(
|
|||||||
@get:Input
|
@get:Input
|
||||||
internal abstract val modeProperty: Property<KotlinJsBinaryMode>
|
internal abstract val modeProperty: Property<KotlinJsBinaryMode>
|
||||||
|
|
||||||
private val buildDir = project.buildDir
|
|
||||||
|
|
||||||
@get:SkipWhenEmpty
|
@get:SkipWhenEmpty
|
||||||
@get:IgnoreEmptyDirectories
|
@get:IgnoreEmptyDirectories
|
||||||
@get:NormalizeLineEndings
|
@get:NormalizeLineEndings
|
||||||
@@ -95,8 +85,12 @@ abstract class KotlinJsIrLink @Inject constructor(
|
|||||||
internal abstract val entryModule: DirectoryProperty
|
internal abstract val entryModule: DirectoryProperty
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
val rootCacheDirectory by lazy {
|
internal abstract val rootCacheDirectory: DirectoryProperty
|
||||||
buildDir.resolve("klib/cache")
|
|
||||||
|
override fun cleanOutputsAndLocalState(reason: String?) {
|
||||||
|
if (!usingCacheDirectory()) {
|
||||||
|
super.cleanOutputsAndLocalState(reason)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun processArgs(args: K2JSCompilerArguments) {
|
override fun processArgs(args: K2JSCompilerArguments) {
|
||||||
@@ -124,10 +118,13 @@ abstract class KotlinJsIrLink @Inject constructor(
|
|||||||
|
|
||||||
args.includes = entryModule.get().asFile.canonicalPath
|
args.includes = entryModule.get().asFile.canonicalPath
|
||||||
|
|
||||||
if (incrementalJsIr && mode == DEVELOPMENT) {
|
if (usingCacheDirectory()) {
|
||||||
args.cacheDirectory = rootCacheDirectory.also { it.mkdirs() }.absolutePath
|
args.cacheDirectory = rootCacheDirectory.get().asFile.also { it.mkdirs() }.absolutePath
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun usingCacheDirectory() =
|
||||||
|
incrementalJsIr && modeProperty.get() == DEVELOPMENT
|
||||||
}
|
}
|
||||||
|
|
||||||
val KotlinPlatformType.fileExtension
|
val KotlinPlatformType.fileExtension
|
||||||
|
|||||||
+5
@@ -68,6 +68,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.cast
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import java.nio.file.Files.*
|
import java.nio.file.Files.*
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
import org.jetbrains.kotlin.gradle.tasks.cleanOutputsAndLocalState as cleanOutputsAndLocalStateUtil
|
||||||
|
|
||||||
const val KOTLIN_BUILD_DIR_NAME = "kotlin"
|
const val KOTLIN_BUILD_DIR_NAME = "kotlin"
|
||||||
const val USING_JVM_INCREMENTAL_COMPILATION_MESSAGE = "Using Kotlin/JVM incremental compilation"
|
const val USING_JVM_INCREMENTAL_COMPILATION_MESSAGE = "Using Kotlin/JVM incremental compilation"
|
||||||
@@ -407,6 +408,10 @@ abstract class AbstractKotlinCompile<T : CommonCompilerArguments> @Inject constr
|
|||||||
buildMetricsService.orNull?.also { it.addTask(path, this.javaClass, buildMetrics) }
|
buildMetricsService.orNull?.also { it.addTask(path, this.javaClass, buildMetrics) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected open fun cleanOutputsAndLocalState(reason: String?) {
|
||||||
|
cleanOutputsAndLocalStateUtil(reason)
|
||||||
|
}
|
||||||
|
|
||||||
protected open fun skipCondition(): Boolean = sources.isEmpty
|
protected open fun skipCondition(): Boolean = sources.isEmpty
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@ internal open class KotlinJsIrLinkConfig(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
).disallowChanges()
|
).disallowChanges()
|
||||||
task.compilation = compilation
|
task.rootCacheDirectory.set(project.layout.buildDirectory.map { it.dir("klib/cache/js/${binary.name}") })
|
||||||
task.destinationDirectory.convention(
|
task.destinationDirectory.convention(
|
||||||
project.layout.buildDirectory
|
project.layout.buildDirectory
|
||||||
.dir(COMPILE_SYNC)
|
.dir(COMPILE_SYNC)
|
||||||
|
|||||||
Reference in New Issue
Block a user