From 2bb155edc1cf769a8acbed0f6b296200b0d3b20c Mon Sep 17 00:00:00 2001 From: "konstantin.tskhovrebov" Date: Mon, 13 Dec 2021 12:27:49 +0100 Subject: [PATCH] KT-50159 Check that all inner frameworks in XCFramework have same names And warn if XCFramework has different name with inner frameworks. #KT-50159 Fixed --- .../kotlin/gradle/native/XCFrameworkIT.kt | 53 ++++++++++++------- .../appleXCFramework/shared/build.gradle.kts | 8 +-- .../plugin/mpp/apple/XCFrameworkTask.kt | 30 +++++++++-- 3 files changed, 66 insertions(+), 25 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/XCFrameworkIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/XCFrameworkIT.kt index b59511cb1bb..75d161f1892 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/XCFrameworkIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/native/XCFrameworkIT.kt @@ -33,30 +33,30 @@ class XCFrameworkIT : BaseGradleIT() { @Test fun `assemble XCFramework for all available ios and watchos targets`() { with(Project("appleXCFramework")) { - build("assembleSdkDebugXCFramework") { + build("assembleSharedDebugXCFramework") { assertSuccessful() assertTasksExecuted(":shared:linkDebugFrameworkIosArm64") assertTasksExecuted(":shared:linkDebugFrameworkIosX64") assertTasksExecuted(":shared:linkDebugFrameworkWatchosArm32") assertTasksExecuted(":shared:linkDebugFrameworkWatchosArm64") assertTasksExecuted(":shared:linkDebugFrameworkWatchosX64") - assertTasksExecuted(":shared:assembleSdkDebugWatchosFatFrameworkForXCFramework") - assertTasksExecuted(":shared:assembleSdkDebugXCFramework") - assertFileExists("/shared/build/XCFrameworks/debug/sdk.xcframework") - assertFileExists("/shared/build/XCFrameworks/debug/sdk.xcframework/ios-arm64/dSYMs/shared.framework.dSYM") - assertFileExists("/shared/build/sdkXCFrameworkTemp/fatframework/debug/watchos/sdk.framework") - assertFileExists("/shared/build/sdkXCFrameworkTemp/fatframework/debug/watchos/sdk.framework.dSYM") + assertTasksExecuted(":shared:assembleDebugWatchosFatFrameworkForSharedXCFramework") + assertTasksExecuted(":shared:assembleSharedDebugXCFramework") + assertFileExists("/shared/build/XCFrameworks/debug/shared.xcframework") + assertFileExists("/shared/build/XCFrameworks/debug/shared.xcframework/ios-arm64/dSYMs/shared.framework.dSYM") + assertFileExists("/shared/build/sharedXCFrameworkTemp/fatframework/debug/watchos/shared.framework") + assertFileExists("/shared/build/sharedXCFrameworkTemp/fatframework/debug/watchos/shared.framework.dSYM") } - build("assembleSdkDebugXCFramework") { + build("assembleSharedDebugXCFramework") { assertSuccessful() assertTasksUpToDate(":shared:linkDebugFrameworkIosArm64") assertTasksUpToDate(":shared:linkDebugFrameworkIosX64") assertTasksUpToDate(":shared:linkDebugFrameworkWatchosArm32") assertTasksUpToDate(":shared:linkDebugFrameworkWatchosArm64") assertTasksUpToDate(":shared:linkDebugFrameworkWatchosX64") - assertTasksUpToDate(":shared:assembleSdkDebugWatchosFatFrameworkForXCFramework") - assertTasksUpToDate(":shared:assembleSdkDebugXCFramework") + assertTasksUpToDate(":shared:assembleDebugWatchosFatFrameworkForSharedXCFramework") + assertTasksUpToDate(":shared:assembleSharedDebugXCFramework") } } } @@ -64,18 +64,19 @@ class XCFrameworkIT : BaseGradleIT() { @Test fun `assemble other XCFramework for ios targets`() { with(Project("appleXCFramework")) { - build("assembleXCFramework") { + build("assembleOtherXCFramework") { assertSuccessful() assertTasksExecuted(":shared:linkReleaseFrameworkIosArm64") assertTasksExecuted(":shared:linkReleaseFrameworkIosX64") - assertTasksExecuted(":shared:assembleSharedReleaseXCFramework") - assertFileExists("/shared/build/XCFrameworks/release/shared.xcframework") - assertFileExists("/shared/build/XCFrameworks/release/shared.xcframework/ios-arm64/dSYMs/shared.framework.dSYM") + assertTasksExecuted(":shared:assembleOtherReleaseXCFramework") + assertFileExists("/shared/build/XCFrameworks/release/other.xcframework") + assertFileExists("/shared/build/XCFrameworks/release/other.xcframework/ios-arm64/dSYMs/shared.framework.dSYM") assertTasksExecuted(":shared:linkDebugFrameworkIosArm64") assertTasksExecuted(":shared:linkDebugFrameworkIosX64") - assertTasksExecuted(":shared:assembleSharedDebugXCFramework") - assertFileExists("/shared/build/XCFrameworks/debug/shared.xcframework") - assertFileExists("/shared/build/XCFrameworks/debug/shared.xcframework/ios-arm64/dSYMs/shared.framework.dSYM") + assertTasksExecuted(":shared:assembleOtherDebugXCFramework") + assertFileExists("/shared/build/XCFrameworks/debug/other.xcframework") + assertFileExists("/shared/build/XCFrameworks/debug/other.xcframework/ios-arm64/dSYMs/shared.framework.dSYM") + assertContains("Name of XCFramework 'other' differs from inner frameworks name 'shared'! Framework renaming is not supported yet") } } } @@ -99,7 +100,7 @@ class XCFrameworkIT : BaseGradleIT() { with(transformProjectWithPluginsDsl("appleXCFramework")) { with(gradleBuildScript("shared")) { var text = readText() - text = text.replace("XCFramework(\"sdk\")", "XCFramework()") + text = text.replace("XCFramework(\"other\")", "XCFramework()") writeText(text) } @@ -109,4 +110,20 @@ class XCFrameworkIT : BaseGradleIT() { } } } + + @Test + fun `check configuration error if XCFramework contains frameworks with different names`() { + with(transformProjectWithPluginsDsl("appleXCFramework")) { + with(gradleBuildScript("shared")) { + var text = readText() + text = text.replaceFirst("baseName = \"shared\"", "baseName = \"awesome\"") + writeText(text) + } + + build("tasks") { + assertFailed() + assertContains("All inner frameworks in XCFramework 'shared' should have same names. But there are two with 'awesome' and 'shared' names") + } + } + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/appleXCFramework/shared/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/appleXCFramework/shared/build.gradle.kts index 581db9f1219..05ec43f4a2a 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/appleXCFramework/shared/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/appleXCFramework/shared/build.gradle.kts @@ -5,14 +5,14 @@ plugins { } kotlin { - val sdkXCFramework = XCFramework("sdk") - val otherXCFramework = XCFramework() + val xcf = XCFramework() + val otherXCFramework = XCFramework("other") ios { binaries { framework { baseName = "shared" - sdkXCFramework.add(this) + xcf.add(this) otherXCFramework.add(this) } } @@ -22,7 +22,7 @@ kotlin { binaries { framework { baseName = "shared" - sdkXCFramework.add(this) + xcf.add(this) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/XCFrameworkTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/XCFrameworkTask.kt index 02e3d615ed0..0989b19b032 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/XCFrameworkTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/XCFrameworkTask.kt @@ -78,6 +78,7 @@ class XCFrameworkConfig { .firstOrNull { it.targets.contains(framework.konanTarget) } ?.also { appleTarget -> holder.fatTasks[appleTarget]?.configure { fatTask -> + fatTask.baseName = framework.baseName //all frameworks should have same names fatTask.from(framework) } } @@ -121,15 +122,15 @@ private fun Project.registerAssembleFatForXCFrameworkTask( ): TaskProvider { val taskName = lowerCamelCaseName( "assemble", - xcFrameworkName, buildType.getName(), appleTarget.targetName, - "FatFrameworkForXCFramework" + "FatFrameworkFor", + xcFrameworkName, + "XCFramework" ) return registerTask(taskName) { task -> task.destinationDir = XCFrameworkTask.fatFrameworkDir(project, xcFrameworkName, buildType, appleTarget) - task.baseName = xcFrameworkName.asValidFrameworkName() task.onlyIf { task.frameworks.size > 1 } @@ -195,7 +196,15 @@ abstract class XCFrameworkTask : DefaultTask() { fun fromFrameworkDescriptors(vararg frameworks: FrameworkDescriptor) = fromFrameworkDescriptors(frameworks.toList()) fun fromFrameworkDescriptors(frameworks: Iterable) { + val frameworkName = groupedFrameworkFiles.values.flatten().firstOrNull()?.name + frameworks.forEach { framework -> + if (frameworkName != null && framework.name != frameworkName) { + error( + "All inner frameworks in XCFramework '${baseName.get()}' should have same names. " + + "But there are two with '$frameworkName' and '${framework.name}' names" + ) + } val group = AppleTarget.values().first { it.targets.contains(framework.target) } groupedFrameworkFiles.getOrPut(group, { mutableListOf() }).add(framework) } @@ -203,6 +212,21 @@ abstract class XCFrameworkTask : DefaultTask() { @TaskAction fun assemble() { + val frameworks = groupedFrameworkFiles.values.flatten() + if (frameworks.isNotEmpty()) { + val xcfName = baseName.get() + val name = frameworks.first().name + if (frameworks.any { it.name != name }) { + error("All inner frameworks in XCFramework '$xcfName' should have same names!" + + frameworks.joinToString("\n") { it.file.path }) + } + if (name != xcfName) { + logger.warn( + "Name of XCFramework '$xcfName' differs from inner frameworks name '$name'! Framework renaming is not supported yet" + ) + } + } + val frameworksForXCFramework = groupedFrameworkFiles.entries.mapNotNull { (group, files) -> when { files.size == 1 -> files.first()