Delete umbrella Apple framework tasks and register concrete tasks.

#KT-46680
This commit is contained in:
Konstantin Tskhovrebov
2021-05-14 12:47:21 +03:00
committed by teamcityserver
parent 55a9f1a910
commit 80ce3a5cf8
4 changed files with 37 additions and 71 deletions
@@ -33,14 +33,14 @@ class AppleFrameworkIT : KotlinAndroid36GradleIT() {
"SDK_NAME" to "iphoneos123" "SDK_NAME" to "iphoneos123"
) )
) )
build("assembleAppleFrameworkForXcode", options = options) { build("assembleSharedDebugAppleFrameworkForXcodeIosArm64", options = options) {
assertSuccessful() assertSuccessful()
assertTasksExecuted(":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64") assertTasksExecuted(":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64")
assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework") assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework")
assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework.dSYM") assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework.dSYM")
} }
build("assembleAppleFrameworkForXcode", options = options) { build("assembleSharedDebugAppleFrameworkForXcodeIosArm64", options = options) {
assertSuccessful() assertSuccessful()
assertTasksUpToDate(":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64") assertTasksUpToDate(":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64")
assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework") assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework")
@@ -55,8 +55,8 @@ class AppleFrameworkIT : KotlinAndroid36GradleIT() {
build("tasks") { build("tasks") {
assertSuccessful() assertSuccessful()
assertTasksNotRegistered( assertTasksNotRegistered(
":shared:assembleAppleFrameworkForXcode", ":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64",
":shared:embedAndSignAppleFrameworkForXcode" ":shared:embedAndSignSharedAppleFrameworkForXcode"
) )
} }
} }
@@ -77,9 +77,8 @@ class AppleFrameworkIT : KotlinAndroid36GradleIT() {
build("tasks", options = options) { build("tasks", options = options) {
assertSuccessful() assertSuccessful()
assertTasksRegistered( assertTasksRegistered(
":shared:assembleAppleFrameworkForXcode",
":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64", ":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64",
":shared:embedAndSignAppleFrameworkForXcode" ":shared:embedAndSignSharedAppleFrameworkForXcode"
) )
assertTasksNotRegistered(":shared:assembleSharedDebugAppleFrameworkForXcodeIosX64") assertTasksNotRegistered(":shared:assembleSharedDebugAppleFrameworkForXcodeIosX64")
} }
@@ -98,11 +97,10 @@ class AppleFrameworkIT : KotlinAndroid36GradleIT() {
build("tasks", options = options) { build("tasks", options = options) {
assertSuccessful() assertSuccessful()
assertTasksRegistered( assertTasksRegistered(
":shared:assembleAppleFrameworkForXcode",
":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64", ":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64",
) )
assertTasksNotRegistered( assertTasksNotRegistered(
":shared:embedAndSignAppleFrameworkForXcode", ":shared:embedAndSignSharedAppleFrameworkForXcode",
":shared:assembleSharedDebugAppleFrameworkForXcodeIosX64" ":shared:assembleSharedDebugAppleFrameworkForXcodeIosX64"
) )
} }
@@ -26,7 +26,6 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension
import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies
import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.Companion.sourceSetFreeCompilerArgsPropertyName import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin.Companion.sourceSetFreeCompilerArgsPropertyName
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.registerEmbedAndSignAppleFrameworkTask
import org.jetbrains.kotlin.gradle.plugin.sources.* import org.jetbrains.kotlin.gradle.plugin.sources.*
import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.sources.DefaultLanguageSettingsBuilder
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService
@@ -107,8 +106,6 @@ class KotlinMultiplatformPlugin : Plugin<Project> {
exportProjectStructureMetadataForOtherBuilds(project) exportProjectStructureMetadataForOtherBuilds(project)
project.registerEmbedAndSignAppleFrameworkTask()
SingleActionPerBuild.run(project.rootProject, "cleanup-processed-metadata") { SingleActionPerBuild.run(project.rootProject, "cleanup-processed-metadata") {
if (isConfigurationCacheAvailable(project.gradle)) { if (isConfigurationCacheAvailable(project.gradle)) {
BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry!!.onTaskCompletion( BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry!!.onTaskCompletion(
@@ -5,19 +5,13 @@
package org.jetbrains.kotlin.gradle.plugin.mpp.apple package org.jetbrains.kotlin.gradle.plugin.mpp.apple
import org.gradle.api.NamedDomainObjectCollection
import org.gradle.api.Project import org.gradle.api.Project
import org.gradle.api.Task
import org.gradle.api.plugins.BasePlugin import org.gradle.api.plugins.BasePlugin
import org.gradle.api.tasks.Copy import org.gradle.api.tasks.Copy
import org.gradle.api.tasks.TaskProvider import org.gradle.api.tasks.TaskProvider
import org.jetbrains.kotlin.gradle.dsl.multiplatformExtensionOrNull
import org.jetbrains.kotlin.gradle.plugin.mpp.Framework 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.plugin.mpp.NativeBuildType
import org.jetbrains.kotlin.gradle.plugin.mpp.enabledOnCurrentHost import org.jetbrains.kotlin.gradle.plugin.mpp.enabledOnCurrentHost
import org.jetbrains.kotlin.gradle.tasks.dependsOn
import org.jetbrains.kotlin.gradle.tasks.locateOrRegisterTask
import org.jetbrains.kotlin.gradle.tasks.registerTask import org.jetbrains.kotlin.gradle.tasks.registerTask
import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName import org.jetbrains.kotlin.gradle.utils.lowerCamelCaseName
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
@@ -72,8 +66,8 @@ private object XcodeEnvironment {
val sign: String? get() = System.getenv("EXPANDED_CODE_SIGN_IDENTITY") val sign: String? get() = System.getenv("EXPANDED_CODE_SIGN_IDENTITY")
} }
internal fun Project.registerAssembleAppleFrameworkTask(framework: Framework) { private fun Project.registerAssembleAppleFrameworkTask(framework: Framework): TaskProvider<Copy>? {
if (!framework.konanTarget.family.isAppleFamily || !framework.konanTarget.enabledOnCurrentHost) return if (!framework.konanTarget.family.isAppleFamily || !framework.konanTarget.enabledOnCurrentHost) return null
val frameworkBuildType = framework.buildType val frameworkBuildType = framework.buildType
val frameworkTarget = framework.target val frameworkTarget = framework.target
@@ -102,55 +96,46 @@ internal fun Project.registerAssembleAppleFrameworkTask(framework: Framework) {
"('SDK_NAME' and 'CONFIGURATION' not provided)" "('SDK_NAME' and 'CONFIGURATION' not provided)"
) )
} }
return return null
} }
if (frameworkBuildType != envBuildType || frameworkTarget.konanTarget != envTarget) return if (frameworkBuildType != envBuildType || frameworkTarget.konanTarget != envTarget) return null
umbrellaAssembleAppleFrameworkTask.dependsOn( return registerTask(frameworkTaskName) { task ->
registerTask<Copy>(frameworkTaskName) { task -> task.group = BasePlugin.BUILD_GROUP
task.group = BasePlugin.BUILD_GROUP task.description = "Packs $frameworkBuildType ${frameworkTarget.name} framework for Xcode"
task.description = "Packs $frameworkBuildType ${frameworkTarget.name} framework for Xcode" task.dependsOn(framework.linkTaskName)
task.dependsOn(framework.linkTaskName) task.from(framework.outputDirectory)
task.from(framework.outputDirectory) task.into(appleFrameworkDir(envFrameworkSearchDir))
task.into(appleFrameworkDir(envFrameworkSearchDir)) }
}
)
} }
private const val UMBRELLA_ASSEMBLE_APPLE_FRAMEWORK = "assembleAppleFrameworkForXcode" internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework) {
private val Project.umbrellaAssembleAppleFrameworkTask: TaskProvider<Task> val assembleTask = registerAssembleAppleFrameworkTask(framework) ?: return
get() = locateOrRegisterTask(UMBRELLA_ASSEMBLE_APPLE_FRAMEWORK) {
it.group = "build"
it.description = "Build all frameworks as requested by Xcode's environment variables"
}
private const val EMBED_AND_SIGN_APPLE_FRAMEWORK = "embedAndSignAppleFrameworkForXcode"
internal fun Project.registerEmbedAndSignAppleFrameworkTask() {
val envBuildType = XcodeEnvironment.buildType val envBuildType = XcodeEnvironment.buildType
val envTarget = XcodeEnvironment.target val envTarget = XcodeEnvironment.target
val envEmbeddedFrameworksDir = XcodeEnvironment.embeddedFrameworksDir val envEmbeddedFrameworksDir = XcodeEnvironment.embeddedFrameworksDir
val envFrameworkSearchDir = XcodeEnvironment.frameworkSearchDir val envFrameworkSearchDir = XcodeEnvironment.frameworkSearchDir
val envSign = XcodeEnvironment.sign val envSign = XcodeEnvironment.sign
val frameworkTaskName = lowerCamelCaseName("embedAndSign", framework.baseName, "AppleFrameworkForXcode")
if (envBuildType == null || envTarget == null || envEmbeddedFrameworksDir == null || envFrameworkSearchDir == null) { if (envBuildType == null || envTarget == null || envEmbeddedFrameworksDir == null || envFrameworkSearchDir == null) {
logger.debug( logger.debug(
"Not registering $EMBED_AND_SIGN_APPLE_FRAMEWORK, since not called from Xcode " + "Not registering $frameworkTaskName, since not called from Xcode " +
"('SDK_NAME', 'CONFIGURATION', 'TARGET_BUILD_DIR' and 'FRAMEWORKS_FOLDER_PATH' not provided)" "('SDK_NAME', 'CONFIGURATION', 'TARGET_BUILD_DIR' and 'FRAMEWORKS_FOLDER_PATH' not provided)"
) )
return return
} }
registerTask<Copy>(EMBED_AND_SIGN_APPLE_FRAMEWORK) { task -> if (framework.buildType != envBuildType || framework.konanTarget != envTarget) return
registerTask<Copy>(frameworkTaskName) { task ->
task.group = "build" task.group = "build"
task.description = "Embed and sign all frameworks as requested by Xcode's environment variables" task.description = "Embed and sign ${framework.baseName} framework as requested by Xcode's environment variables"
val appleTargets: NamedDomainObjectCollection<KotlinNativeTarget>? = task.dependsOn(assembleTask)
multiplatformExtensionOrNull?.targets
?.withType(KotlinNativeTarget::class.java)
?.matching { it.konanTarget == envTarget }
task.dependsOn(UMBRELLA_ASSEMBLE_APPLE_FRAMEWORK)
task.inputs.apply { task.inputs.apply {
property("type", envBuildType) property("type", envBuildType)
property("target", envTarget) property("target", envTarget)
@@ -158,33 +143,19 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask() {
property("sign", envSign) property("sign", envSign)
} }
task.onlyIf { !appleTargets.isNullOrEmpty() }
task.from(appleFrameworkDir(envFrameworkSearchDir)) { spec -> task.from(appleFrameworkDir(envFrameworkSearchDir)) { spec ->
appleTargets?.all { target -> spec.include(framework.outputFile.name + "/**")
target.binaries.withType(Framework::class.java)
.matching { f -> f.buildType == envBuildType }
.all { framework ->
spec.include(framework.outputFile.name + "/**")
}
}
} }
task.into(envEmbeddedFrameworksDir) task.into(envEmbeddedFrameworksDir)
if (envSign != null) { if (envSign != null) {
task.doLast { task.doLast {
appleTargets?.all { target -> val binary = envEmbeddedFrameworksDir
target.binaries.withType(Framework::class.java) .resolve(framework.outputFile.name)
.matching { f -> f.buildType == envBuildType } .resolve(framework.outputFile.nameWithoutExtension)
.all { framework -> exec {
val binary = envEmbeddedFrameworksDir it.commandLine("codesign", "--force", "--sign", envSign, "--", binary)
.resolve(framework.outputFile.name)
.resolve(framework.outputFile.nameWithoutExtension)
exec {
it.commandLine("codesign", "--force", "--sign", envSign, "--", binary)
}
}
} }
} }
} }
@@ -29,7 +29,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.MAIN_COMPI
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.TEST_COMPILATION_NAME import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation.Companion.TEST_COMPILATION_NAME
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.KOTLIN_NATIVE_IGNORE_INCORRECT_DEPENDENCIES import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.KOTLIN_NATIVE_IGNORE_INCORRECT_DEPENDENCIES
import org.jetbrains.kotlin.gradle.plugin.mpp.* import org.jetbrains.kotlin.gradle.plugin.mpp.*
import org.jetbrains.kotlin.gradle.plugin.mpp.apple.registerAssembleAppleFrameworkTask import org.jetbrains.kotlin.gradle.plugin.mpp.apple.registerEmbedAndSignAppleFrameworkTask
import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.* import org.jetbrains.kotlin.gradle.plugin.mpp.pm20.*
import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled import org.jetbrains.kotlin.gradle.targets.metadata.isKotlinGranularMetadataEnabled
import org.jetbrains.kotlin.gradle.targets.native.* import org.jetbrains.kotlin.gradle.targets.native.*
@@ -243,7 +243,7 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
configureCInterops(target) configureCInterops(target)
if (target.konanTarget.family.isAppleFamily) { if (target.konanTarget.family.isAppleFamily) {
registerAssembleAppleFrameworkTasks(target) registerEmbedAndSignAppleFrameworkTasks(target)
} }
if (PropertiesProvider(target.project).ignoreIncorrectNativeDependencies != true) { if (PropertiesProvider(target.project).ignoreIncorrectNativeDependencies != true) {
@@ -360,10 +360,10 @@ open class KotlinNativeTargetConfigurator<T : KotlinNativeTarget> : AbstractKotl
} }
} }
private fun registerAssembleAppleFrameworkTasks(target: KotlinNativeTarget) { private fun registerEmbedAndSignAppleFrameworkTasks(target: KotlinNativeTarget) {
val project = target.project val project = target.project
target.binaries.withType(Framework::class.java).all { framework -> target.binaries.withType(Framework::class.java).all { framework ->
project.registerAssembleAppleFrameworkTask(framework) project.registerEmbedAndSignAppleFrameworkTask(framework)
} }
} }