diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/InfoPListBuilder.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/InfoPListBuilder.kt index 215826dfc5d..021e7511dff 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/InfoPListBuilder.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/InfoPListBuilder.kt @@ -8,12 +8,13 @@ package org.jetbrains.kotlin.backend.konan.objcexport import org.jetbrains.kotlin.backend.konan.* import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.konan.target.AppleConfigurables -import org.jetbrains.kotlin.konan.target.Family -import org.jetbrains.kotlin.konan.target.KonanTarget -import org.jetbrains.kotlin.konan.target.platformName +import org.jetbrains.kotlin.konan.target.* import org.jetbrains.kotlin.name.Name +internal enum class BundleType { + FRAMEWORK, XCTEST +} + /** * Creates an Info.plist file for an Apple framework. * @@ -22,6 +23,7 @@ import org.jetbrains.kotlin.name.Name */ internal class InfoPListBuilder( private val config: KonanConfig, + private val bundleType: BundleType = BundleType.FRAMEWORK ) { private val configuration = config.configuration @@ -37,6 +39,10 @@ internal class InfoPListBuilder( val properties = config.platform.configurables as AppleConfigurables val platform = properties.platformName() val minimumOsVersion = properties.osVersionMin + val bundlePackageType = when (bundleType) { + BundleType.FRAMEWORK -> "FMWK" + BundleType.XCTEST -> "BNDL" + } val contents = StringBuilder() contents.append(""" @@ -53,7 +59,7 @@ internal class InfoPListBuilder( CFBundleName $name CFBundlePackageType - FMWK + $bundlePackageType CFBundleShortVersionString $bundleShortVersionString CFBundleSupportedPlatforms @@ -79,6 +85,7 @@ internal class InfoPListBuilder( """.trimMargin()) } + val target = config.target // UIDeviceFamily mapping: // 1 - iPhone @@ -114,12 +121,47 @@ internal class InfoPListBuilder( ) } + if (bundleType == BundleType.XCTEST) { + val platformName = properties.platformName().lowercase() + val platformVersion = properties.sdkVersion + + contents.append(""" + | DTPlatformName + | ${platformName} + | DTPlatformVersion + | ${platformVersion} + | DTSDKName + | ${platformName}${platformVersion} + + """.trimMargin()) + + // FIXME with KT-65601: These are hardcoded for the version of Xcode used in our toolchain (15.0) + // They could be retrieved from `/usr/bin/xcrun --show-sdk-*-version --sdk SDK` for the installed Xcode + val sdkBuild = when (target.family) { + Family.OSX -> "23A334" + Family.IOS -> "21A325" + Family.TVOS -> "21J351" + Family.WATCHOS -> "21R354" + else -> error("Unknown Apple family: ${target.family}") + } + contents.append(""" + | DTXcode + | 1500 + | DTXcodeBuild + | 15A240d + | DTSDKBuild + | $sdkBuild + | DTPlatformBuild + | $sdkBuild + + """.trimMargin()) + } + contents.append(""" """.trimIndent()) - // TODO: Xcode also add some number of DT* keys. return contents.toString() } diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt index 381b720b8be..3721857af66 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/objcexport/ObjCExport.kt @@ -129,8 +129,11 @@ internal fun createTestBundle( bundleDirectory: File ) { val name = bundleDirectory.name.removeSuffix(CompilerOutputKind.TEST_BUNDLE.suffix()) - BundleBuilder(config, infoPListBuilder = InfoPListBuilder(config), mainPackageGuesser = MainPackageGuesser()) - .build(moduleDescriptor, bundleDirectory, name) + BundleBuilder( + config = config, + infoPListBuilder = InfoPListBuilder(config, BundleType.XCTEST), + mainPackageGuesser = MainPackageGuesser() + ).build(moduleDescriptor, bundleDirectory, name) } // TODO: No need for such class in dynamic driver.