[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")
|
||||
@GradleTestVersions(minVersion = TestVersions.Gradle.G_7_4)
|
||||
@GradleTest
|
||||
fun testCleanCommonizationWithConfigurationCache(gradleVersion: GradleVersion) {
|
||||
project("commonizeNativeDistributionWithConfigurationCache", gradleVersion) {
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ internal object IdeCommonizedNativePlatformDependencyResolver :
|
||||
val project = sourceSet.project
|
||||
val commonizerTarget = sourceSet.commonizerTarget.getOrThrow() as? SharedCommonizerTarget ?: 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()
|
||||
.filter { it.isDirectory || it.extension == KLIB_FILE_EXTENSION }
|
||||
|
||||
+1
-1
@@ -165,7 +165,7 @@ internal val Project.cleanNativeDistributionCommonizerTask: TaskProvider<CleanNa
|
||||
group = "interop"
|
||||
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 {
|
||||
return when (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()
|
||||
}
|
||||
|
||||
private fun NativeDistributionCommonizerTask.getCommonizedPlatformLibrariesFor(target: SharedCommonizerTarget): FileCollection {
|
||||
private fun getCommonizedPlatformLibrariesFor(rootOutputDirectory: File, target: SharedCommonizerTarget): List<File> {
|
||||
val targetOutputDirectory = CommonizerOutputFileLayout.resolveCommonizedDirectory(rootOutputDirectory, target)
|
||||
return project.filesProvider { targetOutputDirectory.listLibraryFiles() }.builtBy(this)
|
||||
return targetOutputDirectory.listLibraryFiles()
|
||||
}
|
||||
|
||||
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.Project
|
||||
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.provider.ListProperty
|
||||
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.Input
|
||||
import org.gradle.api.tasks.Internal
|
||||
import org.gradle.api.tasks.OutputDirectory
|
||||
import org.gradle.api.tasks.TaskAction
|
||||
import org.gradle.process.ExecOperations
|
||||
import org.gradle.work.DisableCachingByDefault
|
||||
@@ -45,6 +48,7 @@ internal abstract class NativeDistributionCommonizerTask
|
||||
@Inject constructor(
|
||||
private val objectFactory: ObjectFactory,
|
||||
private val execOperations: ExecOperations,
|
||||
private val projectLayout: ProjectLayout,
|
||||
) : DefaultTask(), UsesBuildMetricsService {
|
||||
|
||||
private val konanHome = project.file(project.konanHome)
|
||||
@@ -80,19 +84,30 @@ internal abstract class NativeDistributionCommonizerTask
|
||||
private val additionalSettings = project.additionalCommonizerSettings
|
||||
|
||||
@get:Internal
|
||||
internal val rootOutputDirectory: File = project.file {
|
||||
project.file(project.konanHome)
|
||||
.resolve(KONAN_DISTRIBUTION_KLIB_DIR)
|
||||
.resolve(KONAN_DISTRIBUTION_COMMONIZED_LIBS_DIR)
|
||||
.resolve(URLEncoder.encode(project.getKotlinPluginVersion(), Charsets.UTF_8.name()))
|
||||
}
|
||||
@Deprecated("Use lazy replacement", replaceWith = ReplaceWith("rootOutputDirectoryProperty.get().asFile"))
|
||||
internal val rootOutputDirectory: File get() = rootOutputDirectoryProperty.asFile.get()
|
||||
|
||||
private val commonizerCache = NativeDistributionCommonizerCache(
|
||||
outputDirectory = rootOutputDirectory,
|
||||
konanHome = konanHome,
|
||||
logger = logger,
|
||||
isCachingEnabled = project.kotlinPropertiesProvider.enableNativeDistributionCommonizationCache
|
||||
)
|
||||
@get:OutputDirectory
|
||||
internal val rootOutputDirectoryProperty: RegularFileProperty = objectFactory
|
||||
.fileProperty()
|
||||
.apply {
|
||||
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
|
||||
val metrics: Property<BuildMetricsReporter<GradleBuildTime, GradleBuildPerformanceMetric>> = project.objects
|
||||
|
||||
Reference in New Issue
Block a user