From 06960394b7ed8e68de6cb7b1d2c8177b7e4b3c9a Mon Sep 17 00:00:00 2001 From: Artem Daugel-Dauge Date: Mon, 11 Mar 2024 17:57:57 +0100 Subject: [PATCH] [Gradle] Fix issues with EmbedAndSignUsedWithPodDependencies diagnostic Emit diagnostic right after task graph had been formed instead of waiting for embedAndSign execution (^KT-66445,^KT-66446) Verification Pending --- .../kotlin/gradle/native/CocoaPodsIT.kt | 50 +++++++++++++++++++ .../plugin/mpp/apple/AppleXcodeTasks.kt | 3 +- .../native/cocoapods/KotlinCocoapodsPlugin.kt | 15 +++--- 3 files changed, 57 insertions(+), 11 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt index 0661b23c41a..e04c54c087e 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/CocoaPodsIT.kt @@ -21,8 +21,13 @@ import org.jetbrains.kotlin.gradle.util.runProcess import org.junit.jupiter.api.BeforeAll import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.condition.OS +import org.junit.jupiter.api.extension.ExtensionContext import org.junit.jupiter.api.io.TempDir +import org.junit.jupiter.params.ParameterizedTest +import org.junit.jupiter.params.provider.Arguments +import org.junit.jupiter.params.provider.ArgumentsSource import java.nio.file.Path +import java.util.stream.Stream import java.util.zip.ZipFile import kotlin.io.path.* import kotlin.test.assertContains @@ -1059,6 +1064,51 @@ class CocoaPodsIT : KGPBaseTest() { } } + internal class GradleAndIsStaticArgumentsProvider : GradleArgumentsProvider() { + override fun provideArguments(context: ExtensionContext): Stream { + return super.provideArguments(context).flatMap { arguments -> + val gradleVersion = arguments.get().first() + Stream.of(true, false).map { isStatic -> + Arguments.of(gradleVersion, isStatic) + } + } + } + } + + @DisplayName("Build fails when embedAndSign with non-pod framework is used with pod-dependencies") + @ParameterizedTest(name = "{displayName} with {0} and isStatic={1}") + @ArgumentsSource(GradleAndIsStaticArgumentsProvider::class) + fun testEmbedAndSignOtherFrameworkNotUsedWithPodDepsDiagnostic(gradleVersion: GradleVersion, isStatic: Boolean, @TempDir tmp: Path) { + nativeProjectWithCocoapodsAndIosAppPodFile( + gradleVersion = gradleVersion, + environmentVariables = EnvironmentalVariables( + "CONFIGURATION" to "debug", + "SDK_NAME" to "iphoneos123", + "ARCHS" to "arm64", + "TARGET_BUILD_DIR" to tmp.absolutePathString(), + "FRAMEWORKS_FOLDER_PATH" to "frameworks", + "BUILT_PRODUCTS_DIR" to tmp.absolutePathString(), + ) + ) { + + buildGradleKts.addKotlinBlock(""" + iosArm64() + + targets.withType().configureEach { + binaries.framework { + isStatic = $isStatic + } + } + """.trimIndent()) + + buildGradleKts.addCocoapodsBlock("""pod("Base64", version="1.1.2")""") + + buildAndFail(":embedAndSignAppleFrameworkForXcode") { + assertHasDiagnostic(CocoapodsPluginDiagnostics.EmbedAndSignUsedWithPodDependencies) + } + } + } + private fun TestProject.buildAndFailWithCocoapodsWrapper( vararg buildArguments: String, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt index fc5bf402e73..2f915963279 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt @@ -17,7 +17,6 @@ import org.gradle.work.DisableCachingByDefault import org.jetbrains.kotlin.gradle.dsl.KotlinNativeBinaryContainer import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics -import org.jetbrains.kotlin.gradle.plugin.diagnostics.UsesKotlinToolingDiagnostics import org.jetbrains.kotlin.gradle.plugin.diagnostics.reportDiagnostic import org.jetbrains.kotlin.gradle.plugin.mpp.Framework import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType @@ -374,4 +373,4 @@ internal abstract class FrameworkCopy : DefaultTask() { } @DisableCachingByDefault(because = "Caching breaks symlinks inside frameworks") -internal abstract class EmbedAndSignTask : FrameworkCopy(), UsesKotlinToolingDiagnostics +internal abstract class EmbedAndSignTask : FrameworkCopy() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt index df27a11794e..adea195861d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/native/cocoapods/KotlinCocoapodsPlugin.kt @@ -813,19 +813,16 @@ open class KotlinCocoapodsPlugin : Plugin { } - private fun checkEmbedAndSignNotUsedTogetherWithPodDependencies(project: Project, kotlinExtension: KotlinMultiplatformExtension, cocoapodsExtension: CocoapodsExtension) { + private fun checkEmbedAndSignNotUsedTogetherWithPodDependencies(project: Project, cocoapodsExtension: CocoapodsExtension) { cocoapodsExtension.pods.all { SingleActionPerProject.run(project, "assertEmbedAndSignNotUsedTogetherWithPodDependencies") { - kotlinExtension.targets.withType().all { target -> - target.binaries.withType().all { - project.tasks.withType().all { embedAndSignTask -> - embedAndSignTask.doFirst { - embedAndSignTask.reportDiagnostic(CocoapodsPluginDiagnostics.EmbedAndSignUsedWithPodDependencies()) - } + project.tasks.withType().all { embedAndSignTask -> + project.gradle.taskGraph.whenReady { taskGraph -> + if (taskGraph.hasTask(embedAndSignTask)) { + project.reportDiagnostic(CocoapodsPluginDiagnostics.EmbedAndSignUsedWithPodDependencies()) } } } - } } } @@ -888,7 +885,7 @@ open class KotlinCocoapodsPlugin : Plugin { createInterops(project, kotlinExtension, cocoapodsExtension) configureLinkingOptions(project, cocoapodsExtension) checkLinkOnlyNotUsedWithStaticFramework(project, cocoapodsExtension) - checkEmbedAndSignNotUsedTogetherWithPodDependencies(project, kotlinExtension, cocoapodsExtension) + checkEmbedAndSignNotUsedTogetherWithPodDependencies(project, cocoapodsExtension) } }