@@ -6,11 +6,16 @@ package aws.sdk.kotlin.gradle.kmp
66
77import aws.sdk.kotlin.gradle.util.prop
88import org.gradle.api.Project
9+ import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven
10+ import org.gradle.api.publish.tasks.GenerateModuleMetadata
911import org.gradle.api.tasks.testing.Test
1012import org.gradle.api.tasks.testing.logging.TestExceptionFormat
1113import org.gradle.kotlin.dsl.*
1214import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi
1315import 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
1419import java.io.File
1520
1621internal fun <T > Project.tryGetClass (className : String ): Class <T >? {
@@ -208,3 +213,61 @@ fun KotlinMultiplatformExtension.configureSourceSetsConvention() {
208213
209214val Project .JVM_ENABLED get() = prop(" aws.kotlin.jvm" )?.let { it == " true" } ? : true
210215val 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