From 1149ae07e2754484afeb0f41ca6b775a720406af Mon Sep 17 00:00:00 2001 From: Ilya Matveev Date: Fri, 20 Jul 2018 16:28:31 +0700 Subject: [PATCH] [gradle-plugin] Rework class hierarchy for frameworks --- .../experimental/KotlinNativeBinaries.kt | 12 +++++ .../internal/KotlinNativeFrameworkImpl.kt | 37 +++++++++++++ ...ibraries.kt => KotlinNativeLibraryImpl.kt} | 53 ++----------------- .../internal/KotlinNativeMainComponent.kt | 2 +- .../plugins/KotlinNativeBasePlugin.kt | 18 +++---- .../experimental/tasks/KotlinNativeCompile.kt | 7 ++- 6 files changed, 65 insertions(+), 64 deletions(-) create mode 100644 tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeFrameworkImpl.kt rename tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/{KotlinNativeLibraries.kt => KotlinNativeLibraryImpl.kt} (67%) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/KotlinNativeBinaries.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/KotlinNativeBinaries.kt index 42b86e18b25..a5aea221b36 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/KotlinNativeBinaries.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/KotlinNativeBinaries.kt @@ -1,14 +1,21 @@ package org.jetbrains.kotlin.gradle.plugin.experimental +import org.gradle.api.artifacts.Configuration import org.gradle.api.attributes.Attribute +import org.gradle.api.attributes.AttributeContainer import org.gradle.api.component.BuildableComponent import org.gradle.api.component.PublishableComponent import org.gradle.api.file.FileCollection +import org.gradle.api.file.RegularFile +import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.language.ComponentWithDependencies import org.gradle.language.ComponentWithOutputs +import org.gradle.language.nativeplatform.ComponentWithLinkUsage +import org.gradle.language.nativeplatform.internal.ComponentWithNames import org.gradle.language.nativeplatform.internal.ConfigurableComponentWithLinkUsage import org.gradle.language.nativeplatform.internal.ConfigurableComponentWithRuntimeUsage +import org.gradle.nativeplatform.Linkage import org.gradle.nativeplatform.test.TestComponent import org.jetbrains.kotlin.gradle.plugin.experimental.internal.KotlinNativePlatform import org.jetbrains.kotlin.gradle.plugin.experimental.tasks.KotlinNativeCompile @@ -75,6 +82,11 @@ interface KotlinNativeLibrary : KotlinNativeBinary, PublishableComponent, ConfigurableComponentWithLinkUsage +/** + * Represents an Objective C framework compiled from KN sources. + */ +interface KotlinNativeFramework : KotlinNativeBinary, ComponentWithOutputs + /** * Represents a test executable. */ diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeFrameworkImpl.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeFrameworkImpl.kt new file mode 100644 index 00000000000..a35b739003a --- /dev/null +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeFrameworkImpl.kt @@ -0,0 +1,37 @@ +package org.jetbrains.kotlin.gradle.plugin.experimental.internal + +import org.gradle.api.artifacts.Configuration +import org.gradle.api.artifacts.ConfigurationContainer +import org.gradle.api.file.ProjectLayout +import org.gradle.api.internal.file.FileOperations +import org.gradle.api.model.ObjectFactory +import org.gradle.api.provider.Provider +import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeFramework +import org.jetbrains.kotlin.konan.target.CompilerOutputKind +import javax.inject.Inject + + +open class KotlinNativeFrameworkImpl @Inject constructor( + name: String, + baseName: Provider, + componentImplementation: Configuration, + component: KotlinNativeMainComponent, + identity: KotlinNativeVariantIdentity, + projectLayout: ProjectLayout, + objects: ObjectFactory, + configurations: ConfigurationContainer, + fileOperations: FileOperations +) : AbstractKotlinNativeBinary( + name, + baseName, + component, + identity, + projectLayout, + CompilerOutputKind.FRAMEWORK, + objects, + componentImplementation, + configurations, + fileOperations +), KotlinNativeFramework { + override val outputRootName: String = "lib" +} \ No newline at end of file diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeLibraries.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeLibraryImpl.kt similarity index 67% rename from tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeLibraries.kt rename to tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeLibraryImpl.kt index d7558265cb8..91e823b6e02 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeLibraries.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeLibraryImpl.kt @@ -15,19 +15,18 @@ import org.gradle.api.provider.Property import org.gradle.api.provider.Provider import org.gradle.language.cpp.internal.DefaultUsageContext import org.gradle.nativeplatform.Linkage +import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeFramework import org.jetbrains.kotlin.gradle.plugin.experimental.KotlinNativeLibrary -import org.jetbrains.kotlin.gradle.plugin.experimental.sourcesets.KotlinNativeSourceSet import org.jetbrains.kotlin.konan.target.CompilerOutputKind import javax.inject.Inject -abstract class AbstractKotlinNativeLibrary( +open class KotlinNativeLibraryImpl @Inject constructor( name: String, baseName: Provider, componentImplementation: Configuration, component: KotlinNativeMainComponent, identity: KotlinNativeVariantIdentity, projectLayout: ProjectLayout, - outputKind: CompilerOutputKind, objects: ObjectFactory, configurations: ConfigurationContainer, fileOperations: FileOperations @@ -36,7 +35,7 @@ abstract class AbstractKotlinNativeLibrary( component, identity, projectLayout, - outputKind, + CompilerOutputKind.LIBRARY, objects, componentImplementation, configurations, @@ -69,49 +68,3 @@ abstract class AbstractKotlinNativeLibrary( override val outputRootName = "lib" } - -open class KotlinNativeLibraryImpl @Inject constructor( - name: String, - baseName: Provider, - componentImplementation: Configuration, - component: KotlinNativeMainComponent, - identity: KotlinNativeVariantIdentity, - projectLayout: ProjectLayout, - objects: ObjectFactory, - configurations: ConfigurationContainer, - fileOperations: FileOperations -) : AbstractKotlinNativeLibrary( - name, - baseName, - componentImplementation, - component, - identity, - projectLayout, - CompilerOutputKind.LIBRARY, - objects, - configurations, - fileOperations -) - -open class KotlinNativeFrameworkImpl @Inject constructor( - name: String, - baseName: Provider, - componentImplementation: Configuration, - component: KotlinNativeMainComponent, - identity: KotlinNativeVariantIdentity, - projectLayout: ProjectLayout, - objects: ObjectFactory, - configurations: ConfigurationContainer, - fileOperations: FileOperations -) : AbstractKotlinNativeLibrary( - name, - baseName, - componentImplementation, - component, - identity, - projectLayout, - CompilerOutputKind.FRAMEWORK, - objects, - configurations, - fileOperations -) \ No newline at end of file diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeMainComponent.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeMainComponent.kt index 372dae6b1be..7a5032eec6b 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeMainComponent.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/internal/KotlinNativeMainComponent.kt @@ -57,7 +57,7 @@ open class KotlinNativeMainComponent @Inject constructor( addBinary(T::class.java, identity) fun addExecutable(identity: NativeVariantIdentity) = addBinary(identity) - fun addKLibrary(identity: NativeVariantIdentity) = addBinary(identity) + fun addLibrary(identity: NativeVariantIdentity) = addBinary(identity) fun addFramework(identity: NativeVariantIdentity) = addBinary(identity) fun addBinary(kind: OutputKind, identity: NativeVariantIdentity) = addBinary(kind.binaryClass, identity) diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/plugins/KotlinNativeBasePlugin.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/plugins/KotlinNativeBasePlugin.kt index c5131dddc9a..f1c17a84870 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/plugins/KotlinNativeBasePlugin.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/plugins/KotlinNativeBasePlugin.kt @@ -2,12 +2,16 @@ package org.jetbrains.kotlin.gradle.plugin.experimental.plugins import org.gradle.api.DefaultTask import org.gradle.api.Plugin +import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.component.SoftwareComponentContainer import org.gradle.api.file.DirectoryProperty +import org.gradle.api.file.RegularFile +import org.gradle.api.file.RegularFileProperty import org.gradle.api.internal.FeaturePreviews import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.plugins.BasePlugin +import org.gradle.api.provider.Provider import org.gradle.api.provider.ProviderFactory import org.gradle.api.tasks.TaskContainer import org.gradle.language.base.plugins.LifecycleBasePlugin @@ -23,6 +27,7 @@ import org.jetbrains.kotlin.gradle.plugin.setProperty import org.jetbrains.kotlin.gradle.plugin.tasks.KonanCompilerDownloadTask import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.KonanTarget +import java.io.File class KotlinNativeBasePlugin: Plugin { @@ -61,12 +66,7 @@ class KotlinNativeBasePlugin: Plugin { get() = this == HostManager.host - private fun addCompilationTasks( - tasks: TaskContainer, - components: SoftwareComponentContainer, - buildDirectory: DirectoryProperty, - providers: ProviderFactory - ) { + private fun Project.addCompilationTasks() { val assembleTask = tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME) val typeToAssemble = mutableMapOf() val targetToAssemble = mutableMapOf() @@ -88,7 +88,7 @@ class KotlinNativeBasePlugin: Plugin { KotlinNativeCompile::class.java ).apply { this.binary = binary - outputFile.set(buildDirectory.file(providers.provider { + outputFile.set(layout.buildDirectory.file(providers.provider { val root = binary.outputRootName val prefix = kind.prefix(target) val suffix = kind.suffix(target) @@ -104,7 +104,7 @@ class KotlinNativeBasePlugin: Plugin { when(binary) { is KotlinNativeExecutableImpl -> binary.runtimeFile.set(compileTask.outputFile) - is AbstractKotlinNativeLibrary -> binary.linkFile.set(compileTask.outputFile) + is KotlinNativeLibraryImpl -> binary.linkFile.set(compileTask.outputFile) } if (binary is KotlinNativeTestExecutableImpl) { @@ -177,7 +177,7 @@ class KotlinNativeBasePlugin: Plugin { checkGradleVersion() addCompilerDownloadingTask() - addCompilationTasks(tasks, components, layout.buildDirectory, providers) + addCompilationTasks() } companion object { diff --git a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/KotlinNativeCompile.kt b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/KotlinNativeCompile.kt index a19b652c56d..bd423806c00 100644 --- a/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/KotlinNativeCompile.kt +++ b/tools/kotlin-native-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/experimental/tasks/KotlinNativeCompile.kt @@ -2,18 +2,17 @@ package org.jetbrains.kotlin.gradle.plugin.experimental.tasks import org.gradle.api.DefaultTask import org.gradle.api.artifacts.Configuration +import org.gradle.api.file.DirectoryProperty import org.gradle.api.file.FileCollection import org.gradle.api.file.RegularFileProperty -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputFiles -import org.gradle.api.tasks.OutputFile -import org.gradle.api.tasks.TaskAction +import org.gradle.api.tasks.* import org.jetbrains.kotlin.gradle.plugin.KonanCompilerRunner import org.jetbrains.kotlin.gradle.plugin.KonanPlugin import org.jetbrains.kotlin.gradle.plugin.addArg import org.jetbrains.kotlin.gradle.plugin.addKey import org.jetbrains.kotlin.gradle.plugin.experimental.internal.AbstractKotlinNativeBinary import org.jetbrains.kotlin.konan.target.CompilerOutputKind +import java.io.File open class KotlinNativeCompile: DefaultTask() {