From 4f079f83aaa33cba67462de6cc9d90a13092cd63 Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Thu, 26 May 2022 11:09:25 +0100 Subject: [PATCH 1/4] Add `dependency` and `configuration` helpers to ModSettings. --- .../net/fabricmc/loom/api/ModSettings.java | 19 +++++++++++++++++++ .../test/integration/SplitProjectTest.groovy | 2 +- .../projects/splitSources/build.gradle | 15 +++++++++++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/api/ModSettings.java b/src/main/java/net/fabricmc/loom/api/ModSettings.java index ebe53ac2..f52546ca 100644 --- a/src/main/java/net/fabricmc/loom/api/ModSettings.java +++ b/src/main/java/net/fabricmc/loom/api/ModSettings.java @@ -28,6 +28,8 @@ import javax.inject.Inject; import org.gradle.api.Named; import org.gradle.api.Project; +import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.Dependency; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.provider.ListProperty; import org.gradle.api.tasks.SourceSet; @@ -77,6 +79,23 @@ public abstract class ModSettings implements Named { getModSourceSets().add(new SourceSetReference(sourceSet, project)); } + /** + * Add a number of {@link Dependency} to the mod's classpath group. Should be used to include all dependencies that are shaded into your mod. + * + *

Uses a detached configuration. + */ + public void dependency(Dependency... dependencies) { + Configuration detachedConfiguration = getProject().getConfigurations().detachedConfiguration(dependencies); + configuration(detachedConfiguration); + } + + /** + * Add a {@link Configuration} to the mod's classpath group. Should be used to include all dependencies that are shaded into your mod. + */ + public void configuration(Configuration configuration) { + getModFiles().from(configuration); + } + /** * List of classpath directories, used to populate the `fabric.classPathGroups` Fabric Loader system property. * Use the {@link ModSettings#sourceSet} methods to add to this. diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/SplitProjectTest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/SplitProjectTest.groovy index b7440833..a81f753b 100644 --- a/src/test/groovy/net/fabricmc/loom/test/integration/SplitProjectTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/integration/SplitProjectTest.groovy @@ -38,7 +38,7 @@ class SplitProjectTest extends Specification implements GradleProjectTestTrait { def gradle = gradleProject(project: "splitSources", version: version) when: - def result = gradle.run(task: "build") + def result = gradle.run(tasks: ["build", "generateDLIConfig"]) then: result.task(":build").outcome == SUCCESS diff --git a/src/test/resources/projects/splitSources/build.gradle b/src/test/resources/projects/splitSources/build.gradle index ea40b502..c4d5174f 100644 --- a/src/test/resources/projects/splitSources/build.gradle +++ b/src/test/resources/projects/splitSources/build.gradle @@ -6,8 +6,21 @@ plugins { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 +configurations { + shade +} + loom { splitEnvironmentSourceSets() + + mods { + modid { + sourceSet sourceSets.main + sourceSet sourceSets.client + + configuration configurations.shade + } + } } dependencies { @@ -16,6 +29,8 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:0.13.3" modImplementation "net.fabricmc.fabric-api:fabric-api:0.47.8+1.18.2" + + shade "com.googlecode.json-simple:json-simple:1.1.1" } tasks.withType(JavaCompile).configureEach { From 07ded449eeff2dcdb49f7208eb3e8db12fd0bacb Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Thu, 26 May 2022 11:21:53 +0100 Subject: [PATCH 2/4] Update mercury and set source compatibility version to 17 --- build.gradle | 2 +- .../net/fabricmc/loom/task/service/SourceRemapperService.java | 4 +++- src/main/java/net/fabricmc/loom/util/Constants.java | 2 ++ src/main/java/net/fabricmc/loom/util/SourceRemapper.java | 3 ++- 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index d67a8ca1..e697facd 100644 --- a/build.gradle +++ b/build.gradle @@ -98,7 +98,7 @@ dependencies { implementation ('net.fabricmc:cfr:0.1.1') // source code remapping - implementation ('net.fabricmc:mercury:0.2.5') + implementation ('net.fabricmc:mercury:0.2.6') // Kotlin implementation('org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.4.2') { diff --git a/src/main/java/net/fabricmc/loom/task/service/SourceRemapperService.java b/src/main/java/net/fabricmc/loom/task/service/SourceRemapperService.java index 45d2db00..30b1ea0f 100644 --- a/src/main/java/net/fabricmc/loom/task/service/SourceRemapperService.java +++ b/src/main/java/net/fabricmc/loom/task/service/SourceRemapperService.java @@ -1,7 +1,7 @@ /* * This file is part of fabric-loom, licensed under the MIT License (MIT). * - * Copyright (c) 2021 FabricMC + * Copyright (c) 2021-2022 FabricMC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -42,6 +42,7 @@ import org.slf4j.LoggerFactory; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.task.RemapSourcesJarTask; +import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.DeletingFileVisitor; import net.fabricmc.loom.util.FileSystemUtil; import net.fabricmc.loom.util.SourceRemapper; @@ -122,6 +123,7 @@ public final class SourceRemapperService implements SharedService { private Mercury createMercury() { var mercury = new Mercury(); mercury.setGracefulClasspathChecks(true); + mercury.setSourceCompatibility(Constants.MERCURY_SOURCE_VERSION); try { mercury.getProcessors().add(MercuryRemapper.create(getMappings())); diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index 1355279d..b01c8c58 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -27,6 +27,7 @@ package net.fabricmc.loom.util; import java.util.List; import com.google.common.collect.ImmutableList; +import org.eclipse.jdt.core.JavaCore; import org.gradle.api.plugins.JavaPlugin; import org.objectweb.asm.Opcodes; @@ -41,6 +42,7 @@ public class Constants { public static final String FABRIC_REPOSITORY = "https://maven.fabricmc.net/"; public static final int ASM_VERSION = Opcodes.ASM9; + public static final String MERCURY_SOURCE_VERSION = JavaCore.VERSION_17; public static final List MOD_COMPILE_ENTRIES = ImmutableList.of( new RemappedConfigurationEntry("modApi", JavaPlugin.API_CONFIGURATION_NAME, true, true, PublishingMode.COMPILE_AND_RUNTIME), diff --git a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java index 64261ea8..3f4f3c51 100644 --- a/src/main/java/net/fabricmc/loom/util/SourceRemapper.java +++ b/src/main/java/net/fabricmc/loom/util/SourceRemapper.java @@ -1,7 +1,7 @@ /* * This file is part of fabric-loom, licensed under the MIT License (MIT). * - * Copyright (c) 2018-2021 FabricMC + * Copyright (c) 2018-2022 FabricMC * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal @@ -225,6 +225,7 @@ public class SourceRemapper { public static Mercury createMercuryWithClassPath(Project project, boolean toNamed) { Mercury m = new Mercury(); m.setGracefulClasspathChecks(true); + m.setSourceCompatibility(Constants.MERCURY_SOURCE_VERSION); for (File file : project.getConfigurations().getByName(Constants.Configurations.LOADER_DEPENDENCIES).getFiles()) { m.getClassPath().add(file.toPath()); From 3066b580598f7987215a4d48ca3e55239131e8de Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Thu, 26 May 2022 11:31:45 +0100 Subject: [PATCH 3/4] Fix retrieving kotlin plugin version for beta/rc builds. --- .../loom/util/kotlin/KotlinPluginUtils.java | 19 +++++++++++++++++-- .../kotlin/KotlinRemapperClassloader.java | 2 +- .../KotlinRemapperClassloaderTest.groovy | 2 +- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/util/kotlin/KotlinPluginUtils.java b/src/main/java/net/fabricmc/loom/util/kotlin/KotlinPluginUtils.java index b0e7aaf8..367a947b 100644 --- a/src/main/java/net/fabricmc/loom/util/kotlin/KotlinPluginUtils.java +++ b/src/main/java/net/fabricmc/loom/util/kotlin/KotlinPluginUtils.java @@ -24,19 +24,34 @@ package net.fabricmc.loom.util.kotlin; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import kotlinx.metadata.jvm.KotlinClassMetadata; import org.gradle.api.Project; public class KotlinPluginUtils { private static final String KOTLIN_PLUGIN_ID = "org.jetbrains.kotlin.jvm"; + private static final Pattern VERSION_PATTERN = Pattern.compile("\\((.*?)\\)"); public static boolean hasKotlinPlugin(Project project) { return project.getPluginManager().hasPlugin(KOTLIN_PLUGIN_ID); } public static String getKotlinPluginVersion(Project project) { - Class koltinPluginClass = project.getPlugins().getPlugin(KOTLIN_PLUGIN_ID).getClass(); - return koltinPluginClass.getPackage().getImplementationVersion().split("-")[0]; + final Class kotlinPluginClass = project.getPlugins().getPlugin(KOTLIN_PLUGIN_ID).getClass(); + /* + 1.7.0-RC-release-217(1.7.0-RC) + 1.6.21-release-334(1.6.21) + */ + final String implVersion = kotlinPluginClass.getPackage().getImplementationVersion(); + final Matcher matcher = VERSION_PATTERN.matcher(implVersion); + + if (!matcher.find()) { + throw new IllegalStateException("Unable to match Kotlin version from: " + implVersion); + } + + return matcher.group(1); } public static String getKotlinMetadataVersion() { diff --git a/src/main/java/net/fabricmc/loom/util/kotlin/KotlinRemapperClassloader.java b/src/main/java/net/fabricmc/loom/util/kotlin/KotlinRemapperClassloader.java index fb3ee13b..b1770ac5 100644 --- a/src/main/java/net/fabricmc/loom/util/kotlin/KotlinRemapperClassloader.java +++ b/src/main/java/net/fabricmc/loom/util/kotlin/KotlinRemapperClassloader.java @@ -34,7 +34,7 @@ import net.fabricmc.loom.LoomGradlePlugin; import net.fabricmc.loom.kotlin.remapping.KotlinMetadataTinyRemapperExtensionImpl; /** - * Used to run the Kotlin remapper with a specific version of Koltin that may not match the kotlin version included with gradle. + * Used to run the Kotlin remapper with a specific version of Kotlin that may not match the kotlin version included with gradle. */ public class KotlinRemapperClassloader extends URLClassLoader { // Packages that should be loaded from the gradle plugin classloader. diff --git a/src/test/groovy/net/fabricmc/loom/test/unit/kotlin/KotlinRemapperClassloaderTest.groovy b/src/test/groovy/net/fabricmc/loom/test/unit/kotlin/KotlinRemapperClassloaderTest.groovy index fc7df3fc..a3153291 100644 --- a/src/test/groovy/net/fabricmc/loom/test/unit/kotlin/KotlinRemapperClassloaderTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/unit/kotlin/KotlinRemapperClassloaderTest.groovy @@ -40,7 +40,7 @@ class KotlinRemapperClassloaderTest extends Specification { private static String KOTLIN_URL = "https://repo1.maven.org/maven2/org/jetbrains/kotlin/kotlin-stdlib/${KOTLIN_VERSION}/kotlin-stdlib-${KOTLIN_VERSION}.jar" private static String KOTLIN_METADATA_URL = "https://repo1.maven.org/maven2/org/jetbrains/kotlinx/kotlinx-metadata-jvm/${KOTLIN_METADATA_VERSION}/kotlinx-metadata-jvm-${KOTLIN_METADATA_VERSION}.jar" - def "Test Koltin Remapper Classloader"() { + def "Test Kotlin Remapper Classloader"() { given: def classLoader = KotlinRemapperClassloader.create(new TestKotlinClasspath()) def mockTrClass = Mock(TrClass) From a2e84e242a59e29db2f455734031e77179b3336c Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Thu, 26 May 2022 11:32:53 +0100 Subject: [PATCH 4/4] Fix #654 --- .../java/net/fabricmc/loom/configuration/mods/ModProcessor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java index 0f982155..958de190 100644 --- a/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/mods/ModProcessor.java @@ -102,7 +102,7 @@ public class ModProcessor { // Check all the mods we expect exist for (ModDependencyInfo info : processList) { if (!info.getRemappedOutput().exists()) { - throw new RuntimeException("Failed to find remapped mod" + info); + throw new RuntimeException("Failed to find remapped mod: " + info); } } }