From 15184b8ccd3df835b0e2b2ef615e2f96d6cfcc9c Mon Sep 17 00:00:00 2001 From: Jozufozu Date: Mon, 29 Apr 2024 17:01:18 -0700 Subject: [PATCH] Declaration of jar - Expose desired behaviors from platform plugin via an extension - Move PlatformPlugin to platform package --- buildSrc/build.gradle.kts | 2 +- .../com/jozufozu/gradle/PlatformPlugin.kt | 115 ------------ .../nullability/PackageInfosExtension.kt | 2 +- .../gradle/platform/PlatformExtension.kt | 164 ++++++++++++++++++ .../gradle/platform/PlatformPlugin.kt | 10 ++ common/build.gradle | 18 +- fabric/build.gradle | 39 ++--- forge/build.gradle | 37 ++-- 8 files changed, 206 insertions(+), 181 deletions(-) delete mode 100644 buildSrc/src/main/kotlin/com/jozufozu/gradle/PlatformPlugin.kt create mode 100644 buildSrc/src/main/kotlin/com/jozufozu/gradle/platform/PlatformExtension.kt create mode 100644 buildSrc/src/main/kotlin/com/jozufozu/gradle/platform/PlatformPlugin.kt diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 6c37d9e49..070b9c27d 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -22,7 +22,7 @@ gradlePlugin { plugins { create("platformPlugin") { id = "flywheel.platform" - implementationClass = "com.jozufozu.gradle.PlatformPlugin" + implementationClass = "com.jozufozu.gradle.platform.PlatformPlugin" } create("jarSetPlugin") { id = "flywheel.jar-sets" diff --git a/buildSrc/src/main/kotlin/com/jozufozu/gradle/PlatformPlugin.kt b/buildSrc/src/main/kotlin/com/jozufozu/gradle/PlatformPlugin.kt deleted file mode 100644 index eaa51344e..000000000 --- a/buildSrc/src/main/kotlin/com/jozufozu/gradle/PlatformPlugin.kt +++ /dev/null @@ -1,115 +0,0 @@ -package com.jozufozu.gradle - -import com.jozufozu.gradle.jarset.JarTaskSet -import net.fabricmc.loom.api.LoomGradleExtensionAPI -import net.fabricmc.loom.task.RemapJarTask -import net.fabricmc.loom.task.RemapSourcesJarTask -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.publish.PublishingExtension -import org.gradle.api.publish.maven.MavenPublication -import org.gradle.api.tasks.SourceSet -import org.gradle.api.tasks.SourceSetContainer -import org.gradle.api.tasks.compile.JavaCompile -import org.gradle.api.tasks.javadoc.Javadoc -import org.gradle.jvm.tasks.Jar -import org.gradle.kotlin.dsl.the -import org.gradle.language.jvm.tasks.ProcessResources - -class PlatformPlugin: Plugin { - override fun apply(project: Project) { - val commonProject = project.project(":common") - val commonSourceSets = commonProject.the() - - val sourceSets = project.the() - val loom = project.the() - val publishing = project.the() - - val platformImpl = sourceSets.named("main").get() - val platformApi = sourceSets.create("api") - val platformLib = sourceSets.create("lib") - val platformBackend = sourceSets.create("backend") - - // This is needed for both platforms. - val mainMod = loom.mods.maybeCreate("main") - mainMod.sourceSet(platformApi) - mainMod.sourceSet(platformLib) - mainMod.sourceSet(platformBackend) - mainMod.sourceSet(platformImpl) - - val commonApi = commonSourceSets.named("api").get() - val commonLib = commonSourceSets.named("lib").get() - val commonBackend = commonSourceSets.named("backend").get() - val commonImpl = commonSourceSets.named("main").get() - - val commonSources = listOf(commonApi, commonLib, commonBackend, commonImpl) - - // Directly compile the platform sources with the common sources - includeFromCommon(project, platformApi, commonApi) - includeFromCommon(project, platformLib, commonLib) - includeFromCommon(project, platformBackend, commonBackend) - includeFromCommon(project, platformImpl, commonImpl) - - val tasks = project.tasks - - tasks.withType(JavaCompile::class.java).configureEach { - JarTaskSet.excludeDuplicatePackageInfos(this) - } - - tasks.named("jar", Jar::class.java).configure { - from(platformApi.output, platformLib.output, platformBackend.output) - - JarTaskSet.excludeDuplicatePackageInfos(this) - } - - tasks.named("javadoc", Javadoc::class.java).configure { - commonSources.forEach { source(it.allJava) } - - source(platformApi.allJava, platformLib.allJava, platformBackend.allJava) - - JarTaskSet.excludeDuplicatePackageInfos(this) - } - - tasks.named("sourcesJar", Jar::class.java).configure { - commonSources.forEach { from(it.allJava) } - - from(platformApi.allJava, platformLib.allJava, platformBackend.allJava) - - JarTaskSet.excludeDuplicatePackageInfos(this) - } - - val remapJar = tasks.named("remapJar", RemapJarTask::class.java) - val remapSourcesJar = tasks.named("remapSourcesJar", RemapSourcesJarTask::class.java) - val javadocJar = tasks.named("javadocJar", Jar::class.java) - - val apiSet = JarTaskSet.create(project, "api", platformApi, platformLib) - - val mcVersion = project.property("artifact_minecraft_version") - - publishing.publications { - // we should be using remapped on both Fabric and Forge because Forge needs to put things in srg - register("mavenApi", MavenPublication::class.java) { - artifact(apiSet.remapJar) - artifact(apiSet.remapSources) - artifact(apiSet.javadocJar) - artifactId = "flywheel-${project.name}-api-${mcVersion}" - } - register("mavenImpl", MavenPublication::class.java) { - artifact(remapJar) - artifact(remapSourcesJar) - artifact(javadocJar) - artifactId = "flywheel-${project.name}-${mcVersion}" - } - } - } - - private fun includeFromCommon(project: Project, sourceSet: SourceSet, commonSourceSet: SourceSet) { - project.tasks.named(sourceSet.compileJavaTaskName, JavaCompile::class.java).configure { - source(commonSourceSet.allJava) - } - - project.tasks.named(sourceSet.processResourcesTaskName, ProcessResources::class.java).configure { - from(commonSourceSet.resources) - } - } -} diff --git a/buildSrc/src/main/kotlin/com/jozufozu/gradle/nullability/PackageInfosExtension.kt b/buildSrc/src/main/kotlin/com/jozufozu/gradle/nullability/PackageInfosExtension.kt index b32783ef9..e4bae3acf 100644 --- a/buildSrc/src/main/kotlin/com/jozufozu/gradle/nullability/PackageInfosExtension.kt +++ b/buildSrc/src/main/kotlin/com/jozufozu/gradle/nullability/PackageInfosExtension.kt @@ -5,7 +5,7 @@ import org.gradle.api.tasks.Delete import org.gradle.api.tasks.SourceSet open class PackageInfosExtension(private val project: Project) { - fun forSourceSets(vararg sourceSets: SourceSet) { + fun sources(vararg sourceSets: SourceSet) { for (sourceSet in sourceSets) { forSourceSet(sourceSet) } diff --git a/buildSrc/src/main/kotlin/com/jozufozu/gradle/platform/PlatformExtension.kt b/buildSrc/src/main/kotlin/com/jozufozu/gradle/platform/PlatformExtension.kt new file mode 100644 index 000000000..36fb6a127 --- /dev/null +++ b/buildSrc/src/main/kotlin/com/jozufozu/gradle/platform/PlatformExtension.kt @@ -0,0 +1,164 @@ +package com.jozufozu.gradle.platform + +import com.jozufozu.gradle.jarset.JarTaskSet +import net.fabricmc.loom.api.LoomGradleExtensionAPI +import net.fabricmc.loom.task.RemapJarTask +import net.fabricmc.loom.task.RemapSourcesJarTask +import org.gradle.api.Project +import org.gradle.api.publish.PublishingExtension +import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.tasks.SourceSet +import org.gradle.api.tasks.SourceSetContainer +import org.gradle.api.tasks.compile.JavaCompile +import org.gradle.api.tasks.javadoc.Javadoc +import org.gradle.jvm.tasks.Jar +import org.gradle.kotlin.dsl.provideDelegate +import org.gradle.kotlin.dsl.the +import org.gradle.language.jvm.tasks.ProcessResources +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + +open class PlatformExtension(val project: Project) { + var commonProject: Project by DependentProject(this.project) + + var modArtifactId: String = "flywheel-${project.name}-${project.property("artifact_minecraft_version")}" + + var apiArtifactId: String = "flywheel-${project.name}-api-${project.property("artifact_minecraft_version")}" + + private val sources = mutableSetOf() + private val commonSourceSets: SourceSetContainer by lazy { commonProject.the() } + + fun sources(vararg sourceSets: SourceSet) { + this.sources.addAll(sourceSets) + } + + fun setupLoomMod() { + project.the().mods.maybeCreate("main").apply { + sources.forEach(::sourceSet) + } + } + + fun setupLoomRuns() { + project.the().runs.apply { + named("client") { + isIdeConfigGenerated = true + + // Turn on our own debug flags + property("flw.dumpShaderSource", "true") + property("flw.debugMemorySafety", "true") + + // Turn on mixin debug flags + property("mixin.debug.export", "true") + property("mixin.debug.verbose", "true") + + // 720p baby! + programArgs("--width", "1280", "--height", "720") + } + + // We're a client mod, but we need to make sure we correctly render when playing on a server. + named("server") { + isIdeConfigGenerated = true + programArgs("--nogui") + } + } + } + + fun compileWithCommonSourceSets() { + project.tasks.apply { + withType(JavaCompile::class.java).configureEach { + JarTaskSet.excludeDuplicatePackageInfos(this) + } + + sources.forEach { + val commonSourceSet = commonSourceSets.named(it.name).get() + + named(it.compileJavaTaskName, JavaCompile::class.java).configure { + source(commonSourceSet.allJava) + } + named(it.processResourcesTaskName, ProcessResources::class.java).configure { + from(commonSourceSet.resources) + } + } + } + } + + fun setupFatJar() { + project.tasks.apply { + val extraSourceSets = sources.filter { it.name != "main" }.toList() + val commonSources = sources.map { commonSourceSets.named(it.name).get() } + + named("jar", Jar::class.java).configure { + extraSourceSets.forEach { from(it.output) } + + JarTaskSet.excludeDuplicatePackageInfos(this) + } + + named("javadoc", Javadoc::class.java).configure { + commonSources.forEach { source(it.allJava) } + extraSourceSets.forEach { source(it.allJava) } + + JarTaskSet.excludeDuplicatePackageInfos(this) + } + + named("sourcesJar", Jar::class.java).configure { + commonSources.forEach { from(it.allJava) } + extraSourceSets.forEach { from(it.allJava) } + + JarTaskSet.excludeDuplicatePackageInfos(this) + } + } + } + + fun publishMod() { + val remapJar = project.tasks.named("remapJar", RemapJarTask::class.java) + val remapSourcesJar = project.tasks.named("remapSourcesJar", RemapSourcesJarTask::class.java) + val javadocJar = project.tasks.named("javadocJar", Jar::class.java) + + project.the().publications { + register("modMaven", MavenPublication::class.java) { + artifact(remapJar) + artifact(remapSourcesJar) + artifact(javadocJar) + artifactId = modArtifactId + } + } + } + + fun publishRemap(artifactId: String, jarSet: JarTaskSet) { + project.the().publications { + register("${jarSet.name}RemapMaven", MavenPublication::class.java) { + artifact(jarSet.remapJar) + artifact(jarSet.remapSources) + artifact(jarSet.javadocJar) + this.artifactId = artifactId + } + } + } + + fun publish(artifactId: String, jarSet: JarTaskSet) { + project.the().publications { + register("${jarSet.name}Maven", MavenPublication::class.java) { + artifact(jarSet.jar) + artifact(jarSet.sources) + artifact(jarSet.javadocJar) + this.artifactId = artifactId + } + } + } + + private class DependentProject(private val thisProject: Project) : ReadWriteProperty { + private var value: Project? = null + + override fun getValue(thisRef: Any?, property: KProperty<*>): Project { + return value ?: throw IllegalStateException("Property ${property.name} should be initialized before get.") + } + + override fun setValue(thisRef: Any?, property: KProperty<*>, value: Project) { + this.value = value + thisProject.evaluationDependsOn(value.path) + } + + override fun toString(): String = + "NotNullProperty(${if (value != null) "value=$value" else "value not initialized yet"})" + } +} diff --git a/buildSrc/src/main/kotlin/com/jozufozu/gradle/platform/PlatformPlugin.kt b/buildSrc/src/main/kotlin/com/jozufozu/gradle/platform/PlatformPlugin.kt new file mode 100644 index 000000000..e3284c103 --- /dev/null +++ b/buildSrc/src/main/kotlin/com/jozufozu/gradle/platform/PlatformPlugin.kt @@ -0,0 +1,10 @@ +package com.jozufozu.gradle.platform + +import org.gradle.api.Plugin +import org.gradle.api.Project + +class PlatformPlugin: Plugin { + override fun apply(project: Project) { + project.extensions.create("platform", PlatformExtension::class.java) + } +} diff --git a/common/build.gradle b/common/build.gradle index b407c7258..8ac5231cb 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -33,23 +33,15 @@ transitiveSourceSets { } defaultPackageInfos { - forSourceSets sourceSets.api, sourceSets.lib, sourceSets.backend, sourceSets.main + sources sourceSets.api, sourceSets.lib, sourceSets.backend, sourceSets.main } // For sharing with other subprojects. jarSets { - createJars('apiOnly', sourceSets.api).configure { - it.createOutgoingConfiguration('common') - } - createJars('lib').configure { - it.createOutgoingConfiguration('common') - } - createJars('backend').configure { - it.createOutgoingConfiguration('common') - } - createJars('impl', sourceSets.main).configure { - it.createOutgoingConfiguration('common') - } + createJars('apiOnly', sourceSets.api).createOutgoingConfiguration('common') + createJars('lib').createOutgoingConfiguration('common') + createJars('backend').createOutgoingConfiguration('common') + createJars('impl', sourceSets.main).createOutgoingConfiguration('common') } // For publishing diff --git a/fabric/build.gradle b/fabric/build.gradle index 53483d51f..7b3fbb111 100644 --- a/fabric/build.gradle +++ b/fabric/build.gradle @@ -7,11 +7,10 @@ plugins { id 'flywheel.package-infos' id 'flywheel.subproject' id 'flywheel.platform' + id 'flywheel.jar-sets' id 'flywheel.transitive-source-sets' } -evaluationDependsOn(':common') - transitiveSourceSets { compileClasspath = sourceSets.main.compileClasspath @@ -33,33 +32,19 @@ transitiveSourceSets { createCompileConfigurations() } -defaultPackageInfos { - forSourceSets sourceSets.api, sourceSets.lib, sourceSets.backend, sourceSets.main +platform { + commonProject = project(':common') + sources sourceSets.api, sourceSets.lib, sourceSets.backend, sourceSets.main + compileWithCommonSourceSets() + setupLoomMod() + setupLoomRuns() + setupFatJar() + publishMod() + publishRemap(apiArtifactId, jarSets.createJars('api', sourceSets.api, sourceSets.lib)) } -loom { - runs { - client { - ideConfigGenerated true - - // Turn on our own debug flags - property 'flw.dumpShaderSource', 'true' - property 'flw.debugMemorySafety', 'true' - - // Turn on mixin debug flags - property 'mixin.debug.export', 'true' - property 'mixin.debug.verbose', 'true' - - // 720p baby! - programArgs '--width', '1280', '--height', '720' - } - - // We're a client mod, but we need to make sure we correctly render when playing on a server. - server { - ideConfigGenerated true - programArgs '--nogui' - } - } +defaultPackageInfos { + sources sourceSets.api, sourceSets.lib, sourceSets.backend, sourceSets.main } dependencies { diff --git a/forge/build.gradle b/forge/build.gradle index 995477e64..04ec7eab4 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -7,11 +7,10 @@ plugins { id 'flywheel.package-infos' id 'flywheel.subproject' id 'flywheel.platform' + id 'flywheel.jar-sets' id 'flywheel.transitive-source-sets' } -evaluationDependsOn(':common') - transitiveSourceSets { compileClasspath = sourceSets.main.compileClasspath @@ -33,8 +32,19 @@ transitiveSourceSets { createCompileConfigurations() } +platform { + commonProject = project(':common') + sources sourceSets.api, sourceSets.lib, sourceSets.backend, sourceSets.main + compileWithCommonSourceSets() + setupLoomMod() + setupLoomRuns() + setupFatJar() + publishMod() + publishRemap(apiArtifactId, jarSets.createJars('api', sourceSets.api, sourceSets.lib)) +} + defaultPackageInfos { - forSourceSets sourceSets.api, sourceSets.lib, sourceSets.backend, sourceSets.main + sources sourceSets.api, sourceSets.lib, sourceSets.backend, sourceSets.main } loom { @@ -49,27 +59,6 @@ loom { property 'forge.logging.markers', '' property 'forge.logging.console.level', 'debug' } - - client { - ideConfigGenerated true - - // Turn on our own debug flags - property 'flw.dumpShaderSource', 'true' - property 'flw.debugMemorySafety', 'true' - - // Turn on mixin debug flags - property 'mixin.debug.export', 'true' - property 'mixin.debug.verbose', 'true' - - // 720p baby! - programArgs '--width', '1280', '--height', '720' - } - - // We're a client mod, but we need to make sure we correctly render when playing on a server. - server { - ideConfigGenerated true - programArgs '--nogui' - } } }