[Gradle] add rootOutputDirectoryProperty to NativeDistributionCommonizerTask
And read commonized klibs in execution time only.
it is possible only when rootOutputDirectoryProperty is marked as
OutputDirectory.
```kotlin
class Producer {
@get:OutputDirectory
val foo: RegularFileProperty
@get:Internal
val bar: RegularFileProperty
}
val foo = producer.flatMap { it.foo.map { it.listFiles() } }
val bar = producer.flatMap { it.bar.map { it.listFiles() } }
```
`foo` file collection will be evaluated at execution time.
Because `Producer.foo` is an OutputDirectory and its content unknown
during configuration time.
But `bar` file collection will be evaluated at configuration time.
Because according to gradle model it is not Output and therefore
its content can be evaluated before task execution.
^KT-61359 Verification Pending
This commit is contained in:
committed by
Space Team
parent
2111bfae40
commit
c08fb1cae6
+1
@@ -91,6 +91,7 @@ open class CommonizerIT : KGPBaseTest() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@DisplayName("KT-61359: commonize native distribution and compile with configuration cache")
|
@DisplayName("KT-61359: commonize native distribution and compile with configuration cache")
|
||||||
|
@GradleTestVersions(minVersion = TestVersions.Gradle.G_7_4)
|
||||||
@GradleTest
|
@GradleTest
|
||||||
fun testCleanCommonizationWithConfigurationCache(gradleVersion: GradleVersion) {
|
fun testCleanCommonizationWithConfigurationCache(gradleVersion: GradleVersion) {
|
||||||
project("commonizeNativeDistributionWithConfigurationCache", gradleVersion) {
|
project("commonizeNativeDistributionWithConfigurationCache", gradleVersion) {
|
||||||
|
|||||||
+1
-1
@@ -23,7 +23,7 @@ internal object IdeCommonizedNativePlatformDependencyResolver :
|
|||||||
val project = sourceSet.project
|
val project = sourceSet.project
|
||||||
val commonizerTarget = sourceSet.commonizerTarget.getOrThrow() as? SharedCommonizerTarget ?: return emptySet()
|
val commonizerTarget = sourceSet.commonizerTarget.getOrThrow() as? SharedCommonizerTarget ?: return emptySet()
|
||||||
val commonizerTask = project.commonizeNativeDistributionTask?.get() ?: return emptySet()
|
val commonizerTask = project.commonizeNativeDistributionTask?.get() ?: return emptySet()
|
||||||
val outputDirectory = resolveCommonizedDirectory(commonizerTask.rootOutputDirectory, commonizerTarget)
|
val outputDirectory = resolveCommonizedDirectory(commonizerTask.rootOutputDirectoryProperty.get().asFile, commonizerTarget)
|
||||||
|
|
||||||
return outputDirectory.listFiles().orEmpty()
|
return outputDirectory.listFiles().orEmpty()
|
||||||
.filter { it.isDirectory || it.extension == KLIB_FILE_EXTENSION }
|
.filter { it.isDirectory || it.extension == KLIB_FILE_EXTENSION }
|
||||||
|
|||||||
+1
-1
@@ -165,7 +165,7 @@ internal val Project.cleanNativeDistributionCommonizerTask: TaskProvider<CleanNa
|
|||||||
group = "interop"
|
group = "interop"
|
||||||
description = "Deletes all previously commonized klib's from the Kotlin/Native distribution"
|
description = "Deletes all previously commonized klib's from the Kotlin/Native distribution"
|
||||||
|
|
||||||
commonizerDirectory.set(commonizeNativeDistributionTask.map { it.rootOutputDirectory })
|
commonizerDirectory.set(commonizeNativeDistributionTask.flatMap { it.rootOutputDirectoryProperty.asFile })
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-3
@@ -61,7 +61,13 @@ internal fun Project.setupKotlinNativePlatformDependencies() {
|
|||||||
internal fun Project.getNativeDistributionDependencies(target: CommonizerTarget): FileCollection {
|
internal fun Project.getNativeDistributionDependencies(target: CommonizerTarget): FileCollection {
|
||||||
return when (target) {
|
return when (target) {
|
||||||
is LeafCommonizerTarget -> getOriginalPlatformLibrariesFor(target)
|
is LeafCommonizerTarget -> getOriginalPlatformLibrariesFor(target)
|
||||||
is SharedCommonizerTarget -> commonizeNativeDistributionTask?.get()?.getCommonizedPlatformLibrariesFor(target) ?: project.files()
|
is SharedCommonizerTarget -> {
|
||||||
|
val commonizerTaskProvider = commonizeNativeDistributionTask ?: return project.files()
|
||||||
|
val commonizedLibrariesProvider = commonizerTaskProvider.flatMap { task ->
|
||||||
|
task.rootOutputDirectoryProperty.map { getCommonizedPlatformLibrariesFor(it.asFile, target) }
|
||||||
|
}
|
||||||
|
project.files(commonizedLibrariesProvider)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,9 +85,9 @@ private fun Project.getOriginalPlatformLibrariesFor(target: LeafCommonizerTarget
|
|||||||
konanDistribution.platformLibsDir.resolve(target.konanTarget.name).listLibraryFiles().toSet()
|
konanDistribution.platformLibsDir.resolve(target.konanTarget.name).listLibraryFiles().toSet()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun NativeDistributionCommonizerTask.getCommonizedPlatformLibrariesFor(target: SharedCommonizerTarget): FileCollection {
|
private fun getCommonizedPlatformLibrariesFor(rootOutputDirectory: File, target: SharedCommonizerTarget): List<File> {
|
||||||
val targetOutputDirectory = CommonizerOutputFileLayout.resolveCommonizedDirectory(rootOutputDirectory, target)
|
val targetOutputDirectory = CommonizerOutputFileLayout.resolveCommonizedDirectory(rootOutputDirectory, target)
|
||||||
return project.filesProvider { targetOutputDirectory.listLibraryFiles() }.builtBy(this)
|
return targetOutputDirectory.listLibraryFiles()
|
||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun Project.addDependencies(
|
private suspend fun Project.addDependencies(
|
||||||
|
|||||||
+27
-12
@@ -8,6 +8,8 @@ package org.jetbrains.kotlin.gradle.targets.native.internal
|
|||||||
import org.gradle.api.DefaultTask
|
import org.gradle.api.DefaultTask
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.gradle.api.file.ConfigurableFileCollection
|
import org.gradle.api.file.ConfigurableFileCollection
|
||||||
|
import org.gradle.api.file.ProjectLayout
|
||||||
|
import org.gradle.api.file.RegularFileProperty
|
||||||
import org.gradle.api.model.ObjectFactory
|
import org.gradle.api.model.ObjectFactory
|
||||||
import org.gradle.api.provider.ListProperty
|
import org.gradle.api.provider.ListProperty
|
||||||
import org.gradle.api.provider.Property
|
import org.gradle.api.provider.Property
|
||||||
@@ -15,6 +17,7 @@ import org.gradle.api.provider.Provider
|
|||||||
import org.gradle.api.tasks.Classpath
|
import org.gradle.api.tasks.Classpath
|
||||||
import org.gradle.api.tasks.Input
|
import org.gradle.api.tasks.Input
|
||||||
import org.gradle.api.tasks.Internal
|
import org.gradle.api.tasks.Internal
|
||||||
|
import org.gradle.api.tasks.OutputDirectory
|
||||||
import org.gradle.api.tasks.TaskAction
|
import org.gradle.api.tasks.TaskAction
|
||||||
import org.gradle.process.ExecOperations
|
import org.gradle.process.ExecOperations
|
||||||
import org.gradle.work.DisableCachingByDefault
|
import org.gradle.work.DisableCachingByDefault
|
||||||
@@ -45,6 +48,7 @@ internal abstract class NativeDistributionCommonizerTask
|
|||||||
@Inject constructor(
|
@Inject constructor(
|
||||||
private val objectFactory: ObjectFactory,
|
private val objectFactory: ObjectFactory,
|
||||||
private val execOperations: ExecOperations,
|
private val execOperations: ExecOperations,
|
||||||
|
private val projectLayout: ProjectLayout,
|
||||||
) : DefaultTask(), UsesBuildMetricsService {
|
) : DefaultTask(), UsesBuildMetricsService {
|
||||||
|
|
||||||
private val konanHome = project.file(project.konanHome)
|
private val konanHome = project.file(project.konanHome)
|
||||||
@@ -80,19 +84,30 @@ internal abstract class NativeDistributionCommonizerTask
|
|||||||
private val additionalSettings = project.additionalCommonizerSettings
|
private val additionalSettings = project.additionalCommonizerSettings
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
internal val rootOutputDirectory: File = project.file {
|
@Deprecated("Use lazy replacement", replaceWith = ReplaceWith("rootOutputDirectoryProperty.get().asFile"))
|
||||||
project.file(project.konanHome)
|
internal val rootOutputDirectory: File get() = rootOutputDirectoryProperty.asFile.get()
|
||||||
.resolve(KONAN_DISTRIBUTION_KLIB_DIR)
|
|
||||||
.resolve(KONAN_DISTRIBUTION_COMMONIZED_LIBS_DIR)
|
|
||||||
.resolve(URLEncoder.encode(project.getKotlinPluginVersion(), Charsets.UTF_8.name()))
|
|
||||||
}
|
|
||||||
|
|
||||||
private val commonizerCache = NativeDistributionCommonizerCache(
|
@get:OutputDirectory
|
||||||
outputDirectory = rootOutputDirectory,
|
internal val rootOutputDirectoryProperty: RegularFileProperty = objectFactory
|
||||||
konanHome = konanHome,
|
.fileProperty()
|
||||||
logger = logger,
|
.apply {
|
||||||
isCachingEnabled = project.kotlinPropertiesProvider.enableNativeDistributionCommonizationCache
|
set(
|
||||||
)
|
project.file(project.konanHome)
|
||||||
|
.resolve(KONAN_DISTRIBUTION_KLIB_DIR)
|
||||||
|
.resolve(KONAN_DISTRIBUTION_COMMONIZED_LIBS_DIR)
|
||||||
|
.resolve(URLEncoder.encode(project.getKotlinPluginVersion(), Charsets.UTF_8.name()))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private val isCachingEnabled = project.kotlinPropertiesProvider.enableNativeDistributionCommonizationCache
|
||||||
|
|
||||||
|
private val commonizerCache
|
||||||
|
get() = NativeDistributionCommonizerCache(
|
||||||
|
outputDirectory = rootOutputDirectoryProperty.get().asFile,
|
||||||
|
konanHome = konanHome,
|
||||||
|
logger = logger,
|
||||||
|
isCachingEnabled = isCachingEnabled
|
||||||
|
)
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
val metrics: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>> = project.objects
|
val metrics: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>> = project.objects
|
||||||
|
|||||||
Reference in New Issue
Block a user