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:
committed by
TeamCityServer
parent
1c8a1e656e
commit
2bb155edc1
+35
-18
@@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-4
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+27
-3
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user