plugins { id 'java' id 'maven-publish' id 'java-gradle-plugin' id 'idea' id 'eclipse' id 'groovy' id 'checkstyle' id 'jacoco' id 'codenarc' id "com.diffplug.spotless" version "5.14.1" } sourceCompatibility = 16 targetCompatibility = 16 tasks.withType(JavaCompile).configureEach { it.options.encoding = "UTF-8" it.options.release = 16 } group = 'net.fabricmc' archivesBaseName = project.name def baseVersion = '0.9' def ENV = System.getenv() if (ENV.BUILD_NUMBER) { version = baseVersion + '.' + ENV.BUILD_NUMBER } else { version = baseVersion + '.local' } repositories { maven { name = 'Fabric' url = 'https://maven.fabricmc.net/' } mavenCentral() } configurations { bootstrap { transitive false } compileClasspath.extendsFrom bootstrap runtimeClasspath.extendsFrom bootstrap testRuntimeClasspath.extendsFrom bootstrap } configurations.all { resolutionStrategy { failOnNonReproducibleResolution() } } dependencies { implementation gradleApi() bootstrap project(":bootstrap") // libraries implementation ('commons-io:commons-io:2.8.0') implementation ('org.zeroturnaround:zt-zip:1.14') implementation ('com.google.code.gson:gson:2.8.6') implementation ('com.fasterxml.jackson.core:jackson-databind:2.12.3') implementation ('com.google.guava:guava:30.1-jre') implementation ('org.ow2.asm:asm:9.2') implementation ('org.ow2.asm:asm-analysis:9.2') implementation ('org.ow2.asm:asm-commons:9.2') implementation ('org.ow2.asm:asm-tree:9.2') implementation ('org.ow2.asm:asm-util:9.2') // game handling utils implementation ('net.fabricmc:stitch:0.6.1') { exclude module: 'enigma' } // tinyfile management implementation ('net.fabricmc:tiny-remapper:0.4.2') implementation ('net.fabricmc:tiny-mappings-parser:0.3.0+build.17') implementation 'net.fabricmc:access-widener:1.0.0' implementation 'net.fabricmc:mapping-io:0.1.3' implementation ('net.fabricmc:lorenz-tiny:3.0.0') { transitive = false } implementation ('org.cadixdev:lorenz-io-proguard:0.5.6') // decompilers implementation ('net.fabricmc:fabric-fernflower:1.4.1') implementation ('org.benf:cfr:0.151') // source code remapping implementation ('org.cadixdev:mercury:[0.1.0-rc1]') // Mercury pulls all of these deps in, however eclipse does not specify the exact version to use so they can get updated without us knowing. // Depend specifically on these versions to prevent them from being updated under our feet. // The POM is also patched later on to as this strict versioning does not make it through. implementation ('org.eclipse.jdt:org.eclipse.jdt.core:[3.21.0]') implementation ('org.eclipse.platform:org.eclipse.compare.core:[3.6.1000]') implementation ('org.eclipse.platform:org.eclipse.core.commands:[3.9.800]') implementation ('org.eclipse.platform:org.eclipse.core.contenttype:[3.7.900]') implementation ('org.eclipse.platform:org.eclipse.core.expressions:[3.7.100]') implementation ('org.eclipse.platform:org.eclipse.core.filesystem:[1.7.700]') implementation ('org.eclipse.platform:org.eclipse.core.jobs:[3.10.1100]') implementation ('org.eclipse.platform:org.eclipse.core.resources:[3.14.0]') implementation ('org.eclipse.platform:org.eclipse.core.runtime:[3.20.100]') implementation ('org.eclipse.platform:org.eclipse.equinox.app:[1.5.100]') implementation ('org.eclipse.platform:org.eclipse.equinox.common:[3.14.100]') implementation ('org.eclipse.platform:org.eclipse.equinox.preferences:[3.8.200]') implementation ('org.eclipse.platform:org.eclipse.equinox.registry:[3.10.100]') implementation ('org.eclipse.platform:org.eclipse.osgi:[3.16.200]') implementation ('org.eclipse.platform:org.eclipse.team.core:[3.8.1100]') implementation ('org.eclipse.platform:org.eclipse.text:[3.11.0]') // Kapt integration compileOnly('org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.0') // Testing testImplementation(gradleTestKit()) testImplementation('org.spockframework:spock-core:2.0-groovy-3.0') { exclude module: 'groovy-all' } testImplementation 'io.javalin:javalin:3.13.7' compileOnly 'org.jetbrains:annotations:20.1.0' } jar { manifest { attributes 'Implementation-Version': project.version } from configurations.bootstrap.collect { it.isDirectory() ? it : zipTree(it) } } task sourcesJar(type: Jar, dependsOn: classes) { archiveClassifier = 'sources' from sourceSets.main.allSource } task javadocJar(type: Jar, dependsOn: javadoc) { archiveClassifier = 'javadoc' from javadoc.destinationDir } spotless { java { licenseHeaderFile(rootProject.file("HEADER")).yearSeparator("-") targetExclude("**/loom/util/DownloadUtil.java") } groovy { licenseHeaderFile(rootProject.file("HEADER")).yearSeparator("-") } } checkstyle { configFile = file('checkstyle.xml') toolVersion = '8.44' } codenarc { toolVersion = "2.1.0" configFile = file("codenarc.groovy") } gradlePlugin { plugins { fabricLoom { id = 'fabric-loom' implementationClass = 'net.fabricmc.loom.bootstrap.LoomGradlePluginBootstrap' } } } jacoco { toolVersion = "0.8.6" } // Run to get test coverage. jacocoTestReport { dependsOn test reports { xml.enabled false csv.enabled false html.destination file("${buildDir}/jacocoHtml") } } test { maxHeapSize = "4096m" useJUnitPlatform() } import org.w3c.dom.Document import org.w3c.dom.Element import org.w3c.dom.Node def patchPom(groovy.util.Node node) { node.dependencies.first().each { def groupId = it.get("groupId").first().value().first() // Patch all eclipse deps to use a strict version if (groupId.startsWith("org.eclipse.")) { def version = it.get("version").first().value().first() it.get("version").first().value = new groovy.util.NodeList(["[$version]"]) } } } publishing { publications { plugin(MavenPublication) { publication -> groupId project.group artifactId project.archivesBaseName version project.version from components['java'] artifact sourcesJar artifact javadocJar pom.withXml { patchPom(asNode()) } } // Also publish a snapshot so people can use the latest version if they wish snapshot(MavenPublication) { publication -> groupId project.group artifactId project.archivesBaseName version baseVersion + '-SNAPSHOT' from components['java'] artifact sourcesJar artifact javadocJar pom.withXml { patchPom(asNode()) } } // Manually crate the plugin marker for snapshot versions snapshotPlugin(MavenPublication) { publication -> groupId 'fabric-loom' artifactId 'fabric-loom.gradle.plugin' version baseVersion + '-SNAPSHOT' pom.withXml({ // Based off org.gradle.plugin.devel.plugins.MavenPluginPublishPlugin Element root = asElement() Document document = root.getOwnerDocument() Node dependencies = root.appendChild(document.createElement('dependencies')) Node dependency = dependencies.appendChild(document.createElement('dependency')) Node groupId = dependency.appendChild(document.createElement('groupId')) groupId.setTextContent('net.fabricmc') Node artifactId = dependency.appendChild(document.createElement('artifactId')) artifactId.setTextContent('fabric-loom') Node version = dependency.appendChild(document.createElement('version')) version.setTextContent(baseVersion + '-SNAPSHOT') }) } } repositories { maven { if (ENV.MAVEN_URL) { url ENV.MAVEN_URL credentials { username ENV.MAVEN_USERNAME password ENV.MAVEN_PASSWORD } } } } } // Need to tweak this file to pretend we are compatible with j8 so the bootstrap will run. tasks.withType(GenerateModuleMetadata) { doLast { def file = outputFile.get().asFile def metadata = new groovy.json.JsonSlurper().parseText(file.text) metadata.variants.each { it.attributes["org.gradle.jvm.version"] = 8 } file.text = groovy.json.JsonOutput.toJson(metadata) } } // A task to output a json file with a list of all the test to run task writeActionsTestMatrix() { doLast { def testMatrix = [] file('src/test/groovy/net/fabricmc/loom/test/integration').eachFile { if (it.name.endsWith("Test.groovy")) { if (it.name.endsWith("ReproducibleBuildTest.groovy")) { // This test gets a special case to run across all os's return } def className = it.name.replace(".groovy", "") testMatrix.add("net.fabricmc.loom.test.integration.${className}") } } // Run all the unit tests togeather testMatrix.add("net.fabricmc.loom.test.unit.*") def json = groovy.json.JsonOutput.toJson(testMatrix) def output = file("build/test_matrix.json") output.parentFile.mkdir() output.text = json } } tasks.named('wrapper') { distributionType = Wrapper.DistributionType.ALL }