[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.BeforeAll
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.condition.OS 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.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.nio.file.Path
import java.util.stream.Stream
import java.util.zip.ZipFile import java.util.zip.ZipFile
import kotlin.io.path.* import kotlin.io.path.*
import kotlin.test.assertContains 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( private fun TestProject.buildAndFailWithCocoapodsWrapper(
vararg buildArguments: String, vararg buildArguments: String,
@@ -17,7 +17,6 @@ import org.gradle.work.DisableCachingByDefault
import org.jetbrains.kotlin.gradle.dsl.KotlinNativeBinaryContainer import org.jetbrains.kotlin.gradle.dsl.KotlinNativeBinaryContainer
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.diagnostics.KotlinToolingDiagnostics 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.diagnostics.reportDiagnostic
import org.jetbrains.kotlin.gradle.plugin.mpp.Framework import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
@@ -374,4 +373,4 @@ internal abstract class FrameworkCopy : DefaultTask() {
} }
@DisableCachingByDefault(because = "Caching breaks symlinks inside frameworks") @DisableCachingByDefault(because = "Caching breaks symlinks inside frameworks")
internal abstract class EmbedAndSignTask : FrameworkCopy(), UsesKotlinToolingDiagnostics internal abstract class EmbedAndSignTask : FrameworkCopy()
@@ -813,19 +813,16 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
} }
private fun checkEmbedAndSignNotUsedTogetherWithPodDependencies(project: Project, kotlinExtension: KotlinMultiplatformExtension, cocoapodsExtension: CocoapodsExtension) { private fun checkEmbedAndSignNotUsedTogetherWithPodDependencies(project: Project, cocoapodsExtension: CocoapodsExtension) {
cocoapodsExtension.pods.all { cocoapodsExtension.pods.all {
SingleActionPerProject.run(project, "assertEmbedAndSignNotUsedTogetherWithPodDependencies") { SingleActionPerProject.run(project, "assertEmbedAndSignNotUsedTogetherWithPodDependencies") {
kotlinExtension.targets.withType<KotlinNativeTarget>().all { target -> project.tasks.withType<EmbedAndSignTask>().all { embedAndSignTask ->
target.binaries.withType<Framework>().all { project.gradle.taskGraph.whenReady { taskGraph ->
project.tasks.withType<EmbedAndSignTask>().all { embedAndSignTask -> if (taskGraph.hasTask(embedAndSignTask)) {
embedAndSignTask.doFirst { project.reportDiagnostic(CocoapodsPluginDiagnostics.EmbedAndSignUsedWithPodDependencies())
embedAndSignTask.reportDiagnostic(CocoapodsPluginDiagnostics.EmbedAndSignUsedWithPodDependencies())
}
} }
} }
} }
} }
} }
} }
@@ -888,7 +885,7 @@ open class KotlinCocoapodsPlugin : Plugin<Project> {
createInterops(project, kotlinExtension, cocoapodsExtension) createInterops(project, kotlinExtension, cocoapodsExtension)
configureLinkingOptions(project, cocoapodsExtension) configureLinkingOptions(project, cocoapodsExtension)
checkLinkOnlyNotUsedWithStaticFramework(project, cocoapodsExtension) checkLinkOnlyNotUsedWithStaticFramework(project, cocoapodsExtension)
checkEmbedAndSignNotUsedTogetherWithPodDependencies(project, kotlinExtension, cocoapodsExtension) checkEmbedAndSignNotUsedTogetherWithPodDependencies(project, cocoapodsExtension)
} }
} }