Skip to content

Commit b5c3f62

Browse files
authored
Fix frameworks cannot be detected for some project configurations (#9)
Fixes #8
1 parent 2718c89 commit b5c3f62

File tree

8 files changed

+56
-22
lines changed

8 files changed

+56
-22
lines changed

CHANGELOG.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88
## [Unreleased]
9-
tbd
9+
### Fixed
10+
- Fix a bug where the plugin was not able to detect the frameworks for some project configurations
11+
[#8](https://github.com/ge-org/multiplatform-swiftpackage/issues/8)
1012

1113
## [2.0.1]
1214
### Changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package com.chromaticnoise.multiplatformswiftpackage.domain
2+
3+
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBinary
4+
import java.io.File
5+
6+
internal class AppleFramework(
7+
val outputFile: AppleFrameworkOutputFile,
8+
val name: AppleFrameworkName,
9+
val linkTask: AppleFrameworkLinkTask
10+
) {
11+
12+
val dsymFile: File get() = File(outputFile.parent, "${name.value}.framework.dSYM")
13+
14+
internal companion object
15+
}
16+
17+
internal fun AppleFramework.Companion.of(binary: NativeBinary?): AppleFramework? = binary?.let {
18+
AppleFramework(
19+
AppleFrameworkOutputFile(it.outputFile),
20+
AppleFrameworkName(it.baseName),
21+
AppleFrameworkLinkTask(it.linkTaskName)
22+
)
23+
}
24+
25+
internal data class AppleFrameworkOutputFile(private val file: File) {
26+
val path: String get() = file.path
27+
28+
val parent: File get() = file.parentFile
29+
}
30+
31+
internal data class AppleFrameworkName(val value: String)
32+
33+
internal data class AppleFrameworkLinkTask(val name: String)

src/main/kotlin/com/chromaticnoise/multiplatformswiftpackage/domain/AppleTarget.kt

+9-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
package com.chromaticnoise.multiplatformswiftpackage.domain
22

33
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
4-
import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
54
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
5+
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBinary
6+
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeOutputKind
7+
import java.io.File
68

79
internal class AppleTarget private constructor(val nativeTarget: KotlinNativeTarget) {
810

9-
internal fun framework(buildConfiguration: BuildConfiguration): Framework? =
11+
internal fun getFramework(buildConfiguration: BuildConfiguration): AppleFramework? =
1012
try {
11-
nativeTarget.binaries.getFramework(buildConfiguration.name)
13+
val nativeBinary = nativeTarget.binaries.find { binary ->
14+
binary.buildType.getName().equals(buildConfiguration.name, ignoreCase = true) &&
15+
binary.outputKind == NativeOutputKind.FRAMEWORK
16+
}
17+
AppleFramework.of(nativeBinary)
1218
} catch (_: Exception) { null }
1319

1420
internal companion object {
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.chromaticnoise.multiplatformswiftpackage.domain
22

3+
import org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType
4+
35
internal sealed class BuildConfiguration {
46
internal object Release : BuildConfiguration()
57
internal object Debug : BuildConfiguration()
68
internal data class Custom(val configurationName: String) : BuildConfiguration()
79

810
val name get() = when(this) {
9-
Release -> "RELEASE"
10-
Debug -> "DEBUG"
11+
Release -> NativeBuildType.RELEASE.getName()
12+
Debug -> NativeBuildType.DEBUG.getName()
1113
is Custom -> configurationName
1214
}
1315
}

src/main/kotlin/com/chromaticnoise/multiplatformswiftpackage/domain/PluginConfiguration.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ internal class PluginConfiguration private constructor(
5656
}
5757

5858
private fun SwiftPackageExtension.getPackageName(): Either<PluginConfigurationError, PackageName> = packageName
59-
?: appleTargets.getFrameworks(buildConfiguration).firstOrNull()?.let { framework ->
60-
PackageName.of(framework.baseName)
59+
?: appleTargets.map { it.getFramework(buildConfiguration) }.firstOrNull()?.let { framework ->
60+
PackageName.of(framework.name.value)
6161
} ?: Either.Left(InvalidPackageName(null))
6262
}
6363

src/main/kotlin/com/chromaticnoise/multiplatformswiftpackage/domain/extensions.kt

-6
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.chromaticnoise.multiplatformswiftpackage.domain
22

33
import org.gradle.api.Action
4-
import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
54
import org.jetbrains.kotlin.konan.target.Family
65
import org.jetbrains.kotlin.konan.target.KonanTarget
76

@@ -35,8 +34,3 @@ internal val TargetName.konanTarget: KonanTarget get() = when (this) {
3534
TargetName.TvOSx64 -> KonanTarget.TVOS_X64
3635
TargetName.MacOSx64 -> KonanTarget.MACOS_X64
3736
}
38-
39-
internal fun Collection<AppleTarget>.getFrameworks(buildConfiguration: BuildConfiguration): Collection<Framework> =
40-
mapNotNull { target ->
41-
target.framework(buildConfiguration)
42-
}

src/main/kotlin/com/chromaticnoise/multiplatformswiftpackage/task/CreateXCFrameworkTask.kt

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.chromaticnoise.multiplatformswiftpackage.task
22

33
import com.chromaticnoise.multiplatformswiftpackage.domain.getConfigurationOrThrow
4-
import com.chromaticnoise.multiplatformswiftpackage.domain.getFrameworks
54
import org.gradle.api.Project
65
import org.gradle.api.tasks.Exec
76
import java.io.File
@@ -12,9 +11,9 @@ internal fun Project.registerCreateXCFrameworkTask() = tasks.register("createXCF
1211

1312
val configuration = getConfigurationOrThrow()
1413
val xcFrameworkDestination = File(configuration.outputDirectory.value, "${configuration.packageName.value}.xcframework")
15-
val frameworks = configuration.appleTargets.getFrameworks(configuration.buildConfiguration)
14+
val frameworks = configuration.appleTargets.mapNotNull { it.getFramework(configuration.buildConfiguration) }
1615

17-
dependsOn(frameworks.map { it.linkTaskName })
16+
dependsOn(frameworks.map { it.linkTask.name })
1817

1918
executable = "xcodebuild"
2019
args(mutableListOf<String>().apply {
@@ -25,8 +24,7 @@ internal fun Project.registerCreateXCFrameworkTask() = tasks.register("createXCF
2524
add("-framework")
2625
add(framework.outputFile.path)
2726

28-
val dsymFile = File(framework.outputFile.parent, "${framework.baseName}.framework.dSYM")
29-
if (dsymFile.exists()) {
27+
framework.dsymFile.takeIf { it.exists() }?.let { dsymFile ->
3028
add("-debug-symbols")
3129
add(dsymFile.path)
3230
}

src/test/kotlin/com/chromaticnoise/multiplatformswiftpackage/domain/PluginConfigurationTest.kt

+2-3
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import io.kotest.matchers.shouldBe
88
import io.mockk.every
99
import io.mockk.mockk
1010
import org.gradle.api.Project
11-
import org.jetbrains.kotlin.gradle.plugin.mpp.Framework
1211
import java.io.File
1312

1413
class PluginConfigurationTest : BehaviorSpec() {
@@ -71,11 +70,11 @@ class PluginConfigurationTest : BehaviorSpec() {
7170

7271
When("the package name is null and apple frameworks exist") {
7372
val expectedName = "expected name"
74-
val framework = mockk<Framework> { every { baseName } returns expectedName }
73+
val framework = AppleFramework(AppleFrameworkOutputFile(mockk()), AppleFrameworkName(expectedName), AppleFrameworkLinkTask(""))
7574
extension.swiftToolsVersion = SwiftToolVersion.of("42")
7675
extension.packageName = null
7776
extension.appleTargets = listOf(
78-
mockk { every { framework(any()) } returns framework }
77+
mockk { every { getFramework(any()) } returns framework }
7978
)
8079

8180
Then("the base name of the first framework should be used") {

0 commit comments

Comments
 (0)