mirror of
https://github.com/Jozufozu/Flywheel.git
synced 2024-12-25 14:36:18 +01:00
Caught linking
- Upgrade buildSrc to kotlin buildscript - Add TransitiveSourceSet extension to abstract creating the different source sets and creating the configurations to apply dependencies
This commit is contained in:
parent
29b8c3b00f
commit
2072bea11b
9 changed files with 234 additions and 91 deletions
|
@ -1,39 +0,0 @@
|
|||
plugins {
|
||||
id 'groovy-gradle-plugin'
|
||||
}
|
||||
|
||||
repositories {
|
||||
gradlePluginPortal()
|
||||
mavenCentral()
|
||||
maven {
|
||||
name = 'MinecraftForge'
|
||||
url = 'https://maven.minecraftforge.net/'
|
||||
}
|
||||
maven {
|
||||
name = 'Architectury'
|
||||
url = 'https://maven.architectury.dev/'
|
||||
}
|
||||
maven { url = 'https://repo.spongepowered.org/repository/maven-public' }
|
||||
maven { url = 'https://maven.parchmentmc.org' }
|
||||
}
|
||||
|
||||
gradlePlugin {
|
||||
plugins {
|
||||
platformPlugin { PluginDeclaration plugin ->
|
||||
plugin.id = 'flywheel.platform'
|
||||
plugin.implementationClass = 'com.jozufozu.gradle.PlatformPlugin'
|
||||
}
|
||||
jarSetPlugin { PluginDeclaration plugin ->
|
||||
plugin.id = 'flywheel.jar-sets'
|
||||
plugin.implementationClass = 'com.jozufozu.gradle.JarSetPlugin'
|
||||
}
|
||||
packageInfosPlugin { PluginDeclaration plugin ->
|
||||
plugin.id = 'flywheel.package-infos'
|
||||
plugin.implementationClass = 'com.jozufozu.gradle.PackageInfosPlugin'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation 'dev.architectury.loom:dev.architectury.loom.gradle.plugin:1.6-SNAPSHOT'
|
||||
}
|
44
buildSrc/build.gradle.kts
Normal file
44
buildSrc/build.gradle.kts
Normal file
|
@ -0,0 +1,44 @@
|
|||
plugins {
|
||||
id("groovy-gradle-plugin")
|
||||
id("java-gradle-plugin")
|
||||
kotlin("jvm") version "1.9.20"
|
||||
`kotlin-dsl`
|
||||
}
|
||||
|
||||
repositories {
|
||||
gradlePluginPortal()
|
||||
mavenCentral()
|
||||
maven("https://maven.minecraftforge.net/") {
|
||||
name = "MinecraftForge"
|
||||
}
|
||||
maven("https://maven.architectury.dev/") {
|
||||
name = "Architectury"
|
||||
}
|
||||
maven("https://repo.spongepowered.org/repository/maven-public")
|
||||
maven("https://maven.parchmentmc.org")
|
||||
}
|
||||
|
||||
gradlePlugin {
|
||||
plugins {
|
||||
create("platformPlugin") {
|
||||
id = "flywheel.platform"
|
||||
implementationClass = "com.jozufozu.gradle.PlatformPlugin"
|
||||
}
|
||||
create("jarSetPlugin") {
|
||||
id = "flywheel.jar-sets"
|
||||
implementationClass = "com.jozufozu.gradle.JarSetPlugin"
|
||||
}
|
||||
create("packageInfosPlugin") {
|
||||
id = "flywheel.package-infos"
|
||||
implementationClass = "com.jozufozu.gradle.PackageInfosPlugin"
|
||||
}
|
||||
create("transitiveSourceSetsPlugin") {
|
||||
id = "flywheel.transitive-source-sets"
|
||||
implementationClass = "com.jozufozu.gradle.TransitiveSourceSetsPlugin"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation("dev.architectury.loom:dev.architectury.loom.gradle.plugin:1.6-SNAPSHOT")
|
||||
}
|
|
@ -30,27 +30,10 @@ class PlatformPlugin implements Plugin<Project> {
|
|||
def loom = project.getExtensions().getByType(LoomGradleExtensionAPI)
|
||||
def publishing = project.getExtensions().getByType(PublishingExtension)
|
||||
|
||||
// Loom only populates mc stuff to the main source set,
|
||||
// so grab that here and use it for the others.
|
||||
// Note that the `+` operator does NOT perform a deep copy
|
||||
// of a FileCollection, so this object is shared between
|
||||
// the source sets and we should avoid mutating it.
|
||||
SourceSet platformImpl = sourceSets.named('main').get()
|
||||
FileCollection mcCompileClassPath = platformImpl.compileClasspath
|
||||
|
||||
SourceSet platformApi = sourceSets.create('api')
|
||||
platformApi.compileClasspath = mcCompileClassPath
|
||||
|
||||
SourceSet platformLib = sourceSets.create('lib')
|
||||
platformLib.compileClasspath = mcCompileClassPath + platformApi.output
|
||||
|
||||
SourceSet platformBackend = sourceSets.create('backend')
|
||||
platformBackend.compileClasspath = mcCompileClassPath + platformApi.output + platformLib.output
|
||||
|
||||
// Assign here rather than concatenate to avoid modifying the mcCompileClassPath FileCollection
|
||||
platformImpl.compileClasspath = mcCompileClassPath + platformApi.output + platformLib.output + platformBackend.output
|
||||
// This isn't necessary for forge but fabric needs to recognize each classpath entry from ModSettings.
|
||||
platformImpl.runtimeClasspath += platformApi.output + platformLib.output + platformBackend.output
|
||||
|
||||
// This is needed for both platforms.
|
||||
def mainMod = loom.mods.maybeCreate('main')
|
||||
|
@ -59,16 +42,6 @@ class PlatformPlugin implements Plugin<Project> {
|
|||
mainMod.sourceSet(platformBackend)
|
||||
mainMod.sourceSet(platformImpl)
|
||||
|
||||
def forApi = newConfiguration(project, 'forApi').get()
|
||||
def forLib = newConfiguration(project, 'forLib').get()
|
||||
def forBackend = newConfiguration(project, 'forBackend').get()
|
||||
def forImpl = newConfiguration(project, 'forImpl').get()
|
||||
|
||||
extendsFrom(project, platformApi.compileOnlyConfigurationName, forApi)
|
||||
extendsFrom(project, platformLib.compileOnlyConfigurationName, forApi, forLib)
|
||||
extendsFrom(project, platformBackend.compileOnlyConfigurationName, forApi, forLib, forBackend)
|
||||
extendsFrom(project, platformImpl.compileOnlyConfigurationName, forApi, forLib, forBackend, forImpl)
|
||||
|
||||
SourceSet commonApi = commonSourceSets.named('api').get()
|
||||
SourceSet commonLib = commonSourceSets.named('lib').get()
|
||||
SourceSet commonBackend = commonSourceSets.named('backend').get()
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
package com.jozufozu.gradle
|
||||
|
||||
import org.gradle.api.tasks.SourceSet
|
||||
|
||||
class TransitiveSourceSetConfigurator(private val parent: TransitiveSourceSetsExtension, private val sourceSet: SourceSet) {
|
||||
internal val compileSourceSets = mutableSetOf<SourceSet>()
|
||||
internal val runtimeSourceSets = mutableSetOf<SourceSet>()
|
||||
|
||||
fun rootCompile() {
|
||||
parent.compileClasspath?.let { sourceSet.compileClasspath = it }
|
||||
}
|
||||
|
||||
fun rootRuntime() {
|
||||
parent.runtimeClasspath?.let { sourceSet.runtimeClasspath = it }
|
||||
}
|
||||
|
||||
fun rootImplementation() {
|
||||
rootCompile()
|
||||
rootRuntime()
|
||||
}
|
||||
|
||||
fun compile(vararg sourceSets: SourceSet) {
|
||||
compileSourceSets += sourceSets
|
||||
for (sourceSet in sourceSets) {
|
||||
this.sourceSet.compileClasspath += sourceSet.output
|
||||
}
|
||||
}
|
||||
|
||||
fun runtime(vararg sourceSets: SourceSet) {
|
||||
runtimeSourceSets += sourceSets
|
||||
for (sourceSet in sourceSets) {
|
||||
this.sourceSet.runtimeClasspath += sourceSet.output
|
||||
}
|
||||
}
|
||||
|
||||
fun implementation(vararg sourceSets: SourceSet) {
|
||||
compile(*sourceSets)
|
||||
runtime(*sourceSets)
|
||||
}
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
package com.jozufozu.gradle
|
||||
|
||||
import org.gradle.api.Action
|
||||
import org.gradle.api.Project
|
||||
import org.gradle.api.file.FileCollection
|
||||
import org.gradle.api.tasks.SourceSet
|
||||
import org.gradle.api.tasks.SourceSetContainer
|
||||
import org.gradle.kotlin.dsl.the
|
||||
|
||||
open class TransitiveSourceSetsExtension(private val project: Project) {
|
||||
var compileClasspath: FileCollection? = null
|
||||
var runtimeClasspath: FileCollection? = null
|
||||
|
||||
private val transitives = mutableMapOf<SourceSet, TransitiveSourceSetConfigurator>()
|
||||
|
||||
fun create(name: String) {
|
||||
sourceSet(project.the<SourceSetContainer>().maybeCreate(name))
|
||||
}
|
||||
|
||||
fun create(name: String, action: Action<TransitiveSourceSetConfigurator>) {
|
||||
sourceSet(project.the<SourceSetContainer>().maybeCreate(name), action)
|
||||
}
|
||||
|
||||
fun sourceSet(name: String) {
|
||||
sourceSet(project.the<SourceSetContainer>().getByName(name))
|
||||
}
|
||||
|
||||
fun sourceSet(name: String, action: Action<TransitiveSourceSetConfigurator>) {
|
||||
sourceSet(project.the<SourceSetContainer>().getByName(name), action)
|
||||
}
|
||||
|
||||
fun sourceSet(sourceSet: SourceSet) {
|
||||
registerSourceSet(sourceSet)
|
||||
}
|
||||
|
||||
fun sourceSet(sourceSet: SourceSet, action: Action<TransitiveSourceSetConfigurator>) {
|
||||
action.execute(registerSourceSet(sourceSet))
|
||||
}
|
||||
|
||||
private fun registerSourceSet(sourceSet: SourceSet): TransitiveSourceSetConfigurator {
|
||||
return transitives.computeIfAbsent(sourceSet) { TransitiveSourceSetConfigurator(this, it) }
|
||||
}
|
||||
|
||||
fun createCompileConfigurations() {
|
||||
val configs = transitives.mapValues { (sourceSet, _) ->
|
||||
project.configurations.create("for${sourceSet.name.capitalize()}") {
|
||||
isCanBeConsumed = true
|
||||
isCanBeResolved = false
|
||||
}
|
||||
}
|
||||
|
||||
transitives.forEach { (sourceSet, configurator) ->
|
||||
project.configurations.named(sourceSet.compileOnlyConfigurationName).configure {
|
||||
extendsFrom(configs[sourceSet])
|
||||
configurator.compileSourceSets.forEach {
|
||||
extendsFrom(configs[it])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun createRuntimeConfigurations() {
|
||||
val configs = transitives.mapValues { (sourceSet, _) ->
|
||||
project.configurations.create("run${sourceSet.name.capitalize()}") {
|
||||
isCanBeConsumed = true
|
||||
isCanBeResolved = false
|
||||
}
|
||||
}
|
||||
|
||||
transitives.forEach { (sourceSet, configurator) ->
|
||||
project.configurations.named(sourceSet.runtimeOnlyConfigurationName).configure {
|
||||
extendsFrom(configs[sourceSet])
|
||||
configurator.runtimeSourceSets.forEach {
|
||||
extendsFrom(configs[it])
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package com.jozufozu.gradle
|
||||
|
||||
import org.gradle.api.Plugin
|
||||
import org.gradle.api.Project
|
||||
|
||||
class TransitiveSourceSetsPlugin: Plugin<Project> {
|
||||
override fun apply(target: Project) {
|
||||
target.extensions.create("transitiveSourceSets", TransitiveSourceSetsExtension::class.java, target)
|
||||
}
|
||||
}
|
|
@ -7,36 +7,28 @@ plugins {
|
|||
id 'flywheel.package-infos'
|
||||
id 'flywheel.subproject'
|
||||
id 'flywheel.jar-sets'
|
||||
id 'flywheel.transitive-source-sets'
|
||||
}
|
||||
|
||||
sourceSets {
|
||||
// Loom only populates mc stuff to the main source set,
|
||||
// so grab that here and use it for the others.
|
||||
// Note that the `+` operator does NOT perform a deep copy
|
||||
// of a FileCollection, so this object is shared between
|
||||
// the source sets and we should avoid mutating it.
|
||||
FileCollection mcCompileClassPath = main.compileClasspath
|
||||
transitiveSourceSets {
|
||||
compileClasspath = sourceSets.main.compileClasspath
|
||||
|
||||
SourceSet api = api {
|
||||
compileClasspath = mcCompileClassPath
|
||||
create('api') {
|
||||
rootCompile()
|
||||
}
|
||||
SourceSet lib = lib {
|
||||
compileClasspath = mcCompileClassPath + api.output
|
||||
create('lib') {
|
||||
rootCompile()
|
||||
compile sourceSets.api
|
||||
}
|
||||
SourceSet backend = backend {
|
||||
compileClasspath = mcCompileClassPath + api.output + lib.output
|
||||
create('backend') {
|
||||
rootCompile()
|
||||
compile sourceSets.api, sourceSets.lib
|
||||
}
|
||||
|
||||
main {
|
||||
// Assign here rather than concatenate to avoid modifying the mcCompileClassPath FileCollection
|
||||
compileClasspath = mcCompileClassPath + api.output + lib.output + backend.output
|
||||
sourceSet(sourceSets.main) {
|
||||
compile sourceSets.api, sourceSets.lib, sourceSets.backend
|
||||
}
|
||||
|
||||
test {
|
||||
// Only test needs runtimeClasspath filled since the game shouldn't run from common alone.
|
||||
// Fine to concatenate here.
|
||||
compileClasspath += api.output + lib.output + backend.output
|
||||
runtimeClasspath += api.output + lib.output + backend.output
|
||||
sourceSet(sourceSets.test) {
|
||||
implementation sourceSets.api, sourceSets.lib, sourceSets.backend
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -7,10 +7,32 @@ plugins {
|
|||
id 'flywheel.package-infos'
|
||||
id 'flywheel.subproject'
|
||||
id 'flywheel.platform'
|
||||
id 'flywheel.transitive-source-sets'
|
||||
}
|
||||
|
||||
evaluationDependsOn(':common')
|
||||
|
||||
transitiveSourceSets {
|
||||
compileClasspath = sourceSets.main.compileClasspath
|
||||
|
||||
create('api') {
|
||||
rootCompile()
|
||||
}
|
||||
create('lib') {
|
||||
rootCompile()
|
||||
compile sourceSets.api
|
||||
}
|
||||
create('backend') {
|
||||
rootCompile()
|
||||
compile sourceSets.api, sourceSets.lib
|
||||
}
|
||||
sourceSet(sourceSets.main) {
|
||||
implementation sourceSets.api, sourceSets.lib, sourceSets.backend
|
||||
}
|
||||
|
||||
createCompileConfigurations()
|
||||
}
|
||||
|
||||
defaultPackageInfos {
|
||||
forSourceSets sourceSets.api, sourceSets.lib, sourceSets.backend, sourceSets.main
|
||||
}
|
||||
|
@ -50,5 +72,5 @@ dependencies {
|
|||
forApi project(path: ':common', configuration: 'commonApiOnly')
|
||||
forLib project(path: ':common', configuration: 'commonLib')
|
||||
forBackend project(path: ':common', configuration: 'commonBackend')
|
||||
forImpl project(path: ':common', configuration: 'commonImpl')
|
||||
forMain project(path: ':common', configuration: 'commonImpl')
|
||||
}
|
||||
|
|
|
@ -7,10 +7,32 @@ plugins {
|
|||
id 'flywheel.package-infos'
|
||||
id 'flywheel.subproject'
|
||||
id 'flywheel.platform'
|
||||
id 'flywheel.transitive-source-sets'
|
||||
}
|
||||
|
||||
evaluationDependsOn(':common')
|
||||
|
||||
transitiveSourceSets {
|
||||
compileClasspath = sourceSets.main.compileClasspath
|
||||
|
||||
create('api') {
|
||||
rootCompile()
|
||||
}
|
||||
create('lib') {
|
||||
rootCompile()
|
||||
compile sourceSets.api
|
||||
}
|
||||
create('backend') {
|
||||
rootCompile()
|
||||
compile sourceSets.api, sourceSets.lib
|
||||
}
|
||||
sourceSet(sourceSets.main) {
|
||||
compile sourceSets.api, sourceSets.lib, sourceSets.backend
|
||||
}
|
||||
|
||||
createCompileConfigurations()
|
||||
}
|
||||
|
||||
defaultPackageInfos {
|
||||
forSourceSets sourceSets.api, sourceSets.lib, sourceSets.backend, sourceSets.main
|
||||
}
|
||||
|
@ -60,5 +82,5 @@ dependencies {
|
|||
forApi project(path: ':common', configuration: 'commonApiOnly')
|
||||
forLib project(path: ':common', configuration: 'commonLib')
|
||||
forBackend project(path: ':common', configuration: 'commonBackend')
|
||||
forImpl project(path: ':common', configuration: 'commonImpl')
|
||||
forMain project(path: ':common', configuration: 'commonImpl')
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue