Fix JS target configuration triggers task creation too early.

This raised the problem that task, compilation task depends on, has not
been yet created and Gradle fails the build with exception.

KT-44949 In Progress
This commit is contained in:
Yahor Berdnikau
2021-02-18 10:48:41 +01:00
committed by TeamCityServer
parent d06ec61b79
commit 117cfc763a
2 changed files with 21 additions and 26 deletions
@@ -354,27 +354,6 @@ internal class KotlinJsIrSourceSetProcessor(
val subpluginEnvironment: SubpluginEnvironment = SubpluginEnvironment.loadSubplugins(project, kotlinPluginVersion)
subpluginEnvironment.addSubpluginOptions(project, kotlinCompilation)
}
// outputFile can be set later during the configuration phase, get it only after the phase:
project.runOnceAfterEvaluated("KotlinJsIrSourceSetProcessor.doTargetSpecificProcessing", kotlinTask) {
val kotlinTaskInstance = kotlinTask.get()
val kotlinOptions = kotlinTaskInstance.kotlinOptions
kotlinOptions.outputFile = kotlinTaskInstance.outputFile.absolutePath
val outputDir = if (kotlinOptions.isProduceUnzippedKlib())
kotlinTaskInstance.outputFile
else
kotlinTaskInstance.outputFile.parentFile
if (outputDir.isParentOf(project.rootDir))
throw InvalidUserDataException(
"The output directory '$outputDir' (defined by outputFile of $kotlinTaskInstance) contains or " +
"matches the project root directory '${project.rootDir}'.\n" +
"Gradle will not be able to build the project because of the root directory lock.\n" +
"To fix this, consider using the default outputFile location instead of providing it explicitly."
)
kotlinTaskInstance.destinationDir = outputDir
}
}
}
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.gradle.targets.js.ir
import org.gradle.api.InvalidUserDataException
import org.gradle.api.attributes.Usage
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.bundling.Zip
@@ -16,6 +17,7 @@ import org.jetbrains.kotlin.gradle.targets.js.KotlinJsReportAggregatingTestRun
import org.jetbrains.kotlin.gradle.tasks.KotlinTasksProvider
import org.jetbrains.kotlin.gradle.testing.internal.kotlinTestRegistry
import org.jetbrains.kotlin.gradle.testing.testTaskName
import org.jetbrains.kotlin.gradle.utils.isParentOf
import org.jetbrains.kotlin.gradle.utils.klibModuleName
import java.io.File
@@ -88,11 +90,25 @@ open class KotlinJsIrTargetConfigurator(kotlinPluginVersion: String) :
"${target.project.name}_${compilation.name}"
}
val destinationDir = compilation.compileKotlinTask.destinationDir
outputFile = if (produceUnzippedKlib)
destinationDir.absoluteFile.normalize().absolutePath
else
File(destinationDir, "$baseName.$KLIB_TYPE").absoluteFile.normalize().absolutePath
compilation.compileKotlinTaskProvider.configure { task ->
val outputFilePath = outputFile ?: if (produceUnzippedKlib) {
task.destinationDir.absoluteFile.normalize().absolutePath
} else {
File(task.destinationDir, "$baseName.$KLIB_TYPE").absoluteFile.normalize().absolutePath
}
outputFile = outputFilePath
val taskOutputDir = if (produceUnzippedKlib) File(outputFilePath) else File(outputFilePath).parentFile
if (taskOutputDir.isParentOf(task.project.rootDir))
throw InvalidUserDataException(
"The output directory '$taskOutputDir' (defined by outputFile of $task) contains or " +
"matches the project root directory '${task.project.rootDir}'.\n" +
"Gradle will not be able to build the project because of the root directory lock.\n" +
"To fix this, consider using the default outputFile location instead of providing it explicitly."
)
task.destinationDir = taskOutputDir
}
val klibModuleName = target.project.klibModuleName(baseName)
freeCompilerArgs = freeCompilerArgs + "$MODULE_NAME=$klibModuleName"