From 80ce3a5cf8faf40da8763dd8e539a72469d12111 Mon Sep 17 00:00:00 2001 From: Konstantin Tskhovrebov Date: Fri, 14 May 2021 12:47:21 +0300 Subject: [PATCH] Delete umbrella Apple framework tasks and register concrete tasks. #KT-46680 --- .../kotlin/gradle/AppleFrameworkIT.kt | 14 ++-- .../plugin/mpp/KotlinMultiplatformPlugin.kt | 3 - .../plugin/mpp/apple/AppleXcodeTasks.kt | 83 ++++++------------- .../native/KotlinNativeTargetConfigurator.kt | 8 +- 4 files changed, 37 insertions(+), 71 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AppleFrameworkIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AppleFrameworkIT.kt index fdeb549d63d..5733df61bd7 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AppleFrameworkIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AppleFrameworkIT.kt @@ -33,14 +33,14 @@ class AppleFrameworkIT : KotlinAndroid36GradleIT() { "SDK_NAME" to "iphoneos123" ) ) - build("assembleAppleFrameworkForXcode", options = options) { + build("assembleSharedDebugAppleFrameworkForXcodeIosArm64", options = options) { assertSuccessful() assertTasksExecuted(":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64") assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework") assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework.dSYM") } - build("assembleAppleFrameworkForXcode", options = options) { + build("assembleSharedDebugAppleFrameworkForXcodeIosArm64", options = options) { assertSuccessful() assertTasksUpToDate(":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64") assertFileExists("/shared/build/xcode-frameworks/debug/iphoneos123/shared.framework") @@ -55,8 +55,8 @@ class AppleFrameworkIT : KotlinAndroid36GradleIT() { build("tasks") { assertSuccessful() assertTasksNotRegistered( - ":shared:assembleAppleFrameworkForXcode", - ":shared:embedAndSignAppleFrameworkForXcode" + ":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64", + ":shared:embedAndSignSharedAppleFrameworkForXcode" ) } } @@ -77,9 +77,8 @@ class AppleFrameworkIT : KotlinAndroid36GradleIT() { build("tasks", options = options) { assertSuccessful() assertTasksRegistered( - ":shared:assembleAppleFrameworkForXcode", ":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64", - ":shared:embedAndSignAppleFrameworkForXcode" + ":shared:embedAndSignSharedAppleFrameworkForXcode" ) assertTasksNotRegistered(":shared:assembleSharedDebugAppleFrameworkForXcodeIosX64") } @@ -98,11 +97,10 @@ class AppleFrameworkIT : KotlinAndroid36GradleIT() { build("tasks", options = options) { assertSuccessful() assertTasksRegistered( - ":shared:assembleAppleFrameworkForXcode", ":shared:assembleSharedDebugAppleFrameworkForXcodeIosArm64", ) assertTasksNotRegistered( - ":shared:embedAndSignAppleFrameworkForXcode", + ":shared:embedAndSignSharedAppleFrameworkForXcode", ":shared:assembleSharedDebugAppleFrameworkForXcodeIosX64" ) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt index e52aa0668cc..3940c358365 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/KotlinMultiplatformPlugin.kt @@ -26,7 +26,6 @@ import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension import org.jetbrains.kotlin.gradle.internal.customizeKotlinDependencies import org.jetbrains.kotlin.gradle.plugin.* 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.DefaultLanguageSettingsBuilder import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService @@ -107,8 +106,6 @@ class KotlinMultiplatformPlugin : Plugin { exportProjectStructureMetadataForOtherBuilds(project) - project.registerEmbedAndSignAppleFrameworkTask() - SingleActionPerBuild.run(project.rootProject, "cleanup-processed-metadata") { if (isConfigurationCacheAvailable(project.gradle)) { BuildEventsListenerRegistryHolder.getInstance(project).listenerRegistry!!.onTaskCompletion( diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt index 2a7e9950afb..9c63b92ae66 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt @@ -5,19 +5,13 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.apple -import org.gradle.api.NamedDomainObjectCollection import org.gradle.api.Project -import org.gradle.api.Task import org.gradle.api.plugins.BasePlugin import org.gradle.api.tasks.Copy 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.KotlinNativeTarget import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType 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.utils.lowerCamelCaseName import org.jetbrains.kotlin.konan.target.KonanTarget @@ -72,8 +66,8 @@ private object XcodeEnvironment { val sign: String? get() = System.getenv("EXPANDED_CODE_SIGN_IDENTITY") } -internal fun Project.registerAssembleAppleFrameworkTask(framework: Framework) { - if (!framework.konanTarget.family.isAppleFamily || !framework.konanTarget.enabledOnCurrentHost) return +private fun Project.registerAssembleAppleFrameworkTask(framework: Framework): TaskProvider? { + if (!framework.konanTarget.family.isAppleFamily || !framework.konanTarget.enabledOnCurrentHost) return null val frameworkBuildType = framework.buildType val frameworkTarget = framework.target @@ -102,55 +96,46 @@ internal fun Project.registerAssembleAppleFrameworkTask(framework: Framework) { "('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( - registerTask(frameworkTaskName) { task -> - task.group = BasePlugin.BUILD_GROUP - task.description = "Packs $frameworkBuildType ${frameworkTarget.name} framework for Xcode" - task.dependsOn(framework.linkTaskName) - task.from(framework.outputDirectory) - task.into(appleFrameworkDir(envFrameworkSearchDir)) - } - ) + return registerTask(frameworkTaskName) { task -> + task.group = BasePlugin.BUILD_GROUP + task.description = "Packs $frameworkBuildType ${frameworkTarget.name} framework for Xcode" + task.dependsOn(framework.linkTaskName) + task.from(framework.outputDirectory) + task.into(appleFrameworkDir(envFrameworkSearchDir)) + } } -private const val UMBRELLA_ASSEMBLE_APPLE_FRAMEWORK = "assembleAppleFrameworkForXcode" -private val Project.umbrellaAssembleAppleFrameworkTask: TaskProvider - get() = locateOrRegisterTask(UMBRELLA_ASSEMBLE_APPLE_FRAMEWORK) { - it.group = "build" - it.description = "Build all frameworks as requested by Xcode's environment variables" - } +internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework) { + val assembleTask = registerAssembleAppleFrameworkTask(framework) ?: return -private const val EMBED_AND_SIGN_APPLE_FRAMEWORK = "embedAndSignAppleFrameworkForXcode" -internal fun Project.registerEmbedAndSignAppleFrameworkTask() { val envBuildType = XcodeEnvironment.buildType val envTarget = XcodeEnvironment.target val envEmbeddedFrameworksDir = XcodeEnvironment.embeddedFrameworksDir val envFrameworkSearchDir = XcodeEnvironment.frameworkSearchDir val envSign = XcodeEnvironment.sign + val frameworkTaskName = lowerCamelCaseName("embedAndSign", framework.baseName, "AppleFrameworkForXcode") + if (envBuildType == null || envTarget == null || envEmbeddedFrameworksDir == null || envFrameworkSearchDir == null) { 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)" ) return } - registerTask(EMBED_AND_SIGN_APPLE_FRAMEWORK) { task -> + if (framework.buildType != envBuildType || framework.konanTarget != envTarget) return + + registerTask(frameworkTaskName) { task -> 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? = - multiplatformExtensionOrNull?.targets - ?.withType(KotlinNativeTarget::class.java) - ?.matching { it.konanTarget == envTarget } - - task.dependsOn(UMBRELLA_ASSEMBLE_APPLE_FRAMEWORK) + task.dependsOn(assembleTask) task.inputs.apply { property("type", envBuildType) property("target", envTarget) @@ -158,33 +143,19 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask() { property("sign", envSign) } - task.onlyIf { !appleTargets.isNullOrEmpty() } - task.from(appleFrameworkDir(envFrameworkSearchDir)) { spec -> - appleTargets?.all { target -> - target.binaries.withType(Framework::class.java) - .matching { f -> f.buildType == envBuildType } - .all { framework -> - spec.include(framework.outputFile.name + "/**") - } - } + spec.include(framework.outputFile.name + "/**") } task.into(envEmbeddedFrameworksDir) if (envSign != null) { task.doLast { - appleTargets?.all { target -> - target.binaries.withType(Framework::class.java) - .matching { f -> f.buildType == envBuildType } - .all { framework -> - val binary = envEmbeddedFrameworksDir - .resolve(framework.outputFile.name) - .resolve(framework.outputFile.nameWithoutExtension) - exec { - it.commandLine("codesign", "--force", "--sign", envSign, "--", binary) - } - } + val binary = envEmbeddedFrameworksDir + .resolve(framework.outputFile.name) + .resolve(framework.outputFile.nameWithoutExtension) + exec { + it.commandLine("codesign", "--force", "--sign", envSign, "--", binary) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt index 8c54cec6120..92aa8b793af 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/native/KotlinNativeTargetConfigurator.kt @@ -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.PropertiesProvider.Companion.KOTLIN_NATIVE_IGNORE_INCORRECT_DEPENDENCIES 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.targets.metadata.isKotlinGranularMetadataEnabled import org.jetbrains.kotlin.gradle.targets.native.* @@ -243,7 +243,7 @@ open class KotlinNativeTargetConfigurator : AbstractKotl configureCInterops(target) if (target.konanTarget.family.isAppleFamily) { - registerAssembleAppleFrameworkTasks(target) + registerEmbedAndSignAppleFrameworkTasks(target) } if (PropertiesProvider(target.project).ignoreIncorrectNativeDependencies != true) { @@ -360,10 +360,10 @@ open class KotlinNativeTargetConfigurator : AbstractKotl } } - private fun registerAssembleAppleFrameworkTasks(target: KotlinNativeTarget) { + private fun registerEmbedAndSignAppleFrameworkTasks(target: KotlinNativeTarget) { val project = target.project target.binaries.withType(Framework::class.java).all { framework -> - project.registerAssembleAppleFrameworkTask(framework) + project.registerEmbedAndSignAppleFrameworkTask(framework) } }