Skip to content

Commit 26013a8

Browse files
committed
Add disableCrossCompileTargets util function
1 parent c6fdc8e commit 26013a8

File tree

1 file changed

+63
-0
lines changed

1 file changed

+63
-0
lines changed

build-plugins/kmp-conventions/src/main/kotlin/aws/sdk/kotlin/gradle/kmp/ConfigureTargets.kt

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,16 @@ package aws.sdk.kotlin.gradle.kmp
66

77
import aws.sdk.kotlin.gradle.util.prop
88
import org.gradle.api.Project
9+
import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven
10+
import org.gradle.api.publish.tasks.GenerateModuleMetadata
911
import org.gradle.api.tasks.testing.Test
1012
import org.gradle.api.tasks.testing.logging.TestExceptionFormat
1113
import org.gradle.kotlin.dsl.*
1214
import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
1315
import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformExtension
16+
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
17+
import org.jetbrains.kotlin.konan.target.Family
18+
import org.jetbrains.kotlin.konan.target.HostManager
1419
import java.io.File
1520

1621
internal fun <T> Project.tryGetClass(className: String): Class<T>? {
@@ -208,3 +213,61 @@ fun KotlinMultiplatformExtension.configureSourceSetsConvention() {
208213

209214
val Project.JVM_ENABLED get() = prop("aws.kotlin.jvm")?.let { it == "true" } ?: true
210215
val Project.NATIVE_ENABLED get() = prop("aws.kotlin.native")?.let { it == "true" } ?: true
216+
217+
/**
218+
* Kotlin/Native Linux and Windows targets are generally enabled on all hosts since
219+
* the Kotlin toolchain and backend compilers support cross compilation. We
220+
* are using cinterop and have to compile CRT for those platforms which sometimes
221+
* requires using docker which isn't always available in CI or setup in users environment.
222+
*
223+
* See [KT-30498](https://youtrack.jetbrains.com/issue/KT-30498)
224+
*/
225+
fun Project.disableCrossCompileTargets() {
226+
plugins.withId("org.jetbrains.kotlin.multiplatform") {
227+
configure<KotlinMultiplatformExtension> {
228+
targets.withType<KotlinNativeTarget> {
229+
val knTarget = this
230+
when {
231+
HostManager.hostIsMac && (knTarget.isLinux || knTarget.isWindows) -> disable(knTarget)
232+
HostManager.hostIsLinux && knTarget.isApple -> disable(knTarget)
233+
HostManager.hostIsMingw && (knTarget.isLinux || knTarget.isApple) -> disable(knTarget)
234+
}
235+
}
236+
}
237+
}
238+
}
239+
240+
private val KotlinNativeTarget.isLinux: Boolean
241+
get() = konanTarget.family == Family.LINUX
242+
243+
private val KotlinNativeTarget.isApple: Boolean
244+
get() = konanTarget.family.isAppleFamily
245+
246+
private val KotlinNativeTarget.isWindows: Boolean
247+
get() = konanTarget.family == Family.MINGW
248+
249+
250+
internal fun Project.disable(knTarget: KotlinNativeTarget) {
251+
logger.warn("disabling Kotlin/Native target: ${knTarget.name}")
252+
knTarget.apply {
253+
compilations.all {
254+
cinterops.all {
255+
tasks.named(interopProcessingTaskName).configure { enabled = false }
256+
}
257+
compileTaskProvider.configure { enabled = false }
258+
}
259+
260+
binaries.all {
261+
linkTaskProvider.configure { enabled = false }
262+
}
263+
264+
mavenPublication {
265+
tasks.withType<AbstractPublishToMaven>().configureEach {
266+
onlyIf { publication != this@mavenPublication }
267+
}
268+
tasks.withType<GenerateModuleMetadata>().configureEach {
269+
onlyIf { publication != this@mavenPublication }
270+
}
271+
}
272+
}
273+
}

0 commit comments

Comments
 (0)