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
This commit is contained in:
konstantin.tskhovrebov
2021-12-13 12:27:49 +01:00
committed by TeamCityServer
parent 1c8a1e656e
commit 2bb155edc1
3 changed files with 66 additions and 25 deletions
@@ -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")
}
}
}
}
@@ -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)
}
}
}
@@ -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<FatFrameworkTask> {
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<FrameworkDescriptor>) {
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()