[gradle-plugin] Rework class hierarchy for frameworks

This commit is contained in:
Ilya Matveev
2018-07-20 16:28:31 +07:00
committed by ilmat192
parent 8bcf5d9e39
commit 1149ae07e2
6 changed files with 65 additions and 64 deletions
@@ -1,14 +1,21 @@
package org.jetbrains.kotlin.gradle.plugin.experimental package org.jetbrains.kotlin.gradle.plugin.experimental
import org.gradle.api.artifacts.Configuration
import org.gradle.api.attributes.Attribute import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.AttributeContainer
import org.gradle.api.component.BuildableComponent import org.gradle.api.component.BuildableComponent
import org.gradle.api.component.PublishableComponent import org.gradle.api.component.PublishableComponent
import org.gradle.api.file.FileCollection 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.api.provider.Provider
import org.gradle.language.ComponentWithDependencies import org.gradle.language.ComponentWithDependencies
import org.gradle.language.ComponentWithOutputs 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.ConfigurableComponentWithLinkUsage
import org.gradle.language.nativeplatform.internal.ConfigurableComponentWithRuntimeUsage import org.gradle.language.nativeplatform.internal.ConfigurableComponentWithRuntimeUsage
import org.gradle.nativeplatform.Linkage
import org.gradle.nativeplatform.test.TestComponent import org.gradle.nativeplatform.test.TestComponent
import org.jetbrains.kotlin.gradle.plugin.experimental.internal.KotlinNativePlatform import org.jetbrains.kotlin.gradle.plugin.experimental.internal.KotlinNativePlatform
import org.jetbrains.kotlin.gradle.plugin.experimental.tasks.KotlinNativeCompile import org.jetbrains.kotlin.gradle.plugin.experimental.tasks.KotlinNativeCompile
@@ -75,6 +82,11 @@ interface KotlinNativeLibrary : KotlinNativeBinary,
PublishableComponent, PublishableComponent,
ConfigurableComponentWithLinkUsage ConfigurableComponentWithLinkUsage
/**
* Represents an Objective C framework compiled from KN sources.
*/
interface KotlinNativeFramework : KotlinNativeBinary, ComponentWithOutputs
/** /**
* Represents a test executable. * Represents a test executable.
*/ */
@@ -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<String>,
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"
}
@@ -15,19 +15,18 @@ import org.gradle.api.provider.Property
import org.gradle.api.provider.Provider import org.gradle.api.provider.Provider
import org.gradle.language.cpp.internal.DefaultUsageContext import org.gradle.language.cpp.internal.DefaultUsageContext
import org.gradle.nativeplatform.Linkage 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.KotlinNativeLibrary
import org.jetbrains.kotlin.gradle.plugin.experimental.sourcesets.KotlinNativeSourceSet
import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.CompilerOutputKind
import javax.inject.Inject import javax.inject.Inject
abstract class AbstractKotlinNativeLibrary( open class KotlinNativeLibraryImpl @Inject constructor(
name: String, name: String,
baseName: Provider<String>, baseName: Provider<String>,
componentImplementation: Configuration, componentImplementation: Configuration,
component: KotlinNativeMainComponent, component: KotlinNativeMainComponent,
identity: KotlinNativeVariantIdentity, identity: KotlinNativeVariantIdentity,
projectLayout: ProjectLayout, projectLayout: ProjectLayout,
outputKind: CompilerOutputKind,
objects: ObjectFactory, objects: ObjectFactory,
configurations: ConfigurationContainer, configurations: ConfigurationContainer,
fileOperations: FileOperations fileOperations: FileOperations
@@ -36,7 +35,7 @@ abstract class AbstractKotlinNativeLibrary(
component, component,
identity, identity,
projectLayout, projectLayout,
outputKind, CompilerOutputKind.LIBRARY,
objects, objects,
componentImplementation, componentImplementation,
configurations, configurations,
@@ -69,49 +68,3 @@ abstract class AbstractKotlinNativeLibrary(
override val outputRootName = "lib" override val outputRootName = "lib"
} }
open class KotlinNativeLibraryImpl @Inject constructor(
name: String,
baseName: Provider<String>,
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<String>,
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
)
@@ -57,7 +57,7 @@ open class KotlinNativeMainComponent @Inject constructor(
addBinary(T::class.java, identity) addBinary(T::class.java, identity)
fun addExecutable(identity: NativeVariantIdentity) = addBinary<KotlinNativeExecutableImpl>(identity) fun addExecutable(identity: NativeVariantIdentity) = addBinary<KotlinNativeExecutableImpl>(identity)
fun addKLibrary(identity: NativeVariantIdentity) = addBinary<KotlinNativeLibraryImpl>(identity) fun addLibrary(identity: NativeVariantIdentity) = addBinary<KotlinNativeLibraryImpl>(identity)
fun addFramework(identity: NativeVariantIdentity) = addBinary<KotlinNativeFrameworkImpl>(identity) fun addFramework(identity: NativeVariantIdentity) = addBinary<KotlinNativeFrameworkImpl>(identity)
fun addBinary(kind: OutputKind, identity: NativeVariantIdentity) = addBinary(kind.binaryClass, identity) fun addBinary(kind: OutputKind, identity: NativeVariantIdentity) = addBinary(kind.binaryClass, identity)
@@ -2,12 +2,16 @@ package org.jetbrains.kotlin.gradle.plugin.experimental.plugins
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.Plugin import org.gradle.api.Plugin
import org.gradle.api.Project
import org.gradle.api.Task import org.gradle.api.Task
import org.gradle.api.component.SoftwareComponentContainer import org.gradle.api.component.SoftwareComponentContainer
import org.gradle.api.file.DirectoryProperty 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.FeaturePreviews
import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.internal.project.ProjectInternal
import org.gradle.api.plugins.BasePlugin import org.gradle.api.plugins.BasePlugin
import org.gradle.api.provider.Provider
import org.gradle.api.provider.ProviderFactory import org.gradle.api.provider.ProviderFactory
import org.gradle.api.tasks.TaskContainer import org.gradle.api.tasks.TaskContainer
import org.gradle.language.base.plugins.LifecycleBasePlugin 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.gradle.plugin.tasks.KonanCompilerDownloadTask
import org.jetbrains.kotlin.konan.target.HostManager import org.jetbrains.kotlin.konan.target.HostManager
import org.jetbrains.kotlin.konan.target.KonanTarget import org.jetbrains.kotlin.konan.target.KonanTarget
import java.io.File
class KotlinNativeBasePlugin: Plugin<ProjectInternal> { class KotlinNativeBasePlugin: Plugin<ProjectInternal> {
@@ -61,12 +66,7 @@ class KotlinNativeBasePlugin: Plugin<ProjectInternal> {
get() = this == HostManager.host get() = this == HostManager.host
private fun addCompilationTasks( private fun Project.addCompilationTasks() {
tasks: TaskContainer,
components: SoftwareComponentContainer,
buildDirectory: DirectoryProperty,
providers: ProviderFactory
) {
val assembleTask = tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME) val assembleTask = tasks.getByName(LifecycleBasePlugin.ASSEMBLE_TASK_NAME)
val typeToAssemble = mutableMapOf<KotlinNativeBuildType, Task>() val typeToAssemble = mutableMapOf<KotlinNativeBuildType, Task>()
val targetToAssemble = mutableMapOf<KonanTarget, Task>() val targetToAssemble = mutableMapOf<KonanTarget, Task>()
@@ -88,7 +88,7 @@ class KotlinNativeBasePlugin: Plugin<ProjectInternal> {
KotlinNativeCompile::class.java KotlinNativeCompile::class.java
).apply { ).apply {
this.binary = binary this.binary = binary
outputFile.set(buildDirectory.file(providers.provider { outputFile.set(layout.buildDirectory.file(providers.provider {
val root = binary.outputRootName val root = binary.outputRootName
val prefix = kind.prefix(target) val prefix = kind.prefix(target)
val suffix = kind.suffix(target) val suffix = kind.suffix(target)
@@ -104,7 +104,7 @@ class KotlinNativeBasePlugin: Plugin<ProjectInternal> {
when(binary) { when(binary) {
is KotlinNativeExecutableImpl -> binary.runtimeFile.set(compileTask.outputFile) 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) { if (binary is KotlinNativeTestExecutableImpl) {
@@ -177,7 +177,7 @@ class KotlinNativeBasePlugin: Plugin<ProjectInternal> {
checkGradleVersion() checkGradleVersion()
addCompilerDownloadingTask() addCompilerDownloadingTask()
addCompilationTasks(tasks, components, layout.buildDirectory, providers) addCompilationTasks()
} }
companion object { companion object {
@@ -2,18 +2,17 @@ package org.jetbrains.kotlin.gradle.plugin.experimental.tasks
import org.gradle.api.DefaultTask import org.gradle.api.DefaultTask
import org.gradle.api.artifacts.Configuration import org.gradle.api.artifacts.Configuration
import org.gradle.api.file.DirectoryProperty
import org.gradle.api.file.FileCollection import org.gradle.api.file.FileCollection
import org.gradle.api.file.RegularFileProperty import org.gradle.api.file.RegularFileProperty
import org.gradle.api.tasks.Input import org.gradle.api.tasks.*
import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.OutputFile
import org.gradle.api.tasks.TaskAction
import org.jetbrains.kotlin.gradle.plugin.KonanCompilerRunner import org.jetbrains.kotlin.gradle.plugin.KonanCompilerRunner
import org.jetbrains.kotlin.gradle.plugin.KonanPlugin import org.jetbrains.kotlin.gradle.plugin.KonanPlugin
import org.jetbrains.kotlin.gradle.plugin.addArg import org.jetbrains.kotlin.gradle.plugin.addArg
import org.jetbrains.kotlin.gradle.plugin.addKey import org.jetbrains.kotlin.gradle.plugin.addKey
import org.jetbrains.kotlin.gradle.plugin.experimental.internal.AbstractKotlinNativeBinary import org.jetbrains.kotlin.gradle.plugin.experimental.internal.AbstractKotlinNativeBinary
import org.jetbrains.kotlin.konan.target.CompilerOutputKind import org.jetbrains.kotlin.konan.target.CompilerOutputKind
import java.io.File
open class KotlinNativeCompile: DefaultTask() { open class KotlinNativeCompile: DefaultTask() {