[Gradle] Add defaultDestinationDir to FatFrameworkTask

To prevent cycle when updating destinationDirProperty
This commit is contained in:
Anton Lakotka
2023-12-04 15:41:34 +01:00
committed by Space Team
parent 8b335ea051
commit 6eeb459076
4 changed files with 19 additions and 23 deletions
@@ -125,7 +125,7 @@ private fun Project.registerAssembleAppleFrameworkTask(framework: Framework): Ta
needFatFramework -> locateOrRegisterTask<FatFrameworkTask>(frameworkTaskName) { task ->
task.description = "Packs $frameworkBuildType fat framework for Xcode"
task.baseName = framework.baseName
task.destinationDirProperty.convention(appleFrameworkDir(envFrameworkSearchDir))
task.destinationDirProperty.fileProvider(appleFrameworkDir(envFrameworkSearchDir))
task.isEnabled = frameworkBuildType == envBuildType
}.also {
it.configure { task -> task.from(framework) }
@@ -136,7 +136,7 @@ private fun Project.registerAssembleAppleFrameworkTask(framework: Framework): Ta
task.sourceFramework.fileProvider(framework.linkTaskProvider.flatMap { it.outputFile })
task.sourceDsym.fileProvider(dsymFile(task.sourceFramework.mapToFile()))
task.dependsOn(framework.linkTaskProvider)
task.destinationDirectory.set(appleFrameworkDir(envFrameworkSearchDir))
task.destinationDirectory.fileProvider(appleFrameworkDir(envFrameworkSearchDir))
}
}
}
@@ -194,7 +194,7 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework
embedAndSignTask.configure { task ->
val frameworkFile = framework.outputFile
task.dependsOn(assembleTask)
task.sourceFramework.set(File(appleFrameworkDir(envFrameworkSearchDir), frameworkFile.name))
task.sourceFramework.fileProvider(appleFrameworkDir(envFrameworkSearchDir).map { it.resolve(frameworkFile.name) })
task.destinationDirectory.set(envEmbeddedFrameworksDir)
if (envSign != null) {
task.doLast {
@@ -216,8 +216,11 @@ private val Framework.namePrefix: String
outputKind.taskNameClassifier
)
private fun Project.appleFrameworkDir(frameworkSearchDir: File) =
buildDir.resolve("xcode-frameworks").resolve(frameworkSearchDir)
/**
* If [frameworkSearchDir] is absolute use it, otherwise make it relative to buildDir/xcode-frameworks
*/
private fun Project.appleFrameworkDir(frameworkSearchDir: File): Provider<File> =
layout.buildDirectory.dir("xcode-frameworks").map { it.asFile.resolve(frameworkSearchDir) }
/**
* macOS frameworks contain symlinks which are resolved/removed by the Gradle [Copy] task.
@@ -9,20 +9,15 @@ import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle
import org.jetbrains.kotlin.gradle.plugin.internal.artifactTypeAttribute
import org.jetbrains.kotlin.gradle.plugin.launchInStage
import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
import org.jetbrains.kotlin.gradle.tasks.FatFrameworkTask
import org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink
import org.jetbrains.kotlin.gradle.utils.*
import org.jetbrains.kotlin.gradle.utils.copyAttributes
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.util.capitalizeDecapitalize.capitalizeAsciiOnly
import org.jetbrains.kotlin.util.capitalizeDecapitalize.toLowerCaseAsciiOnly
import java.io.File
@@ -112,7 +107,7 @@ private fun Project.createFatFramework(groupDescription: FrameworkGroupDescripti
} else {
tasks.register(fatFrameworkTaskName, FatFrameworkTask::class.java) {
it.baseName = groupDescription.baseName
it.destinationDirProperty.set(it.destinationDirProperty.dir(groupDescription.buildType.name.toLowerCaseAsciiOnly()))
it.destinationDirProperty.set(it.defaultDestinationDir.dir(groupDescription.buildType.name.toLowerCaseAsciiOnly()))
}
}
@@ -7,11 +7,9 @@
package org.jetbrains.kotlin.gradle.tasks
import org.gradle.api.DefaultTask
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileSystemOperations
import org.gradle.api.file.FileTree
import org.gradle.api.file.ProjectLayout
import org.gradle.api.file.*
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Provider
import org.gradle.api.tasks.*
import org.gradle.process.ExecOperations
import org.gradle.work.DisableCachingByDefault
@@ -148,10 +146,13 @@ internal constructor(
@Input
var baseName: String = project.name
@get:Internal
internal val defaultDestinationDir: Provider<Directory> = projectLayout.buildDirectory.dir("fat-framework")
@OutputDirectory
val destinationDirProperty: DirectoryProperty = objectFactory
.directoryProperty()
.convention(projectLayout.buildDirectory.dir("fat-framework"))
.convention(defaultDestinationDir)
/**
* A parent directory for the fat framework.
@@ -8,16 +8,11 @@ package org.jetbrains.kotlin.gradle.utils
import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.file.ConfigurableFileCollection
import org.gradle.api.file.Directory
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.RegularFileProperty
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.ListProperty
import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider
import org.gradle.api.provider.ProviderFactory
import org.gradle.api.provider.SetProperty
import org.gradle.api.provider.ValueSource
import org.gradle.api.provider.ValueSourceParameters
import org.gradle.api.provider.*
import java.io.File
import kotlin.reflect.KProperty
@@ -179,3 +174,5 @@ private abstract class AdhocValueSource<T> : ValueSource<T, AdhocValueSource.Par
return parameters.producingLambda.get().invoke() as T
}
}
internal fun Provider<Directory>.dir(path: String): Provider<Directory> = map { it.dir(path) }