From 15034a533a864147f0f98efaa60eab89c35cacc0 Mon Sep 17 00:00:00 2001 From: Tadeas Kriz Date: Sat, 13 Apr 2024 11:32:35 -0400 Subject: [PATCH] Add Gradle tests for universal frameworks. --- ...niversalFramework_AllDarwinTargetsTests.kt | 71 +++++++++++++++++++ ...sl_UniversalFramework_SingleTargetTests.kt | 53 ++++++++++++++ .../test/trait/gradle/BuildGradleBuilder.kt | 28 +++++++- .../test/util/KotlinVersion.needsOldLinker.kt | 4 ++ 4 files changed, 153 insertions(+), 3 deletions(-) create mode 100644 test-runner/src/test/kotlin/co/touchlab/skie/test/suite/gradle/basic/KotlinArtifactDsl_UniversalFramework_AllDarwinTargetsTests.kt create mode 100644 test-runner/src/test/kotlin/co/touchlab/skie/test/suite/gradle/basic/KotlinArtifactDsl_UniversalFramework_SingleTargetTests.kt create mode 100644 test-runner/src/test/kotlin/co/touchlab/skie/test/util/KotlinVersion.needsOldLinker.kt diff --git a/test-runner/src/test/kotlin/co/touchlab/skie/test/suite/gradle/basic/KotlinArtifactDsl_UniversalFramework_AllDarwinTargetsTests.kt b/test-runner/src/test/kotlin/co/touchlab/skie/test/suite/gradle/basic/KotlinArtifactDsl_UniversalFramework_AllDarwinTargetsTests.kt new file mode 100644 index 00000000..b1cf6aa9 --- /dev/null +++ b/test-runner/src/test/kotlin/co/touchlab/skie/test/suite/gradle/basic/KotlinArtifactDsl_UniversalFramework_AllDarwinTargetsTests.kt @@ -0,0 +1,71 @@ +package co.touchlab.skie.test.suite.gradle.basic + +import co.touchlab.skie.test.annotation.MatrixTest +import co.touchlab.skie.test.annotation.filter.Smoke +import co.touchlab.skie.test.annotation.type.GradleTests +import co.touchlab.skie.test.base.BaseGradleTests +import co.touchlab.skie.test.runner.BuildConfiguration +import co.touchlab.skie.test.template.Templates +import co.touchlab.skie.test.util.KotlinTarget +import co.touchlab.skie.test.util.KotlinVersion +import co.touchlab.skie.test.util.LinkMode +import co.touchlab.skie.test.util.presets + +@Suppress("ClassName") +@Smoke +@GradleTests +class KotlinArtifactDsl_UniversalFramework_AllDarwinTargetsTests: BaseGradleTests() { + @MatrixTest + fun `single darwin preset and single universal framework artifact`( + kotlinVersion: KotlinVersion, + linkMode: LinkMode, + configuration: BuildConfiguration, + preset: KotlinTarget.Preset.Native.Darwin, + ) { + // Universal frameworks require unique architectures, so we need to ignore Arm64 simulators. + val targetsWithoutArmSimulators = preset.targets.filter { target -> + when (target) { + KotlinTarget.Native.Ios.SimulatorArm64 -> false + KotlinTarget.Native.Tvos.SimulatorArm64 -> false + + KotlinTarget.Native.Ios.X64, + KotlinTarget.Native.Ios.Arm64, + KotlinTarget.Native.MacOS.X64, + KotlinTarget.Native.MacOS.Arm64, + KotlinTarget.Native.Tvos.X64, + KotlinTarget.Native.Tvos.Arm64 -> true + } + } + + rootBuildFile(kotlinVersion) { + kotlin { + allDarwin() + } + + kotlinArtifacts { + universalFramework( + kotlinVersion = kotlinVersion, + targets = targetsWithoutArmSimulators, + linkMode = linkMode, + buildConfiguration = configuration, + ) + } + } + + copyToCommonMain(Templates.basic) + + runGradle() + + targetsWithoutArmSimulators.forEach { target -> + buildSwift( + target = target, + frameworkParentPath = "build/out/fatframework/${configuration.name.lowercase()}", + template = Templates.basic, + ) + + if (target is KotlinTarget.Native.MacOS) { + runSwift() + } + } + } +} diff --git a/test-runner/src/test/kotlin/co/touchlab/skie/test/suite/gradle/basic/KotlinArtifactDsl_UniversalFramework_SingleTargetTests.kt b/test-runner/src/test/kotlin/co/touchlab/skie/test/suite/gradle/basic/KotlinArtifactDsl_UniversalFramework_SingleTargetTests.kt new file mode 100644 index 00000000..59a2193f --- /dev/null +++ b/test-runner/src/test/kotlin/co/touchlab/skie/test/suite/gradle/basic/KotlinArtifactDsl_UniversalFramework_SingleTargetTests.kt @@ -0,0 +1,53 @@ +package co.touchlab.skie.test.suite.gradle.basic + +import co.touchlab.skie.test.annotation.MatrixTest +import co.touchlab.skie.test.annotation.filter.Smoke +import co.touchlab.skie.test.annotation.type.GradleTests +import co.touchlab.skie.test.base.BaseGradleTests +import co.touchlab.skie.test.runner.BuildConfiguration +import co.touchlab.skie.test.template.Templates +import co.touchlab.skie.test.util.KotlinTarget +import co.touchlab.skie.test.util.KotlinVersion +import co.touchlab.skie.test.util.LinkMode + +@Suppress("ClassName") +@Smoke +@GradleTests +class KotlinArtifactDsl_UniversalFramework_SingleTargetTests: BaseGradleTests() { + @MatrixTest + fun `single target`( + kotlinVersion: KotlinVersion, + target: KotlinTarget.Native.Darwin, + linkMode: LinkMode, + configuration: BuildConfiguration, + ) { + rootBuildFile(kotlinVersion) { + kotlin { + target(target) + } + + kotlinArtifacts { + universalFramework( + kotlinVersion = kotlinVersion, + targets = listOf(target), + linkMode = linkMode, + buildConfiguration = configuration, + ) + } + } + + copyToCommonMain(Templates.basic) + + runGradle() + + buildSwift( + target, + Templates.basic, + frameworkParentPath = "build/out/fatframework/${configuration.name.lowercase()}", + ) + + if (target is KotlinTarget.Native.MacOS) { + runSwift() + } + } +} diff --git a/test-runner/src/test/kotlin/co/touchlab/skie/test/trait/gradle/BuildGradleBuilder.kt b/test-runner/src/test/kotlin/co/touchlab/skie/test/trait/gradle/BuildGradleBuilder.kt index 4ff04147..f55412ec 100644 --- a/test-runner/src/test/kotlin/co/touchlab/skie/test/trait/gradle/BuildGradleBuilder.kt +++ b/test-runner/src/test/kotlin/co/touchlab/skie/test/trait/gradle/BuildGradleBuilder.kt @@ -4,6 +4,7 @@ import co.touchlab.skie.test.runner.BuildConfiguration import co.touchlab.skie.test.util.KotlinTarget import co.touchlab.skie.test.util.KotlinVersion import co.touchlab.skie.test.util.LinkMode +import co.touchlab.skie.test.util.needsOldLinker import org.intellij.lang.annotations.Language class BuildGradleBuilder( @@ -149,7 +150,7 @@ class BuildGradleBuilder( "framework(buildTypes = listOf(NativeBuildType.${buildConfiguration.name.uppercase()}))" { +"isStatic = ${linkMode.isStatic}" +"""freeCompilerArgs = freeCompilerArgs + listOf("-Xbinary=bundleId=gradle_test")""" - if (kotlinVersion.value.startsWith("1.8.") || kotlinVersion.value.startsWith("1.9.0")) { + if (kotlinVersion.needsOldLinker) { +"""linkerOpts += "-ld64"""" } } @@ -175,7 +176,7 @@ class BuildGradleBuilder( "toolOptions" { +"""freeCompilerArgs.add("-Xbinary=bundleId=gradle_test")""" } - if (kotlinVersion.value.startsWith("1.8.") || kotlinVersion.value.startsWith("1.9.0")) { + if (kotlinVersion.needsOldLinker) { +"""linkerOptions += "-ld64"""" } } @@ -196,7 +197,28 @@ class BuildGradleBuilder( "toolOptions" { +"""freeCompilerArgs.add("-Xbinary=bundleId=gradle_test")""" } - if (kotlinVersion.value.startsWith("1.8.") || kotlinVersion.value.startsWith("1.9.0")) { + if (kotlinVersion.needsOldLinker) { + +"""linkerOptions += "-ld64"""" + } + } + } + + fun universalFramework( + kotlinVersion: KotlinVersion, + targets: List, + linkMode: LinkMode, + buildConfiguration: BuildConfiguration, + ) { + imports.add("org.jetbrains.kotlin.gradle.plugin.mpp.NativeBuildType") + + "Native.FatFramework" { + +"targets(${targets.joinToString { it.id }})" + +"modes(${buildConfiguration.toString().uppercase()})" + +"isStatic = ${linkMode.isStatic}" + "toolOptions" { + +"""freeCompilerArgs.add("-Xbinary=bundleId=gradle_test")""" + } + if (kotlinVersion.needsOldLinker) { +"""linkerOptions += "-ld64"""" } } diff --git a/test-runner/src/test/kotlin/co/touchlab/skie/test/util/KotlinVersion.needsOldLinker.kt b/test-runner/src/test/kotlin/co/touchlab/skie/test/util/KotlinVersion.needsOldLinker.kt new file mode 100644 index 00000000..4afaf78e --- /dev/null +++ b/test-runner/src/test/kotlin/co/touchlab/skie/test/util/KotlinVersion.needsOldLinker.kt @@ -0,0 +1,4 @@ +package co.touchlab.skie.test.util + +val KotlinVersion.needsOldLinker: Boolean + get() = value.startsWith("1.8.") || value.startsWith("1.9.0")