fabric-loom/build.gradle

325 lines
8.5 KiB
Groovy

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.3')
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
}