[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
This commit is contained in:
Artem Daugel-Dauge
2024-03-11 17:57:57 +01:00
committed by Space Team
parent 9851ff1905
commit 06960394b7
3 changed files with 57 additions and 11 deletions
@@ -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<out Arguments> {
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<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget>().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,
@@ -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()
@@ -813,20 +813,17 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
}
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<KotlinNativeTarget>().all { target ->
target.binaries.withType<Framework>().all {
project.tasks.withType<EmbedAndSignTask>().all { embedAndSignTask ->
embedAndSignTask.doFirst {
embedAndSignTask.reportDiagnostic(CocoapodsPluginDiagnostics.EmbedAndSignUsedWithPodDependencies())
project.gradle.taskGraph.whenReady { taskGraph ->
if (taskGraph.hasTask(embedAndSignTask)) {
project.reportDiagnostic(CocoapodsPluginDiagnostics.EmbedAndSignUsedWithPodDependencies())
}
}
}
}
}
}
}
@@ -888,7 +885,7 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
createInterops(project, kotlinExtension, cocoapodsExtension)
configureLinkingOptions(project, cocoapodsExtension)
checkLinkOnlyNotUsedWithStaticFramework(project, cocoapodsExtension)
checkEmbedAndSignNotUsedTogetherWithPodDependencies(project, kotlinExtension, cocoapodsExtension)
checkEmbedAndSignNotUsedTogetherWithPodDependencies(project, cocoapodsExtension)
}
}