From 28a305a8268bb80bac381e70c6d1c582c4e0bcd8 Mon Sep 17 00:00:00 2001 From: Andrey Yastrebov Date: Mon, 19 Feb 2024 14:01:40 +0100 Subject: [PATCH] KT-65928 Worker API for Swift Export --- .../kotlin-gradle-plugin/build.gradle.kts | 5 -- .../gradle/plugin/KotlinPluginWrapper.kt | 2 + ...dSyntheticProjectWithSwiftExportPackage.kt | 2 +- ...CopySwiftExportIntermediatesForConsumer.kt | 2 +- .../GenerateSPMPackageFromSwiftExport.kt | 2 +- .../mpp/apple/swiftexport/SwiftExport.kt | 52 ++++++++----- .../apple/swiftexport/SwiftExportAction.kt | 52 +++++++++++++ .../mpp/apple/swiftexport/SwiftExportInit.kt | 52 +++++++++++++ .../swiftexport/SwiftExportParameters.kt | 38 +++++++++ .../mpp/apple/swiftexport/SwiftExportTask.kt | 77 ++++++------------- .../swift-export-embeddable/build.gradle.kts | 4 + .../buildsrc-compat/src/main/kotlin/tasks.kt | 26 +++++-- 12 files changed, 225 insertions(+), 89 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportAction.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportInit.kt create mode 100644 libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportParameters.kt diff --git a/libraries/tools/kotlin-gradle-plugin/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin/build.gradle.kts index cdc2dfc741e..ac7d8b2493c 100644 --- a/libraries/tools/kotlin-gradle-plugin/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin/build.gradle.kts @@ -1,5 +1,4 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar -import com.github.jengelman.gradle.plugins.shadow.transformers.DontIncludeResourceTransformer import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { @@ -91,10 +90,6 @@ dependencies { commonRuntimeOnly(project(":kotlin-util-klib")) commonRuntimeOnly(project(":kotlin-compiler-embeddable")) - if (kotlinBuildProperties.isSwiftExportPluginPublishingEnabled) { - embedded(project(":native:swift:swift-export-embeddable")) - } - embedded(project(":kotlin-gradle-build-metrics")) embedded(project(":kotlin-gradle-statistics")) embedded(commonDependency("org.jetbrains.intellij.deps:asm-all")) { isTransitive = false } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index 996c8f08a6e..771dc5bc0ef 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -33,6 +33,7 @@ import org.jetbrains.kotlin.gradle.internal.KOTLIN_MODULE_GROUP import org.jetbrains.kotlin.gradle.logging.kotlinDebug import org.jetbrains.kotlin.gradle.plugin.internal.* import org.jetbrains.kotlin.gradle.plugin.mpp.* +import org.jetbrains.kotlin.gradle.plugin.mpp.apple.swiftexport.initSwiftExportClasspathConfigurations import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory import org.jetbrains.kotlin.gradle.plugin.statistics.BuildFusService import org.jetbrains.kotlin.gradle.report.BuildMetricsService @@ -254,6 +255,7 @@ abstract class KotlinBasePluginWrapper : DefaultKotlinBasePlugin() { addGradlePluginMetadataAttributes(project) } project.maybeCreateCommonizerClasspathConfiguration() + project.initSwiftExportClasspathConfigurations() project.createKotlinExtension(projectExtensionClass).apply { coreLibrariesVersion = pluginVersion diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/BuildSyntheticProjectWithSwiftExportPackage.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/BuildSyntheticProjectWithSwiftExportPackage.kt index de5924f6d3e..71ff1382187 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/BuildSyntheticProjectWithSwiftExportPackage.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/BuildSyntheticProjectWithSwiftExportPackage.kt @@ -24,7 +24,7 @@ import java.io.File import javax.inject.Inject @DisableCachingByDefault(because = "Swift Export is experimental, so no caching for now") -abstract class BuildSyntheticProjectWithSwiftExportPackage : DefaultTask() { +internal abstract class BuildSyntheticProjectWithSwiftExportPackage : DefaultTask() { @get:Inject abstract val providerFactory: ProviderFactory diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/CopySwiftExportIntermediatesForConsumer.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/CopySwiftExportIntermediatesForConsumer.kt index f296f866ba9..ed694c40e33 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/CopySwiftExportIntermediatesForConsumer.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/CopySwiftExportIntermediatesForConsumer.kt @@ -18,7 +18,7 @@ import java.io.File import javax.inject.Inject @DisableCachingByDefault(because = "This task only copies files") -abstract class CopySwiftExportIntermediatesForConsumer @Inject constructor( +internal abstract class CopySwiftExportIntermediatesForConsumer @Inject constructor( objectFactory: ObjectFactory, projectLayout: ProjectLayout, providerFactory: ProviderFactory, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/GenerateSPMPackageFromSwiftExport.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/GenerateSPMPackageFromSwiftExport.kt index 21de7a714c7..113d8596154 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/GenerateSPMPackageFromSwiftExport.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/GenerateSPMPackageFromSwiftExport.kt @@ -17,7 +17,7 @@ import org.jetbrains.kotlin.incremental.createDirectory import org.jetbrains.kotlin.incremental.deleteRecursivelyOrThrow @DisableCachingByDefault(because = "Swift Export is experimental, so no caching for now") -abstract class GenerateSPMPackageFromSwiftExport : DefaultTask() { +internal abstract class GenerateSPMPackageFromSwiftExport : DefaultTask() { @get:Input abstract val swiftApiModuleName: Property diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExport.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExport.kt index 64fbb93136e..1d286acc450 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExport.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExport.kt @@ -11,8 +11,10 @@ import org.gradle.api.file.Directory import org.gradle.api.plugins.BasePlugin import org.gradle.api.provider.Provider import org.gradle.api.tasks.TaskProvider +import org.jetbrains.kotlin.gradle.dsl.KotlinMultiplatformSourceSetConventionsImpl.commonMain import org.jetbrains.kotlin.gradle.dsl.KotlinNativeBinaryContainer -import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation +import org.jetbrains.kotlin.gradle.dsl.multiplatformExtension +import org.jetbrains.kotlin.gradle.plugin.* import org.jetbrains.kotlin.gradle.plugin.KotlinPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.kotlinPluginLifecycle import org.jetbrains.kotlin.gradle.plugin.mpp.* @@ -49,7 +51,6 @@ private fun Project.registerSwiftExportTask( val swiftExportTask = registerSwiftExportRun( swiftApiModuleName = swiftApiModuleName, taskNamePrefix = taskNamePrefix, - mainCompilation = mainCompilation, ) val staticLibrary = registerSwiftExportCompilationAndGetBinary( buildType = buildType, @@ -91,15 +92,19 @@ private fun Project.registerSwiftExportTask( private fun Project.registerSwiftExportRun( swiftApiModuleName: Provider, taskNamePrefix: String, - mainCompilation: KotlinCompilation<*>, ): TaskProvider { val swiftExportTaskName = taskNamePrefix + "SwiftExport" + return locateOrRegisterTask(swiftExportTaskName) { task -> - val directoryProvider = project.future { - kotlinPluginLifecycle.await(KotlinPluginLifecycle.Stage.AfterFinaliseRefinesEdges) - mainCompilation.allKotlinSourceSets.flatMap { - it.kotlin.srcDirs - } + val commonMainProvider = project.future { + project + .multiplatformExtension + .awaitSourceSets() + .commonMain + .get() + .kotlin + .srcDirs + .single() } val outputs = layout.buildDirectory.dir(swiftExportTaskName) @@ -107,15 +112,16 @@ private fun Project.registerSwiftExportRun( val kotlinIntermediates = outputs.map { it.dir("kotlinIntermediates") } // Input - task.sourceRoots.from(project.files(directoryProvider.getOrThrow())) - task.bridgeModuleName.set(swiftApiModuleName.map { "${it}Bridge" }) - task.debugMode.set(true) - task.konanDistribution.set(konanDistribution.root) + task.swiftExportClasspath.from(project.maybeCreateSwiftExportClasspathResolvableConfiguration()) + task.parameters.sourceRoot.set(commonMainProvider.getOrThrow()) + task.parameters.bridgeModuleName.set(swiftApiModuleName.map { "${it}Bridge" }) + task.parameters.debugMode.set(true) + task.parameters.konanDistribution.set(konanDistribution.root) // Output - task.swiftApiPath.set(swiftIntermediates.map { it.file("KotlinAPI.swift") }) - task.headerBridgePath.set(swiftIntermediates.map { it.file("KotlinBridge.h") }) - task.kotlinBridgePath.set(kotlinIntermediates.map { it.file("KotlinBridge.kt") }) + task.parameters.swiftApiPath.set(swiftIntermediates.map { it.file("KotlinAPI.swift") }) + task.parameters.headerBridgePath.set(swiftIntermediates.map { it.file("KotlinBridge.h") }) + task.parameters.kotlinBridgePath.set(kotlinIntermediates.map { it.file("KotlinBridge.kt") }) } } @@ -133,7 +139,10 @@ private fun registerSwiftExportCompilationAndGetBinary( swiftExportCompilationName, invokeWhenCreated = { swiftExportCompilation -> swiftExportCompilation.associateWith(mainCompilation) - swiftExportCompilation.defaultSourceSet.kotlin.srcDir(swiftExportTask.map { it.kotlinBridgePath.getFile().parent }) + swiftExportCompilation.defaultSourceSet.kotlin.srcDir(swiftExportTask.map { + it.parameters.kotlinBridgePath.getFile().parent + }) + swiftExportCompilation.compileTaskProvider.configure { it.compilerOptions.optIn.add("kotlin.experimental.ExperimentalNativeApi") } @@ -165,10 +174,10 @@ private fun Project.registerPackageGeneration( task.description = "Generates $taskNamePrefix SPM Package" // Input - task.swiftApiPath.set(swiftExportTask.flatMap { it.swiftApiPath }) - task.headerBridgePath.set(swiftExportTask.flatMap { it.headerBridgePath }) - task.headerBridgeModuleName.set(swiftExportTask.flatMap { it.bridgeModuleName }) - task.libraryPath.set { staticLibrary.linkTaskProvider.flatMap { it.outputFile }.get() } + task.swiftApiPath.set(swiftExportTask.map { it.parameters.swiftApiPath.get() }) + task.headerBridgePath.set(swiftExportTask.map { it.parameters.headerBridgePath.get() }) + task.headerBridgeModuleName.set(swiftExportTask.map { it.parameters.bridgeModuleName.get() }) + task.libraryPath.set { staticLibrary.linkTaskProvider.map { it.outputFile.get() }.get() } task.swiftLibraryName.set(swiftApiLibraryName) task.kotlinLibraryName.set(kotlinStaticLibraryName) task.swiftApiModuleName.set(swiftApiModuleName) @@ -219,4 +228,5 @@ private fun Project.registerCopyTask( } copyTask.dependsOn(syntheticProjectBuild) return copyTask -} \ No newline at end of file +} + diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportAction.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportAction.kt new file mode 100644 index 00000000000..d56f49dead5 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportAction.kt @@ -0,0 +1,52 @@ +/* + * 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.gradle.plugin.mpp.apple.swiftexport + +import org.gradle.workers.WorkAction +import org.jetbrains.kotlin.gradle.utils.getFile +import org.jetbrains.kotlin.konan.target.Distribution +import org.jetbrains.kotlin.swiftexport.standalone.* +import java.util.logging.Level +import java.util.logging.Logger + +internal abstract class SwiftExportAction : WorkAction { + + companion object : SwiftExportLogger { + private val logger = Logger.getLogger(this::class.java.name) + + override fun report(severity: SwiftExportLogger.Severity, message: String) { + logger.log(severity.logType(), message) + } + + private fun SwiftExportLogger.Severity.logType(): Level = when (this) { + SwiftExportLogger.Severity.Info -> Level.INFO + SwiftExportLogger.Severity.Warning -> Level.WARNING + SwiftExportLogger.Severity.Error -> Level.SEVERE + else -> Level.INFO + } + } + + override fun execute() { + runSwiftExport( + input = SwiftExportInput( + sourceRoot = parameters.sourceRoot.getFile().toPath() + ), + config = SwiftExportConfig( + settings = mapOf( + SwiftExportConfig.DEBUG_MODE_ENABLED to parameters.debugMode.getOrElse(false).toString(), + SwiftExportConfig.BRIDGE_MODULE_NAME to parameters.bridgeModuleName.getOrElse(SwiftExportConfig.DEFAULT_BRIDGE_MODULE_NAME), + ), + Companion, + distribution = Distribution(parameters.konanDistribution.getFile().absolutePath), + ), + output = SwiftExportOutput( + swiftApi = parameters.swiftApiPath.getFile().toPath(), + kotlinBridges = parameters.kotlinBridgePath.getFile().toPath(), + cHeaderBridges = parameters.headerBridgePath.getFile().toPath(), + ) + ) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportInit.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportInit.kt new file mode 100644 index 00000000000..74d32be06e6 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportInit.kt @@ -0,0 +1,52 @@ +/* + * 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.gradle.plugin.mpp.apple.swiftexport + +import org.gradle.api.Project +import org.gradle.api.artifacts.Configuration +import org.gradle.api.attributes.Category +import org.gradle.api.attributes.LibraryElements +import org.gradle.api.attributes.Usage +import org.jetbrains.kotlin.gradle.internal.KOTLIN_MODULE_GROUP +import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider.Companion.kotlinPropertiesProvider +import org.jetbrains.kotlin.gradle.plugin.getKotlinPluginVersion +import org.jetbrains.kotlin.gradle.plugin.usageByName +import org.jetbrains.kotlin.gradle.utils.* + +private const val SWIFT_EXPORT_CLASSPATH = "swiftExportClasspath" +private const val SWIFT_EXPORT_CLASSPATH_RESOLVABLE = "swiftExportClasspathResolvable" +private const val SWIFT_EXPORT_EMBEDDABLE_MODULE = "swift-export-embeddable" + + +internal fun Project.initSwiftExportClasspathConfigurations() { + if (project.kotlinPropertiesProvider.swiftExportEnabled) { + maybeCreateSwiftExportClasspathDependenciesConfiguration() + maybeCreateSwiftExportClasspathResolvableConfiguration() + } +} + +private fun Project.maybeCreateSwiftExportClasspathDependenciesConfiguration(): Configuration { + return configurations.findDependencyScope(SWIFT_EXPORT_CLASSPATH) + ?: project.configurations.createDependencyScope(SWIFT_EXPORT_CLASSPATH) { + description = "Runtime classpath for the SwiftExport worker." + defaultDependencies { dependencies -> + dependencies.add( + project.dependencies.create("$KOTLIN_MODULE_GROUP:$SWIFT_EXPORT_EMBEDDABLE_MODULE:${getKotlinPluginVersion()}") + ) + } + }.get() +} + +internal fun Project.maybeCreateSwiftExportClasspathResolvableConfiguration(): Configuration { + return configurations.findResolvable(SWIFT_EXPORT_CLASSPATH_RESOLVABLE) + ?: project.configurations.createResolvable(SWIFT_EXPORT_CLASSPATH_RESOLVABLE) { + description = "Resolves the runtime classpath for the SwiftExport worker." + attributes.setAttribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.LIBRARY)) + attributes.setAttribute(LibraryElements.LIBRARY_ELEMENTS_ATTRIBUTE, objects.named(LibraryElements.JAR)) + attributes.setAttribute(Usage.USAGE_ATTRIBUTE, usageByName(Usage.JAVA_RUNTIME)) + extendsFrom(maybeCreateSwiftExportClasspathDependenciesConfiguration()) + } +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportParameters.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportParameters.kt new file mode 100644 index 00000000000..867da744bea --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportParameters.kt @@ -0,0 +1,38 @@ +/* + * 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.gradle.plugin.mpp.apple.swiftexport + +import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.RegularFileProperty +import org.gradle.api.provider.Property +import org.gradle.api.tasks.* +import org.gradle.workers.WorkParameters + +internal interface SwiftExportParameters : WorkParameters { + + @get:Input + val bridgeModuleName: Property + + @get:Input + val debugMode: Property + + @get:InputDirectory + @get:PathSensitive(PathSensitivity.RELATIVE) + val konanDistribution: DirectoryProperty + + @get:InputDirectory + @get:PathSensitive(PathSensitivity.RELATIVE) + val sourceRoot: DirectoryProperty + + @get:OutputFile + val swiftApiPath: RegularFileProperty + + @get:OutputFile + val headerBridgePath: RegularFileProperty + + @get:OutputFile + val kotlinBridgePath: RegularFileProperty +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportTask.kt index 9f4abc16be9..f7b6629bc21 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/apple/swiftexport/SwiftExportTask.kt @@ -7,73 +7,40 @@ package org.jetbrains.kotlin.gradle.plugin.mpp.apple.swiftexport import org.gradle.api.DefaultTask import org.gradle.api.file.ConfigurableFileCollection -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.provider.Property import org.gradle.api.tasks.* import org.gradle.work.DisableCachingByDefault -import org.jetbrains.kotlin.gradle.internal.LogType -import org.jetbrains.kotlin.gradle.internal.processLogMessage -import org.jetbrains.kotlin.gradle.utils.getFile -import org.jetbrains.kotlin.konan.target.Distribution -import org.jetbrains.kotlin.swiftexport.standalone.* +import org.gradle.workers.WorkerExecutor +import javax.inject.Inject + @DisableCachingByDefault(because = "Swift Export is experimental, so no caching for now") -abstract class SwiftExportTask : DefaultTask(), SwiftExportLogger { - - @get:Input - abstract val bridgeModuleName: Property - - @get:Input - abstract val debugMode: Property - - @get:InputDirectory - @get:PathSensitive(PathSensitivity.ABSOLUTE) - abstract val konanDistribution: DirectoryProperty +internal abstract class SwiftExportTask : DefaultTask() { @get:InputFiles @get:PathSensitive(PathSensitivity.RELATIVE) - abstract val sourceRoots: ConfigurableFileCollection + abstract val swiftExportClasspath: ConfigurableFileCollection - @get:OutputFile - abstract val swiftApiPath: RegularFileProperty + @get:Inject + abstract val workerExecutor: WorkerExecutor - @get:OutputFile - abstract val headerBridgePath: RegularFileProperty - - @get:OutputFile - abstract val kotlinBridgePath: RegularFileProperty + @get:Nested + abstract val parameters: SwiftExportParameters @TaskAction fun run() { - runSwiftExport( - input = SwiftExportInput( - sourceRoot = sourceRoots.filter { it.exists() }.map { it.toPath() }.first() - ), - config = SwiftExportConfig( - settings = mapOf( - SwiftExportConfig.DEBUG_MODE_ENABLED to debugMode.getOrElse(false).toString(), - SwiftExportConfig.BRIDGE_MODULE_NAME to bridgeModuleName.getOrElse(SwiftExportConfig.DEFAULT_BRIDGE_MODULE_NAME), - ), - this, - distribution = Distribution(konanDistribution.getFile().absolutePath), - ), - output = SwiftExportOutput( - swiftApi = swiftApiPath.get().asFile.toPath(), - kotlinBridges = kotlinBridgePath.get().asFile.toPath(), - cHeaderBridges = headerBridgePath.get().asFile.toPath(), - ) - ) - } + val workQueue = workerExecutor.classLoaderIsolation { workerSpec -> + workerSpec.classpath.from(swiftExportClasspath) + } - override fun report(severity: SwiftExportLogger.Severity, message: String) { - logger.processLogMessage(message, severity.logType()) - } -} + workQueue.submit(SwiftExportAction::class.java) { workParameters -> + workParameters.debugMode.set(parameters.debugMode) + workParameters.bridgeModuleName.set(parameters.bridgeModuleName) + workParameters.konanDistribution.set(parameters.konanDistribution) + workParameters.sourceRoot.set(parameters.sourceRoot) -private fun SwiftExportLogger.Severity.logType(): LogType = when (this) { - SwiftExportLogger.Severity.Info -> LogType.INFO - SwiftExportLogger.Severity.Warning -> LogType.WARN - SwiftExportLogger.Severity.Error -> LogType.ERROR - else -> LogType.LOG + workParameters.swiftApiPath.set(parameters.swiftApiPath) + workParameters.headerBridgePath.set(parameters.headerBridgePath) + workParameters.kotlinBridgePath.set(parameters.kotlinBridgePath) + } + } } \ No newline at end of file diff --git a/native/swift/swift-export-embeddable/build.gradle.kts b/native/swift/swift-export-embeddable/build.gradle.kts index 0162d35e968..ee1314922cc 100644 --- a/native/swift/swift-export-embeddable/build.gradle.kts +++ b/native/swift/swift-export-embeddable/build.gradle.kts @@ -4,6 +4,10 @@ plugins { java } +if (kotlinBuildProperties.isSwiftExportPluginPublishingEnabled) { + publish() +} + dependencies { embedded(project(":native:swift:sir")) { isTransitive = false } embedded(project(":native:swift:sir-compiler-bridge")) { isTransitive = false } diff --git a/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/tasks.kt b/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/tasks.kt index 847ed01dbca..99b60967fc4 100644 --- a/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/tasks.kt +++ b/repo/gradle-build-conventions/buildsrc-compat/src/main/kotlin/tasks.kt @@ -29,6 +29,8 @@ import java.lang.management.ManagementFactory import java.nio.file.Files import java.nio.file.Path +private const val SWIFT_EXPORT_EMBEDDABLE = ":native:swift:swift-export-embeddable" + val kotlinGradlePluginAndItsRequired = arrayOf( ":kotlin-assignment", ":kotlin-allopen", @@ -82,21 +84,35 @@ val kotlinGradlePluginAndItsRequired = arrayOf( ":kotlin-test-js-runner", ":native:kotlin-klib-commonizer-embeddable", ":native:kotlin-klib-commonizer-api", + SWIFT_EXPORT_EMBEDDABLE, ":compiler:build-tools:kotlin-build-statistics", ":compiler:build-tools:kotlin-build-tools-api", ":compiler:build-tools:kotlin-build-tools-impl", ) +private fun Task.processDependent(dependent: String, action: () -> Unit) { + val isSwiftExportEmbeddable = dependent == SWIFT_EXPORT_EMBEDDABLE + val isSwiftExportPluginPublishingEnabled = project.kotlinBuildProperties.isSwiftExportPluginPublishingEnabled + + if (!isSwiftExportEmbeddable || isSwiftExportPluginPublishingEnabled) { + action.invoke() + } +} + fun Task.dependsOnKotlinGradlePluginInstall() { - kotlinGradlePluginAndItsRequired.forEach { - dependsOn("${it}:install") + kotlinGradlePluginAndItsRequired.forEach { dependency -> + processDependent(dependency) { + dependsOn("${dependency}:install") + } } } fun Task.dependsOnKotlinGradlePluginPublish() { - kotlinGradlePluginAndItsRequired.forEach { - project.rootProject.tasks.findByPath("${it}:publish")?.let { task -> - dependsOn(task) + kotlinGradlePluginAndItsRequired.forEach { dependency -> + processDependent(dependency) { + project.rootProject.tasks.findByPath("${dependency}:publish")?.let { task -> + dependsOn(task) + } } } }