From 5c2017fa5fc151c2d39e41e1077502626fd830f9 Mon Sep 17 00:00:00 2001 From: Alexander Shabalin Date: Tue, 20 Feb 2024 11:50:42 +0100 Subject: [PATCH] [K/N] Fix CC in Xcode usage ^KTI-1553 - Perform all calls to xcrun in XcodeValueSource. - Use the fully computed Xcode instance as the current Xcode instance. - Hide all of this inside a Gradle plugin and apply it to kotlin-native project. --- .../kotlin/xcode/XcodeOverridePlugin.kt | 26 +++++++++++++++++ .../kotlin/xcode/XcodeValueSource.kt | 28 +++++++++++++++++++ kotlin-native/build.gradle | 3 ++ 3 files changed, 57 insertions(+) create mode 100644 kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/xcode/XcodeOverridePlugin.kt create mode 100644 kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/xcode/XcodeValueSource.kt diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/xcode/XcodeOverridePlugin.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/xcode/XcodeOverridePlugin.kt new file mode 100644 index 00000000000..cf29d75ceb0 --- /dev/null +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/xcode/XcodeOverridePlugin.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.xcode + +import org.gradle.api.Plugin +import org.gradle.api.Project +import org.gradle.api.provider.Provider +import org.gradle.kotlin.dsl.* +import org.jetbrains.kotlin.konan.target.* +import org.jetbrains.kotlin.konan.util.DependencyProcessor + +open class XcodeOverridePlugin : Plugin { + override fun apply(project: Project) { + // Only for macOS hosts. + if (!HostManager.hostIsMac) + return + // Only if we use regular Xcode installation. + if (DependencyProcessor.isInternalSeverAvailable) + return + val xcodeProvider: Provider = project.providers.of(XcodeValueSource::class) {} + Xcode.xcodeOverride = xcodeProvider.get() + } +} diff --git a/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/xcode/XcodeValueSource.kt b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/xcode/XcodeValueSource.kt new file mode 100644 index 00000000000..ffe737c0410 --- /dev/null +++ b/kotlin-native/build-tools/src/main/kotlin/org/jetbrains/kotlin/xcode/XcodeValueSource.kt @@ -0,0 +1,28 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.xcode + +import org.gradle.api.provider.ValueSource +import org.gradle.api.provider.ValueSourceParameters +import org.jetbrains.kotlin.konan.target.* + +private class XcodeSnapshot(original: Xcode) : Xcode { + override val additionalTools = original.additionalTools + override val appletvosSdk = original.appletvosSdk + override val appletvsimulatorSdk = original.appletvsimulatorSdk + override val iphoneosSdk = original.iphoneosSdk + override val iphonesimulatorSdk = original.iphonesimulatorSdk + override val macosxSdk = original.macosxSdk + override val simulatorRuntimes = original.simulatorRuntimes + override val toolchain = original.toolchain + override val version = original.version + override val watchosSdk = original.watchosSdk + override val watchsimulatorSdk = original.watchsimulatorSdk +} + +abstract class XcodeValueSource: ValueSource { + override fun obtain(): Xcode = XcodeSnapshot(Xcode.defaultCurrent()) +} diff --git a/kotlin-native/build.gradle b/kotlin-native/build.gradle index aef469a2b6a..30ddb1eb983 100644 --- a/kotlin-native/build.gradle +++ b/kotlin-native/build.gradle @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.cpp.CompilationDatabasePlugin import org.jetbrains.kotlin.cpp.CppUsage import org.jetbrains.kotlin.cpp.GitClangFormatPlugin import org.jetbrains.kotlin.CompareDistributionSignatures +import org.jetbrains.kotlin.xcode.XcodeOverridePlugin import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.apache.tools.ant.filters.ReplaceTokens import org.jetbrains.kotlin.UtilsKt @@ -44,6 +45,8 @@ buildscript { defaultTasks 'clean', 'dist' +apply plugin: XcodeOverridePlugin + if (PlatformInfo.isMac()) { PlatformInfo.checkXcodeVersion(project) }