From 117cfc763ad513e8b8dec1918650da9be67d3488 Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Thu, 18 Feb 2021 10:48:41 +0100 Subject: [PATCH] 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 --- .../kotlin/gradle/plugin/KotlinPlugin.kt | 21 --------------- .../js/ir/KotlinJsIrTargetConfigurator.kt | 26 +++++++++++++++---- 2 files changed, 21 insertions(+), 26 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt index b0880333037..1e76b2507fc 100755 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPlugin.kt @@ -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 - } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt index ae2d66cc2bc..ac7c9d50128 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/ir/KotlinJsIrTargetConfigurator.kt @@ -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"