diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AppleFrameworkIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AppleFrameworkIT.kt index cf09303e0c4..a51e25ba691 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AppleFrameworkIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/AppleFrameworkIT.kt @@ -34,7 +34,7 @@ class AppleFrameworkIT : BaseGradleIT() { customEnvironmentVariables = mapOf( "CONFIGURATION" to "debug", "SDK_NAME" to "iphoneos123", - "NATIVE_ARCH" to "armv7" + "ARCHS" to "arm64" ) ) build("assembleDebugAppleFrameworkForXcodeIosArm64", options = options) { @@ -73,7 +73,7 @@ class AppleFrameworkIT : BaseGradleIT() { customEnvironmentVariables = mapOf( "CONFIGURATION" to "Debug", "SDK_NAME" to "iphoneos", - "NATIVE_ARCH" to "armv7", + "ARCHS" to "arm64", "EXPANDED_CODE_SIGN_IDENTITY" to "-", "TARGET_BUILD_DIR" to "testBuildDir", "FRAMEWORKS_FOLDER_PATH" to "testFrameworksDir" @@ -106,7 +106,7 @@ class AppleFrameworkIT : BaseGradleIT() { customEnvironmentVariables = mapOf( "CONFIGURATION" to "Debug", "SDK_NAME" to "iphoneos", - "NATIVE_ARCH" to "armv7" + "ARCHS" to "arm64" ) ) build("tasks", options = options) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleSdk.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleSdk.kt index f9920805d7e..715204016fc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleSdk.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleSdk.kt @@ -14,8 +14,8 @@ internal object AppleSdk { val targets: MutableSet = mutableSetOf() - when (platform) { - "iphoneos" -> { + when { + platform.startsWith("iphoneos") -> { targets.addAll(archs.map { arch -> when (arch) { "arm64", "arm64e" -> KonanTarget.IOS_ARM64 @@ -24,7 +24,7 @@ internal object AppleSdk { } }) } - "iphonesimulator" -> { + platform.startsWith("iphonesimulator") -> { targets.addAll(archs.map { arch -> when (arch) { "arm64", "arm64e" -> KonanTarget.IOS_SIMULATOR_ARM64 @@ -33,7 +33,7 @@ internal object AppleSdk { } }) } - "watchos" -> { + platform.startsWith("watchos") -> { targets.addAll(archs.map { arch -> when (arch) { "armv7k" -> KonanTarget.WATCHOS_ARM32 @@ -42,7 +42,7 @@ internal object AppleSdk { } }) } - "watchsimulator" -> { + platform.startsWith("watchsimulator") -> { targets.addAll(archs.map { arch -> when (arch) { "arm64", "arm64e" -> KonanTarget.WATCHOS_SIMULATOR_ARM64 @@ -52,7 +52,7 @@ internal object AppleSdk { } }) } - "appletvos" -> { + platform.startsWith("appletvos") -> { targets.addAll(archs.map { arch -> when (arch) { "arm64", "arm64e" -> KonanTarget.TVOS_ARM64 @@ -60,7 +60,7 @@ internal object AppleSdk { } }) } - "appletvsimulator" -> { + platform.startsWith("appletvsimulator") -> { targets.addAll(archs.map { arch -> when (arch) { "arm64", "arm64e" -> KonanTarget.TVOS_SIMULATOR_ARM64 @@ -69,7 +69,7 @@ internal object AppleSdk { } }) } - "macosx" -> { + platform.startsWith("macosx") -> { targets.addAll(archs.map { arch -> when (arch) { "arm64" -> KonanTarget.MACOS_ARM64 diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt index 08ad4c90dca..82b8c19fba1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/AppleXcodeTasks.kt @@ -34,13 +34,12 @@ private object XcodeEnvironment { ?: System.getenv("KOTLIN_FRAMEWORK_BUILD_TYPE")?.toNativeBuildType() } - val target: KonanTarget? - get() { - val sdk = System.getenv("SDK_NAME") ?: return null - val arch = System.getenv("NATIVE_ARCH") ?: return null - val nativeTargets = AppleSdk.defineNativeTargets(sdk, listOf(arch)) - return nativeTargets.firstOrNull() + val targets: List + get() { + val sdk = System.getenv("SDK_NAME") ?: return emptyList() + val archs = System.getenv("ARCHS")?.split(" ") ?: return emptyList() + return AppleSdk.defineNativeTargets(sdk, archs) } val frameworkSearchDir: File? @@ -63,6 +62,15 @@ private object XcodeEnvironment { private fun Project.registerAssembleAppleFrameworkTask(framework: Framework): TaskProvider? { if (!framework.konanTarget.family.isAppleFamily || !framework.konanTarget.enabledOnCurrentHost) return null + val envTargets = XcodeEnvironment.targets + if (envTargets.size > 1) { + logger.debug( + "Unable to register assemble Apple framework task because " + + "'ARCHS' contains more than one value." + ) + return null + } + val frameworkBuildType = framework.buildType val frameworkTarget = framework.target val frameworkTaskName = lowerCamelCaseName( @@ -74,7 +82,7 @@ private fun Project.registerAssembleAppleFrameworkTask(framework: Framework): Ta ) val envBuildType = XcodeEnvironment.buildType - val envTarget = XcodeEnvironment.target + val envTarget = envTargets.firstOrNull() val envFrameworkSearchDir = XcodeEnvironment.frameworkSearchDir if (envBuildType == null || envTarget == null || envFrameworkSearchDir == null) { @@ -87,7 +95,7 @@ private fun Project.registerAssembleAppleFrameworkTask(framework: Framework): Ta } else { logger.debug( "Not registering $frameworkTaskName, since not called from Xcode " + - "('SDK_NAME' and 'CONFIGURATION' not provided)" + "('SDK_NAME', 'ARCHS' and 'CONFIGURATION' not provided)" ) } return null @@ -108,22 +116,22 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework val assembleTask = registerAssembleAppleFrameworkTask(framework) ?: return val envBuildType = XcodeEnvironment.buildType - val envTarget = XcodeEnvironment.target + val envTargets = XcodeEnvironment.targets val envEmbeddedFrameworksDir = XcodeEnvironment.embeddedFrameworksDir val envFrameworkSearchDir = XcodeEnvironment.frameworkSearchDir val envSign = XcodeEnvironment.sign val frameworkTaskName = lowerCamelCaseName("embedAndSign", framework.namePrefix, "AppleFrameworkForXcode") - if (envBuildType == null || envTarget == null || envEmbeddedFrameworksDir == null || envFrameworkSearchDir == null) { + if (envBuildType == null || envTargets.isEmpty() || envEmbeddedFrameworksDir == null || envFrameworkSearchDir == null) { logger.debug( "Not registering $frameworkTaskName, since not called from Xcode " + - "('SDK_NAME', 'CONFIGURATION', 'TARGET_BUILD_DIR' and 'FRAMEWORKS_FOLDER_PATH' not provided)" + "('SDK_NAME', 'CONFIGURATION', 'TARGET_BUILD_DIR', 'ARCHS' and 'FRAMEWORKS_FOLDER_PATH' not provided)" ) return } - if (framework.buildType != envBuildType || framework.konanTarget != envTarget) return + if (framework.buildType != envBuildType || !envTargets.contains(framework.konanTarget)) return registerTask(frameworkTaskName) { task -> task.group = "build" @@ -132,7 +140,7 @@ internal fun Project.registerEmbedAndSignAppleFrameworkTask(framework: Framework task.dependsOn(assembleTask) task.inputs.apply { property("type", envBuildType) - property("target", envTarget) + property("targets", envTargets) property("embeddedFrameworksDir", envEmbeddedFrameworksDir) property("sign", envSign) }