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
|
@Test
|
||||||
fun `assemble XCFramework for all available ios and watchos targets`() {
|
fun `assemble XCFramework for all available ios and watchos targets`() {
|
||||||
with(Project("appleXCFramework")) {
|
with(Project("appleXCFramework")) {
|
||||||
build("assembleSdkDebugXCFramework") {
|
build("assembleSharedDebugXCFramework") {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
assertTasksExecuted(":shared:linkDebugFrameworkIosArm64")
|
assertTasksExecuted(":shared:linkDebugFrameworkIosArm64")
|
||||||
assertTasksExecuted(":shared:linkDebugFrameworkIosX64")
|
assertTasksExecuted(":shared:linkDebugFrameworkIosX64")
|
||||||
assertTasksExecuted(":shared:linkDebugFrameworkWatchosArm32")
|
assertTasksExecuted(":shared:linkDebugFrameworkWatchosArm32")
|
||||||
assertTasksExecuted(":shared:linkDebugFrameworkWatchosArm64")
|
assertTasksExecuted(":shared:linkDebugFrameworkWatchosArm64")
|
||||||
assertTasksExecuted(":shared:linkDebugFrameworkWatchosX64")
|
assertTasksExecuted(":shared:linkDebugFrameworkWatchosX64")
|
||||||
assertTasksExecuted(":shared:assembleSdkDebugWatchosFatFrameworkForXCFramework")
|
assertTasksExecuted(":shared:assembleDebugWatchosFatFrameworkForSharedXCFramework")
|
||||||
assertTasksExecuted(":shared:assembleSdkDebugXCFramework")
|
assertTasksExecuted(":shared:assembleSharedDebugXCFramework")
|
||||||
assertFileExists("/shared/build/XCFrameworks/debug/sdk.xcframework")
|
assertFileExists("/shared/build/XCFrameworks/debug/shared.xcframework")
|
||||||
assertFileExists("/shared/build/XCFrameworks/debug/sdk.xcframework/ios-arm64/dSYMs/shared.framework.dSYM")
|
assertFileExists("/shared/build/XCFrameworks/debug/shared.xcframework/ios-arm64/dSYMs/shared.framework.dSYM")
|
||||||
assertFileExists("/shared/build/sdkXCFrameworkTemp/fatframework/debug/watchos/sdk.framework")
|
assertFileExists("/shared/build/sharedXCFrameworkTemp/fatframework/debug/watchos/shared.framework")
|
||||||
assertFileExists("/shared/build/sdkXCFrameworkTemp/fatframework/debug/watchos/sdk.framework.dSYM")
|
assertFileExists("/shared/build/sharedXCFrameworkTemp/fatframework/debug/watchos/shared.framework.dSYM")
|
||||||
}
|
}
|
||||||
|
|
||||||
build("assembleSdkDebugXCFramework") {
|
build("assembleSharedDebugXCFramework") {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
assertTasksUpToDate(":shared:linkDebugFrameworkIosArm64")
|
assertTasksUpToDate(":shared:linkDebugFrameworkIosArm64")
|
||||||
assertTasksUpToDate(":shared:linkDebugFrameworkIosX64")
|
assertTasksUpToDate(":shared:linkDebugFrameworkIosX64")
|
||||||
assertTasksUpToDate(":shared:linkDebugFrameworkWatchosArm32")
|
assertTasksUpToDate(":shared:linkDebugFrameworkWatchosArm32")
|
||||||
assertTasksUpToDate(":shared:linkDebugFrameworkWatchosArm64")
|
assertTasksUpToDate(":shared:linkDebugFrameworkWatchosArm64")
|
||||||
assertTasksUpToDate(":shared:linkDebugFrameworkWatchosX64")
|
assertTasksUpToDate(":shared:linkDebugFrameworkWatchosX64")
|
||||||
assertTasksUpToDate(":shared:assembleSdkDebugWatchosFatFrameworkForXCFramework")
|
assertTasksUpToDate(":shared:assembleDebugWatchosFatFrameworkForSharedXCFramework")
|
||||||
assertTasksUpToDate(":shared:assembleSdkDebugXCFramework")
|
assertTasksUpToDate(":shared:assembleSharedDebugXCFramework")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -64,18 +64,19 @@ class XCFrameworkIT : BaseGradleIT() {
|
|||||||
@Test
|
@Test
|
||||||
fun `assemble other XCFramework for ios targets`() {
|
fun `assemble other XCFramework for ios targets`() {
|
||||||
with(Project("appleXCFramework")) {
|
with(Project("appleXCFramework")) {
|
||||||
build("assembleXCFramework") {
|
build("assembleOtherXCFramework") {
|
||||||
assertSuccessful()
|
assertSuccessful()
|
||||||
assertTasksExecuted(":shared:linkReleaseFrameworkIosArm64")
|
assertTasksExecuted(":shared:linkReleaseFrameworkIosArm64")
|
||||||
assertTasksExecuted(":shared:linkReleaseFrameworkIosX64")
|
assertTasksExecuted(":shared:linkReleaseFrameworkIosX64")
|
||||||
assertTasksExecuted(":shared:assembleSharedReleaseXCFramework")
|
assertTasksExecuted(":shared:assembleOtherReleaseXCFramework")
|
||||||
assertFileExists("/shared/build/XCFrameworks/release/shared.xcframework")
|
assertFileExists("/shared/build/XCFrameworks/release/other.xcframework")
|
||||||
assertFileExists("/shared/build/XCFrameworks/release/shared.xcframework/ios-arm64/dSYMs/shared.framework.dSYM")
|
assertFileExists("/shared/build/XCFrameworks/release/other.xcframework/ios-arm64/dSYMs/shared.framework.dSYM")
|
||||||
assertTasksExecuted(":shared:linkDebugFrameworkIosArm64")
|
assertTasksExecuted(":shared:linkDebugFrameworkIosArm64")
|
||||||
assertTasksExecuted(":shared:linkDebugFrameworkIosX64")
|
assertTasksExecuted(":shared:linkDebugFrameworkIosX64")
|
||||||
assertTasksExecuted(":shared:assembleSharedDebugXCFramework")
|
assertTasksExecuted(":shared:assembleOtherDebugXCFramework")
|
||||||
assertFileExists("/shared/build/XCFrameworks/debug/shared.xcframework")
|
assertFileExists("/shared/build/XCFrameworks/debug/other.xcframework")
|
||||||
assertFileExists("/shared/build/XCFrameworks/debug/shared.xcframework/ios-arm64/dSYMs/shared.framework.dSYM")
|
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(transformProjectWithPluginsDsl("appleXCFramework")) {
|
||||||
with(gradleBuildScript("shared")) {
|
with(gradleBuildScript("shared")) {
|
||||||
var text = readText()
|
var text = readText()
|
||||||
text = text.replace("XCFramework(\"sdk\")", "XCFramework()")
|
text = text.replace("XCFramework(\"other\")", "XCFramework()")
|
||||||
writeText(text)
|
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 {
|
kotlin {
|
||||||
val sdkXCFramework = XCFramework("sdk")
|
val xcf = XCFramework()
|
||||||
val otherXCFramework = XCFramework()
|
val otherXCFramework = XCFramework("other")
|
||||||
|
|
||||||
ios {
|
ios {
|
||||||
binaries {
|
binaries {
|
||||||
framework {
|
framework {
|
||||||
baseName = "shared"
|
baseName = "shared"
|
||||||
sdkXCFramework.add(this)
|
xcf.add(this)
|
||||||
otherXCFramework.add(this)
|
otherXCFramework.add(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -22,7 +22,7 @@ kotlin {
|
|||||||
binaries {
|
binaries {
|
||||||
framework {
|
framework {
|
||||||
baseName = "shared"
|
baseName = "shared"
|
||||||
sdkXCFramework.add(this)
|
xcf.add(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+27
-3
@@ -78,6 +78,7 @@ class XCFrameworkConfig {
|
|||||||
.firstOrNull { it.targets.contains(framework.konanTarget) }
|
.firstOrNull { it.targets.contains(framework.konanTarget) }
|
||||||
?.also { appleTarget ->
|
?.also { appleTarget ->
|
||||||
holder.fatTasks[appleTarget]?.configure { fatTask ->
|
holder.fatTasks[appleTarget]?.configure { fatTask ->
|
||||||
|
fatTask.baseName = framework.baseName //all frameworks should have same names
|
||||||
fatTask.from(framework)
|
fatTask.from(framework)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -121,15 +122,15 @@ private fun Project.registerAssembleFatForXCFrameworkTask(
|
|||||||
): TaskProvider<FatFrameworkTask> {
|
): TaskProvider<FatFrameworkTask> {
|
||||||
val taskName = lowerCamelCaseName(
|
val taskName = lowerCamelCaseName(
|
||||||
"assemble",
|
"assemble",
|
||||||
xcFrameworkName,
|
|
||||||
buildType.getName(),
|
buildType.getName(),
|
||||||
appleTarget.targetName,
|
appleTarget.targetName,
|
||||||
"FatFrameworkForXCFramework"
|
"FatFrameworkFor",
|
||||||
|
xcFrameworkName,
|
||||||
|
"XCFramework"
|
||||||
)
|
)
|
||||||
|
|
||||||
return registerTask(taskName) { task ->
|
return registerTask(taskName) { task ->
|
||||||
task.destinationDir = XCFrameworkTask.fatFrameworkDir(project, xcFrameworkName, buildType, appleTarget)
|
task.destinationDir = XCFrameworkTask.fatFrameworkDir(project, xcFrameworkName, buildType, appleTarget)
|
||||||
task.baseName = xcFrameworkName.asValidFrameworkName()
|
|
||||||
task.onlyIf {
|
task.onlyIf {
|
||||||
task.frameworks.size > 1
|
task.frameworks.size > 1
|
||||||
}
|
}
|
||||||
@@ -195,7 +196,15 @@ abstract class XCFrameworkTask : DefaultTask() {
|
|||||||
fun fromFrameworkDescriptors(vararg frameworks: FrameworkDescriptor) = fromFrameworkDescriptors(frameworks.toList())
|
fun fromFrameworkDescriptors(vararg frameworks: FrameworkDescriptor) = fromFrameworkDescriptors(frameworks.toList())
|
||||||
|
|
||||||
fun fromFrameworkDescriptors(frameworks: Iterable<FrameworkDescriptor>) {
|
fun fromFrameworkDescriptors(frameworks: Iterable<FrameworkDescriptor>) {
|
||||||
|
val frameworkName = groupedFrameworkFiles.values.flatten().firstOrNull()?.name
|
||||||
|
|
||||||
frameworks.forEach { framework ->
|
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) }
|
val group = AppleTarget.values().first { it.targets.contains(framework.target) }
|
||||||
groupedFrameworkFiles.getOrPut(group, { mutableListOf() }).add(framework)
|
groupedFrameworkFiles.getOrPut(group, { mutableListOf() }).add(framework)
|
||||||
}
|
}
|
||||||
@@ -203,6 +212,21 @@ abstract class XCFrameworkTask : DefaultTask() {
|
|||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
fun assemble() {
|
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) ->
|
val frameworksForXCFramework = groupedFrameworkFiles.entries.mapNotNull { (group, files) ->
|
||||||
when {
|
when {
|
||||||
files.size == 1 -> files.first()
|
files.size == 1 -> files.first()
|
||||||
|
|||||||
Reference in New Issue
Block a user