Skip to content

Commit

Permalink
Create GradlePluginApi and GradleSubPluginApi modules.
Browse files Browse the repository at this point in the history
  • Loading branch information
FilipDolnik committed May 7, 2024
1 parent 6739e18 commit b6e82cc
Show file tree
Hide file tree
Showing 26 changed files with 130 additions and 71 deletions.
2 changes: 2 additions & 0 deletions SKIE/settings.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ buildSetup {

val gradle by group("skie-gradle") {
val plugin by module
val `plugin-api` by module
val `sub-plugin-api` by module
val `plugin-shim-api` by module
val `plugin-shim-impl` by module
}
Expand Down
21 changes: 21 additions & 0 deletions SKIE/skie-gradle/plugin-api/gradle-plugin-api.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
plugins {
id("skie.gradle")
id("skie.publishable")
}

skiePublishing {
name = "SKIE Gradle Plugin API"
description = "Public API for SKIE Gradle plugin."
}

kotlin {
sourceSets {
val commonMain by getting {
dependencies {
api(projects.common.configuration.configurationDeclaration)

implementation(projects.common.util)
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
package co.touchlab.skie.plugin.configuration

import co.touchlab.skie.configuration.SkieConfigurationFlag
import co.touchlab.skie.plugin.SkieTarget
import co.touchlab.skie.plugin.configuration.util.takeIf
import co.touchlab.skie.plugin.util.takeIf
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
import javax.inject.Inject
Expand All @@ -24,18 +23,11 @@ abstract class SkieBuildConfiguration @Inject constructor(objects: ObjectFactory
val enableConcurrentSkieCompilation: Property<Boolean> = objects.property(Boolean::class.java).convention(true)
val enableParallelSkieCompilation: Property<Boolean> = objects.property(Boolean::class.java).convention(true)

internal fun buildConfigurationFlags(outputKind: SkieTarget.OutputKind): Set<SkieConfigurationFlag> =
internal fun buildConfigurationFlags(): Set<SkieConfigurationFlag> =
setOfNotNull(
decideSwiftLibraryEvolutionFlag(outputKind),
SkieConfigurationFlag.Build_SwiftLibraryEvolution takeIf enableSwiftLibraryEvolution,
SkieConfigurationFlag.Build_ParallelSwiftCompilation takeIf enableParallelSwiftCompilation,
SkieConfigurationFlag.Build_ConcurrentSkieCompilation takeIf enableConcurrentSkieCompilation,
SkieConfigurationFlag.Build_ParallelSkieCompilation takeIf enableParallelSkieCompilation,
)

private fun decideSwiftLibraryEvolutionFlag(outputKind: SkieTarget.OutputKind) =
if (outputKind == SkieTarget.OutputKind.XCFramework) {
SkieConfigurationFlag.Build_SwiftLibraryEvolution
} else {
SkieConfigurationFlag.Build_SwiftLibraryEvolution takeIf enableSwiftLibraryEvolution
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
package co.touchlab.skie.plugin.configuration

import co.touchlab.skie.configuration.SkieConfigurationFlag
import co.touchlab.skie.plugin.configuration.util.takeIf
import co.touchlab.skie.plugin.util.takeIf
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
import javax.inject.Inject
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@
package co.touchlab.skie.plugin.configuration

import co.touchlab.skie.configuration.SkieConfigurationFlag
import co.touchlab.skie.plugin.SkieTarget
import co.touchlab.skie.plugin.configuration.util.GradleSkieConfigurationData
import org.gradle.api.Action
import org.gradle.api.Project
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
import org.gradle.api.provider.SetProperty
Expand Down Expand Up @@ -55,26 +52,5 @@ open class SkieExtension @Inject constructor(objects: ObjectFactory) {
action.execute(migration)
}

// Putting these extensions here so that they don't pollute the extension's namespace. They can be used by wrapping in `with(SkieExtension) { ... }`
companion object {

fun createExtension(project: Project): SkieExtension =
project.extensions.create("skie", SkieExtension::class.java)

fun SkieExtension.buildConfiguration(outputKind: SkieTarget.OutputKind): GradleSkieConfigurationData =
GradleSkieConfigurationData(
enabledConfigurationFlags = (mergeConfigurationSetsFromConfigurations(outputKind) + additionalConfigurationFlags.get()) - suppressedConfigurationFlags.get(),
groups = features.buildGroups(),
)

private fun SkieExtension.mergeConfigurationSetsFromConfigurations(outputKind: SkieTarget.OutputKind) =
analytics.buildConfigurationFlags() +
build.buildConfigurationFlags(outputKind) +
debug.buildConfigurationFlags() +
features.buildConfigurationFlags() +
migration.buildConfigurationFlags()
}
companion object
}

internal val Project.skieExtension: SkieExtension
get() = project.extensions.getByType(SkieExtension::class.java)
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
@file:Suppress("MemberVisibilityCanBePrivate")

package co.touchlab.skie.plugin.configuration

import co.touchlab.skie.configuration.ConfigurationKey
import co.touchlab.skie.configuration.SkieConfigurationFlag
import co.touchlab.skie.plugin.configuration.util.GradleSkieConfigurationData
import co.touchlab.skie.plugin.configuration.util.takeIf
import co.touchlab.skie.plugin.util.takeIf
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
import javax.inject.Inject
Expand All @@ -25,7 +26,7 @@ abstract class SkieFeatureConfiguration @Inject constructor(objects: ObjectFacto
*/
val defaultArgumentsInExternalLibraries: Property<Boolean> = objects.property(Boolean::class.java).convention(false)

private val groupConfigurations = mutableListOf<GroupConfiguration>()
internal val groupConfigurations = mutableListOf<GroupConfiguration>()

fun group(targetFqNamePrefix: String = "", overridesAnnotations: Boolean = false, action: GroupConfiguration.() -> Unit) {
val groupConfiguration = GroupConfiguration(targetFqNamePrefix, overridesAnnotations)
Expand All @@ -36,26 +37,17 @@ abstract class SkieFeatureConfiguration @Inject constructor(objects: ObjectFacto
}

class GroupConfiguration(
private val targetFqNamePrefix: String,
private val overridesAnnotations: Boolean,
internal val targetFqNamePrefix: String,
internal val overridesAnnotations: Boolean,
) {

private val items = mutableMapOf<String, String?>()
internal val items = mutableMapOf<String, String?>()

operator fun <T> ConfigurationKey<T>.invoke(value: T) {
items[this.name] = this.serialize(value)
}

internal fun build(): GradleSkieConfigurationData.Group = GradleSkieConfigurationData.Group(
target = targetFqNamePrefix,
overridesAnnotations = overridesAnnotations,
items = items.toMap(),
)
}

internal fun buildGroups(): List<GradleSkieConfigurationData.Group> =
groupConfigurations.map { it.build() }

internal fun buildConfigurationFlags(): Set<SkieConfigurationFlag> =
setOfNotNull(
SkieConfigurationFlag.Feature_CoroutinesInterop takeIf coroutinesInterop,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
package co.touchlab.skie.plugin.configuration

import co.touchlab.skie.configuration.SkieConfigurationFlag
import co.touchlab.skie.plugin.configuration.util.takeIf
import co.touchlab.skie.plugin.util.takeIf
import org.gradle.api.model.ObjectFactory
import org.gradle.api.provider.Property
import javax.inject.Inject
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package co.touchlab.skie.plugin.configuration.util
package co.touchlab.skie.plugin.util

import org.gradle.api.provider.Property

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import co.touchlab.skie.gradle.version.gradleApiVersionDimension

plugins {
id("skie.gradle")
id("skie.publishable")
Expand All @@ -14,8 +12,9 @@ kotlin {
sourceSets {
val commonMain by getting {
dependencies {
api(projects.gradle.gradlePluginApi)

implementation(projects.common.util)
compileOnly("dev.gradleplugins:gradle-api:${gradleApiVersionDimension().components.min().value}")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package co.touchlab.skie.plugin

import co.touchlab.skie.plugin.shim.KonanTargetShim
import co.touchlab.skie.plugin.shim.KotlinSourceSetShim
import co.touchlab.skie.plugin.util.KotlinCompilerPluginOption
import co.touchlab.skie.util.directory.SkieBuildDirectory
import co.touchlab.skie.util.directory.SkieDirectories
import org.gradle.api.Project
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package co.touchlab.skie.plugin
package co.touchlab.skie.plugin.util

data class KotlinCompilerPluginOption(
val key: String,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import org.gradle.api.artifacts.Configuration
import org.gradle.api.model.ObjectFactory
import org.gradle.api.tasks.TaskCollection

inline fun <reified S : Any> DomainObjectCollection<in S>.withType() =
inline fun <reified S : Any> DomainObjectCollection<in S>.withType(): DomainObjectCollection<S> =
withType(S::class.java)

inline fun <reified S : Any> NamedDomainObjectCollection<in S>.withType(): NamedDomainObjectCollection<S> =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package co.touchlab.skie.plugin

import co.touchlab.skie.plugin.shim.ActualKonanTargetShim
import co.touchlab.skie.plugin.shim.KonanTargetShim
import co.touchlab.skie.plugin.util.KotlinCompilerPluginOption
import co.touchlab.skie.plugin.util.lowerCamelCaseName
import co.touchlab.skie.util.directory.SkieDirectories
import org.gradle.api.Project
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package co.touchlab.skie.plugin

import co.touchlab.skie.plugin.SkieTarget.OutputKind
import co.touchlab.skie.plugin.shim.ActualKonanTargetShim
import co.touchlab.skie.plugin.shim.ActualKotlinSourceSetShim
import co.touchlab.skie.plugin.shim.KonanTargetShim
import co.touchlab.skie.plugin.shim.KotlinSourceSetShim
import co.touchlab.skie.plugin.util.KotlinCompilerPluginOption
import co.touchlab.skie.util.directory.SkieDirectories
import org.gradle.api.Project
import org.gradle.api.file.FileCollection
Expand All @@ -20,7 +20,7 @@ class ActualSkieBinaryTarget(
override val project: Project,
target: KotlinNativeTarget,
private val binary: NativeBinary,
override val outputKind: OutputKind,
override val outputKind: SkieTarget.OutputKind,
) : SkieTarget.Binary {

override val konanTarget: KonanTargetShim = ActualKonanTargetShim(target.konanTarget)
Expand Down
8 changes: 6 additions & 2 deletions SKIE/skie-gradle/plugin/gradle-plugin.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import co.touchlab.skie.gradle.KotlinCompilerVersion
import co.touchlab.skie.gradle.publish.dependencyCoordinate
import co.touchlab.skie.gradle.util.enquoted
import co.touchlab.skie.gradle.util.gradlePluginApi
import co.touchlab.skie.gradle.version.gradleApiVersionDimension
import co.touchlab.skie.gradle.version.kotlinToolingVersionDimension

Expand Down Expand Up @@ -62,9 +63,12 @@ configurations.configureEach {
}

dependencies {
implementation(projects.gradle.gradlePluginShimApi)
api(projects.gradle.gradlePluginApi)
api(projects.common.configuration.configurationDeclaration)
compileOnly("dev.gradleplugins:gradle-api:${gradleApiVersionDimension().components.min().value}")
implementation(projects.gradle.gradleSubPluginApi)
implementation(projects.gradle.gradlePluginShimApi)

compileOnly(gradlePluginApi())
compileOnly(libs.plugin.kotlin.gradle.api)
compileOnly(libs.plugin.kotlin.gradle)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,15 @@ import org.gradle.api.artifacts.dsl.DependencyHandler
import org.gradle.api.attributes.Attribute
import org.gradle.api.attributes.AttributeDisambiguationRule
import org.gradle.api.attributes.MultipleCandidatesDetails
import org.gradle.api.logging.Logger
import org.gradle.api.logging.Logging
import javax.inject.Inject

interface KotlinCompilerVersion : Named {

companion object {

val attribute = Attribute.of("co.touchlab.skie.kotlin.compiler.version", KotlinCompilerVersion::class.java)
val attribute: Attribute<KotlinCompilerVersion> = Attribute.of("co.touchlab.skie.kotlin.compiler.version", KotlinCompilerVersion::class.java)

fun registerIn(dependencies: DependencyHandler, currentKotlinVersion: String) {
dependencies.attributesSchema.attribute(attribute) {
Expand Down Expand Up @@ -41,7 +43,7 @@ interface KotlinCompilerVersion : Named {

companion object {

val log = Logging.getLogger("KotlinCompilerVersion.DisambiguationRule")
val log: Logger = Logging.getLogger("KotlinCompilerVersion.DisambiguationRule")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package co.touchlab.skie.plugin
import co.touchlab.skie.plugin.analytics.GradleAnalyticsManager
import co.touchlab.skie.plugin.configuration.CreateSkieConfigurationTask
import co.touchlab.skie.plugin.configuration.SkieExtension
import co.touchlab.skie.plugin.configuration.createExtension
import co.touchlab.skie.plugin.coroutines.addDependencyOnSkieRuntime
import co.touchlab.skie.plugin.coroutines.configureMinOsVersionIfNeeded
import co.touchlab.skie.plugin.defaultarguments.disableCachingIfNeeded
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import co.touchlab.skie.plugin.analytics.git.getGitRoot
import co.touchlab.skie.plugin.analytics.hardware.HardwareAnalytics
import co.touchlab.skie.plugin.analytics.performance.GradlePerformanceAnalytics
import co.touchlab.skie.plugin.analytics.project.ProjectAnalytics
import co.touchlab.skie.plugin.configuration.SkieExtension.Companion.buildConfiguration
import co.touchlab.skie.plugin.configuration.buildConfiguration
import co.touchlab.skie.plugin.configuration.skieExtension
import co.touchlab.skie.plugin.directory.createSkieBuildDirectoryTask
import co.touchlab.skie.plugin.kgpShim
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package co.touchlab.skie.plugin.configuration

import co.touchlab.skie.plugin.SkieTarget
import co.touchlab.skie.plugin.configuration.SkieExtension.Companion.buildConfiguration
import co.touchlab.skie.plugin.configuration.util.GradleSkieConfigurationData
import co.touchlab.skie.plugin.directory.createSkieBuildDirectoryTask
import co.touchlab.skie.plugin.skieBuildDirectory
import co.touchlab.skie.plugin.util.registerSkieTargetBasedTask
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package co.touchlab.skie.plugin.configuration.util
package co.touchlab.skie.plugin.configuration

import co.touchlab.skie.configuration.SkieConfigurationFlag
import co.touchlab.skie.configuration.UntypedSkieConfigurationData
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
@file:Suppress("MemberVisibilityCanBePrivate", "unused", "invisible_reference", "invisible_member")

package co.touchlab.skie.plugin.configuration

import co.touchlab.skie.configuration.SkieConfigurationFlag
import co.touchlab.skie.plugin.SkieTarget
import org.gradle.api.Project

internal fun SkieExtension.Companion.createExtension(project: Project): SkieExtension =
project.extensions.create("skie", SkieExtension::class.java)

internal val Project.skieExtension: SkieExtension
get() = project.extensions.getByType(SkieExtension::class.java)

internal fun SkieExtension.buildConfiguration(outputKind: SkieTarget.OutputKind): GradleSkieConfigurationData =
GradleSkieConfigurationData(
enabledConfigurationFlags = (mergeConfigurationSetsFromConfigurations(outputKind) + additionalConfigurationFlags.get()) - suppressedConfigurationFlags.get(),
groups = features.buildGroups(),
)

private fun SkieExtension.mergeConfigurationSetsFromConfigurations(outputKind: SkieTarget.OutputKind): Set<SkieConfigurationFlag> =
analytics.buildConfigurationFlags() +
build.buildConfigurationFlags() +
debug.buildConfigurationFlags() +
features.buildConfigurationFlags() +
migration.buildConfigurationFlags() +
addSwiftLibraryEvolutionFlagIfNeeded(outputKind)

private fun addSwiftLibraryEvolutionFlagIfNeeded(outputKind: SkieTarget.OutputKind): Set<SkieConfigurationFlag> =
if (outputKind == SkieTarget.OutputKind.XCFramework) {
setOf(SkieConfigurationFlag.Build_SwiftLibraryEvolution)
} else {
emptySet()
}

private fun SkieFeatureConfiguration.buildGroups(): List<GradleSkieConfigurationData.Group> =
groupConfigurations.map { it.build() }

private fun SkieFeatureConfiguration.GroupConfiguration.build(): GradleSkieConfigurationData.Group =
GradleSkieConfigurationData.Group(
target = targetFqNamePrefix,
overridesAnnotations = overridesAnnotations,
items = items.toMap(),
)
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package co.touchlab.skie.plugin.util

import co.touchlab.skie.plugin.KotlinCompilerPluginOption
import co.touchlab.skie.util.plugin.SkiePlugin

internal fun <T> SkiePlugin.Option<T>.toKotlinCompilerPluginOption(value: T): KotlinCompilerPluginOption =
Expand Down
20 changes: 20 additions & 0 deletions SKIE/skie-gradle/sub-plugin-api/gradle-sub-plugin-api.gradle.kts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
plugins {
id("skie.gradle")
id("skie.publishable")
}

skiePublishing {
name = "SKIE Gradle Sub Plugin API"
description = "API for creating Sub-plugins for SKIE."
}

kotlin {
sourceSets {
val commonMain by getting {
dependencies {
api(projects.gradle.gradlePluginApi)
api(projects.gradle.gradlePluginShimApi)
}
}
}
}
Loading

0 comments on commit b6e82cc

Please sign in to comment.