[Gradle] Use ProjectLayout in execution phase instead of Project.buildDir

It gives more flexibility during execution phase. Since `buildDir` is
not sealed in cached task state. But instantiated during the execution
phase.

^KT-43293
This commit is contained in:
Anton Lakotka
2022-08-03 08:38:14 +02:00
committed by Space
parent 656d823048
commit e07ef85e91
4 changed files with 30 additions and 13 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.gradle.targets.native.internal
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.ProjectLayout
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
@@ -39,6 +40,7 @@ internal open class CInteropCommonizerTask
@Inject constructor(
private val objectFactory: ObjectFactory,
private val execOperations: ExecOperations,
private val projectLayout: ProjectLayout
) : AbstractCInteropCommonizerTask() {
internal class CInteropGist(
@@ -80,7 +82,7 @@ internal open class CInteropCommonizerTask
}
override val outputDirectory: File = project.buildDir.resolve("classes/kotlin/commonizer")
override val outputDirectory: File get() = projectLayout.buildDirectory.get().asFile.resolve("classes/kotlin/commonizer")
@get:Internal
internal val kotlinPluginVersion: Property<String> = objectFactory
@@ -19,6 +19,7 @@ import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileCollection
import org.gradle.api.file.FileTree
import org.gradle.api.file.ProjectLayout
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
@@ -144,6 +145,10 @@ abstract class AbstractKotlinNativeCompile<
@Inject constructor(
private val objectFactory: ObjectFactory
): AbstractKotlinCompileTool<M>(objectFactory) {
@get:Inject
protected abstract val projectLayout: ProjectLayout
@get:Internal
abstract val compilation: K
@@ -294,10 +299,7 @@ abstract class AbstractKotlinNativeCompile<
}
@get:Internal
internal val manifestFile: File by lazy {
val inputManifestFile = project.buildDir.resolve("tmp/$name/inputManifest")
inputManifestFile
}
internal val manifestFile: File get() = projectLayout.buildDirectory.asFile.get().resolve("tmp/$name/inputManifest")
}
// Remove it once actual K2NativeCompilerArguments will be available without 'kotlin.native.enabled = true' flag
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.gradle.targets.native.tasks.artifact
import org.gradle.api.Action
import org.gradle.api.DefaultTask
import org.gradle.api.file.FileCollection
import org.gradle.api.file.ProjectLayout
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.*
import org.gradle.process.ExecOperations
@@ -28,19 +29,18 @@ open class KotlinNativeLinkArtifactTask @Inject constructor(
@get:Input val konanTarget: KonanTarget,
@get:Input val outputKind: CompilerOutputKind,
private val objectFactory: ObjectFactory,
private val execOperations: ExecOperations
private val execOperations: ExecOperations,
private val projectLayout: ProjectLayout
) : DefaultTask() {
@get:Input
var baseName: String = project.name
private val buildDir = project.buildDir
private val defaultDestinationDir: File get() {
val kind = outputKind.visibleName
val target = konanTarget.visibleName
val type = if (debuggable) "debug" else "release"
return buildDir.resolve("out/$kind/$target/$type")
return projectLayout.buildDirectory.get().asFile.resolve("out/$kind/$target/$type")
}
private var customDestinationDir: File? = null
@@ -9,6 +9,7 @@ import com.android.build.gradle.BaseExtension
import org.gradle.api.DefaultTask
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.file.ProjectLayout
import org.gradle.api.internal.GeneratedSubclass
import org.gradle.api.tasks.*
import org.jetbrains.kotlin.compilerRunner.konanVersion
@@ -91,16 +92,28 @@ internal val GradleKpmModule.buildKotlinToolingMetadataTask: TaskProvider<BuildK
abstract class BuildKotlinToolingMetadataTask : DefaultTask() {
abstract class FromKpmModule
@Inject constructor (@get:Internal val module: GradleKpmModule) : BuildKotlinToolingMetadataTask() {
@Inject constructor (
@get:Internal
val module: GradleKpmModule,
private val projectLayout: ProjectLayout
) : BuildKotlinToolingMetadataTask() {
override val outputDirectory: File = project.buildDir.resolve("kotlinToolingMetadata").resolve(module.name)
override val outputDirectory: File get() = projectLayout
.buildDirectory
.get()
.asFile
.resolve("kotlinToolingMetadata")
.resolve(module.name)
override fun buildKotlinToolingMetadata() = module.getKotlinToolingMetadata()
}
abstract class FromKotlinExtension : BuildKotlinToolingMetadataTask() {
abstract class FromKotlinExtension
@Inject constructor(
private val projectLayout: ProjectLayout
) : BuildKotlinToolingMetadataTask() {
override val outputDirectory: File = project.buildDir.resolve("kotlinToolingMetadata")
override val outputDirectory: File get() = projectLayout.buildDirectory.get().asFile.resolve("kotlinToolingMetadata")
override fun buildKotlinToolingMetadata() = project.kotlinExtension.getKotlinToolingMetadata()
}