Skip to content

Commit c856b5b

Browse files
committed
Migrated to new XCFramework setup, replaced manual creation of xcframework in favor of the XCFramework usage. Added additional xcFrameworkName property available allowing the swiftpackage and xcframework to have a different name.
1 parent e16a6d9 commit c856b5b

10 files changed

+89
-58
lines changed

Diff for: build.gradle.kts

+8-8
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@ buildscript {
44
jcenter()
55
}
66
dependencies {
7-
classpath("org.jetbrains.kotlinx:binary-compatibility-validator:0.2.4")
7+
classpath("org.jetbrains.kotlinx:binary-compatibility-validator:0.8.0")
88
}
99
}
1010

11-
apply(plugin = "binary-compatibility-validator")
11+
// apply(plugin = "binary-compatibility-validator")
1212

1313
plugins {
1414
`kotlin-dsl`
@@ -17,19 +17,19 @@ plugins {
1717
signing
1818
}
1919

20-
version = "2.0.3-m1"
20+
version = "2.0.3-m1-xcframework"
2121

2222
repositories {
2323
jcenter()
2424
}
2525

2626
dependencies {
27-
compileOnly(kotlin("gradle-plugin", "1.5.30"))
27+
compileOnly(kotlin("gradle-plugin", "1.6.10"))
2828
testImplementation("io.kotest:kotest-runner-junit5:4.3.0")
2929
testImplementation("io.kotest:kotest-assertions-core:4.3.0")
3030
testImplementation("io.kotest:kotest-property:4.3.0")
3131
testImplementation("io.mockk:mockk:1.10.0")
32-
testImplementation(kotlin("gradle-plugin", "1.5.30"))
32+
testImplementation(kotlin("gradle-plugin", "1.6.10"))
3333
}
3434

3535
java {
@@ -103,9 +103,9 @@ publishing {
103103
}
104104
}
105105

106-
signing {
107-
sign(publishing.publications["pluginMaven"])
108-
}
106+
//signing {
107+
// sign(publishing.publications["pluginMaven"])
108+
//}
109109

110110
tasks.javadoc {
111111
if (JavaVersion.current().isJava9Compatible) {

Diff for: src/main/kotlin/com/chromaticnoise/multiplatformswiftpackage/MultiplatformSwiftPackagePlugin.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ package com.chromaticnoise.multiplatformswiftpackage
22

33
import com.chromaticnoise.multiplatformswiftpackage.domain.AppleTarget
44
import com.chromaticnoise.multiplatformswiftpackage.domain.platforms
5+
import com.chromaticnoise.multiplatformswiftpackage.task.registerCopyXCFrameworkFileTask
56
import com.chromaticnoise.multiplatformswiftpackage.task.registerCreateSwiftPackageTask
6-
import com.chromaticnoise.multiplatformswiftpackage.task.registerCreateXCFrameworkTask
77
import com.chromaticnoise.multiplatformswiftpackage.task.registerCreateZipFileTask
88
import org.gradle.api.Plugin
99
import org.gradle.api.Project
@@ -25,7 +25,7 @@ public class MultiplatformSwiftPackagePlugin : Plugin<Project> {
2525
nativeTargets = kmpExtension.targets.toList(),
2626
platforms = extension.targetPlatforms.platforms
2727
)
28-
project.registerCreateXCFrameworkTask()
28+
project.registerCopyXCFrameworkFileTask()
2929
project.registerCreateZipFileTask()
3030
project.registerCreateSwiftPackageTask()
3131
}

Diff for: src/main/kotlin/com/chromaticnoise/multiplatformswiftpackage/SwiftPackageExtension.kt

+9-2
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,15 @@ public open class SwiftPackageExtension(internal val project: Project) {
1414

1515
internal var buildConfiguration: BuildConfiguration = BuildConfiguration.Release
1616
internal var packageName: Either<PluginConfigurationError, PackageName>? = null
17-
internal var outputDirectory: OutputDirectory = OutputDirectory(File(project.projectDir, "swiftpackage"))
17+
internal var outputDirectory: OutputDirectory =
18+
OutputDirectory(File(project.projectDir, "swiftpackage"))
1819
internal var swiftToolsVersion: SwiftToolVersion? = null
1920
internal var distributionMode: DistributionMode = DistributionMode.Local
20-
internal var targetPlatforms: Collection<Either<List<PluginConfigurationError>, TargetPlatform>> = emptyList()
21+
internal var targetPlatforms: Collection<Either<List<PluginConfigurationError>, TargetPlatform>> =
22+
emptyList()
2123
internal var appleTargets: Collection<AppleTarget> = emptyList()
2224
internal var zipFileName: Either<PluginConfigurationError, ZipFileName>? = null
25+
internal var xcframeworkName: Either<PluginConfigurationError, XCFrameworkName>? = null
2326

2427
/**
2528
* Sets the name of the Swift package.
@@ -31,6 +34,10 @@ public open class SwiftPackageExtension(internal val project: Project) {
3134
packageName = PackageName.of(name)
3235
}
3336

37+
public fun xcframeworkName(name: String) {
38+
xcframeworkName = XCFrameworkName.of(name)
39+
}
40+
3441
/**
3542
* Sets the directory where files like the Package.swift and XCFramework will be created.
3643
* Defaults to $projectDir/swiftpackage

Diff for: src/main/kotlin/com/chromaticnoise/multiplatformswiftpackage/domain/PluginConfiguration.kt

+26-6
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,14 @@ internal class PluginConfiguration private constructor(
1212
val distributionMode: DistributionMode,
1313
val targetPlatforms: Collection<TargetPlatform>,
1414
val appleTargets: Collection<AppleTarget>,
15-
val zipFileName: ZipFileName
15+
val zipFileName: ZipFileName,
16+
val xcFrameworkName: XCFrameworkName
1617
) {
1718
internal companion object {
1819
fun of(extension: SwiftPackageExtension): Either<List<PluginConfigurationError>, PluginConfiguration> {
1920
val targetPlatforms = extension.targetPlatforms.platforms
2021
val packageName = extension.getPackageName()
22+
val xcFrameworkName = extension.getXCFrameworkName()
2123

2224
val errors = mutableListOf<PluginConfigurationError>().apply {
2325
if (extension.swiftToolsVersion == null) {
@@ -40,6 +42,8 @@ internal class PluginConfiguration private constructor(
4042
packageName.leftValueOrNull?.let { error -> add(error) }
4143

4244
extension.zipFileName?.leftValueOrNull?.let { error -> add(error) }
45+
46+
extension.xcframeworkName?.leftValueOrNull?.let { error -> add(error) }
4347
}
4448

4549
return if (errors.isEmpty()) {
@@ -52,21 +56,36 @@ internal class PluginConfiguration private constructor(
5256
extension.distributionMode,
5357
targetPlatforms,
5458
extension.appleTargets,
55-
extension.zipFileName?.orNull ?: defaultZipFileName(packageName.orNull!!, extension.project)
59+
extension.zipFileName?.orNull ?: defaultZipFileName(
60+
packageName.orNull!!,
61+
extension.project
62+
),
63+
extension.xcframeworkName?.orNull ?: defaultXCFrameworkName(
64+
xcFrameworkName.orNull!!
65+
)
5666
)
5767
)
5868
} else {
5969
Either.Left(errors)
6070
}
6171
}
6272

63-
private fun SwiftPackageExtension.getPackageName(): Either<PluginConfigurationError, PackageName> = packageName
64-
?: appleTargets.map { it.getFramework(buildConfiguration) }.firstOrNull()?.let { framework ->
65-
PackageName.of(framework.name.value)
66-
} ?: Either.Left(BlankPackageName)
73+
private fun SwiftPackageExtension.getPackageName(): Either<PluginConfigurationError, PackageName> =
74+
packageName
75+
?: appleTargets.map { it.getFramework(buildConfiguration) }.firstOrNull()
76+
?.let { framework ->
77+
PackageName.of(framework.name.value)
78+
} ?: Either.Left(BlankPackageName)
79+
80+
private fun SwiftPackageExtension.getXCFrameworkName(): Either<PluginConfigurationError, XCFrameworkName> {
81+
return xcframeworkName ?: Either.Left(BlankXCFrameworkName)
82+
}
6783

6884
private fun defaultZipFileName(packageName: PackageName, project: Project) =
6985
ZipFileName.of("${packageName.value}-${project.version}").orNull!!
86+
87+
private fun defaultXCFrameworkName(xcFrameworkName: XCFrameworkName) =
88+
XCFrameworkName.of(xcFrameworkName.value).orNull!!
7089
}
7190

7291
internal sealed class PluginConfigurationError {
@@ -76,5 +95,6 @@ internal class PluginConfiguration private constructor(
7695
object MissingAppleTargets : PluginConfigurationError()
7796
object BlankPackageName : PluginConfigurationError()
7897
object BlankZipFileName : PluginConfigurationError()
98+
object BlankXCFrameworkName : PluginConfigurationError()
7999
}
80100
}

Diff for: src/main/kotlin/com/chromaticnoise/multiplatformswiftpackage/domain/Project+PluginConfiguration.kt

+3
Original file line numberDiff line numberDiff line change
@@ -40,5 +40,8 @@ private fun List<PluginConfigurationError>.toErrorMessage() = joinToString("\n\n
4040
PluginConfigurationError.BlankZipFileName -> """
4141
* ZIP file name must not be blank
4242
""".trimIndent()
43+
PluginConfigurationError.BlankXCFrameworkName -> """
44+
* XCFramework name must not be blank
45+
""".trimIndent()
4346
}
4447
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.chromaticnoise.multiplatformswiftpackage.domain
2+
3+
internal class XCFrameworkName private constructor(val value: String) {
4+
5+
internal companion object {
6+
fun of(name: String?): Either<PluginConfiguration.PluginConfigurationError, XCFrameworkName> =
7+
name?.ifNotBlank { Either.Right(XCFrameworkName(it)) }
8+
?: Either.Left(PluginConfiguration.PluginConfigurationError.BlankXCFrameworkName)
9+
}
10+
11+
override fun equals(other: Any?): Boolean = value == (other as? XCFrameworkName)?.value
12+
13+
override fun hashCode(): Int = value.hashCode()
14+
15+
override fun toString(): String = "XCFrameworkName(value='$value')"
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.chromaticnoise.multiplatformswiftpackage.task
2+
3+
import com.chromaticnoise.multiplatformswiftpackage.domain.getConfigurationOrThrow
4+
import org.gradle.api.Project
5+
import org.gradle.api.tasks.Copy
6+
import java.io.File
7+
8+
internal fun Project.registerCopyXCFrameworkFileTask() {
9+
tasks.register("copyXCFrameworkFile", Copy::class.java) {
10+
setGroup(null) // hide the task from the task list
11+
description = "Copies XCFrameworks into swiftpackage output folder"
12+
13+
val configuration = getConfigurationOrThrow()
14+
dependsOn("assemble${configuration.xcFrameworkName.value}XCFramework")
15+
16+
val buildConfiguration = configuration.buildConfiguration.name
17+
from(
18+
"${project.buildDir.path}/XCFrameworks/${buildConfiguration}/"
19+
)
20+
into(configuration.outputDirectory.value.path)
21+
}
22+
}

Diff for: src/main/kotlin/com/chromaticnoise/multiplatformswiftpackage/task/CreateSwiftPackageTask.kt

-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ internal fun Project.registerCreateSwiftPackageTask() {
1010
group = "multiplatform-swift-package"
1111
description = "Creates a Swift package to distribute an XCFramework"
1212

13-
dependsOn("createXCFramework")
1413
dependsOn("createZipFile")
1514

1615
doLast {

Diff for: src/main/kotlin/com/chromaticnoise/multiplatformswiftpackage/task/CreateXCFrameworkTask.kt

-37
This file was deleted.

Diff for: src/main/kotlin/com/chromaticnoise/multiplatformswiftpackage/task/CreateZipFileTask.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,15 @@ internal fun Project.registerCreateZipFileTask() {
99
setGroup(null) // hide the task from the task list
1010
description = "Creates a ZIP file containing the XCFramework"
1111

12-
dependsOn("createXCFramework")
12+
dependsOn("copyXCFrameworkFile")
1313

1414
val configuration = getConfigurationOrThrow()
1515
val outputDirectory = configuration.outputDirectory.value
1616
archiveFileName.set(configuration.zipFileName.nameWithExtension)
1717
destinationDirectory.set(outputDirectory)
18+
1819
from(outputDirectory) {
19-
include("**/*.xcframework/")
20+
include("*.xcframework/")
2021
}
2122
}
2223
}

0 commit comments

Comments
 (0)