From 455b9d6aedaf19c343ceaa09de3e36adf0dba8c5 Mon Sep 17 00:00:00 2001 From: modmuss Date: Tue, 19 Mar 2024 20:08:35 +0000 Subject: [PATCH] Only set startFirstThread on versions using LWJGL 3 (#1076) * Only set startFirstThread on versions using LWJGL 3 * Lazily evaluate RunConfig --- .../loom/configuration/ide/RunConfig.java | 8 +++++++ .../configuration/ide/RunConfigSettings.java | 1 - .../fabricmc/loom/task/AbstractRunTask.java | 22 +++++++++---------- .../projects/runconfigs/build.gradle | 4 ++++ 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java index 242558e1..af1ffd3a 100644 --- a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java +++ b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfig.java @@ -43,6 +43,7 @@ import java.util.stream.Collectors; import com.google.common.collect.ImmutableMap; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import org.gradle.api.JavaVersion; import org.gradle.api.Project; import org.gradle.api.artifacts.ModuleVersionIdentifier; import org.gradle.api.artifacts.ResolvedArtifact; @@ -58,6 +59,7 @@ import net.fabricmc.loom.configuration.InstallerData; import net.fabricmc.loom.configuration.ide.idea.IdeaSyncTask; import net.fabricmc.loom.configuration.ide.idea.IdeaUtils; import net.fabricmc.loom.configuration.providers.BundleMetadata; +import net.fabricmc.loom.configuration.providers.minecraft.library.LibraryContext; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.gradle.SourceSetReference; @@ -135,6 +137,12 @@ public class RunConfig { public static RunConfig runConfig(Project project, RunConfigSettings settings) { LoomGradleExtension extension = LoomGradleExtension.get(project); + LibraryContext context = new LibraryContext(extension.getMinecraftProvider().getVersionInfo(), JavaVersion.current()); + + if (settings.getEnvironment().equals("client") && context.usesLWJGL3()) { + settings.startFirstThread(); + } + String name = settings.getName(); String configName = settings.getConfigName(); diff --git a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java index 73ea94cb..6cf05fbd 100644 --- a/src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java +++ b/src/main/java/net/fabricmc/loom/configuration/ide/RunConfigSettings.java @@ -321,7 +321,6 @@ public class RunConfigSettings implements Named { * Configure run config with the default client options. */ public void client() { - startFirstThread(); environment("client"); defaultMainClass(Constants.Knot.KNOT_CLIENT); diff --git a/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java index 1fc25bbf..dca2b9f7 100644 --- a/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java +++ b/src/main/java/net/fabricmc/loom/task/AbstractRunTask.java @@ -40,6 +40,7 @@ import org.gradle.api.Project; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.file.FileCollection; import org.gradle.api.provider.Property; +import org.gradle.api.provider.Provider; import org.gradle.api.services.ServiceReference; import org.gradle.api.specs.Spec; import org.gradle.api.tasks.JavaExec; @@ -52,7 +53,7 @@ import net.fabricmc.loom.util.gradle.SyncTaskBuildService; public abstract class AbstractRunTask extends JavaExec { private static final CharsetEncoder ASCII_ENCODER = StandardCharsets.US_ASCII.newEncoder(); - private final RunConfig config; + private final Provider config; // We control the classpath, as we use a ArgFile to pass it over the command line: https://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#commandlineargfile private final ConfigurableFileCollection classpath = getProject().getObjects().fileCollection(); @@ -63,13 +64,12 @@ public abstract class AbstractRunTask extends JavaExec { public AbstractRunTask(Function configProvider) { super(); setGroup(Constants.TaskGroup.FABRIC); - this.config = configProvider.apply(getProject()); - setClasspath(config.sourceSet.getRuntimeClasspath().filter(File::exists).filter(new LibraryFilter())); - - args(config.programArgs); - getMainClass().set(config.mainClass); + this.config = getProject().provider(() -> configProvider.apply(getProject())); + classpath.from(config.map(runConfig -> runConfig.sourceSet.getRuntimeClasspath().filter(File::exists).filter(new LibraryFilter()))); + getArgumentProviders().add(() -> config.get().programArgs); + getMainClass().set(config.map(runConfig -> runConfig.mainClass)); getJvmArguments().addAll(getProject().provider(this::getGameJvmArgs)); } @@ -100,8 +100,8 @@ public abstract class AbstractRunTask extends JavaExec { super.setClasspath(classpath); } - setWorkingDir(new File(getProject().getProjectDir(), config.runDir)); - environment(config.environmentVariables); + setWorkingDir(new File(getProject().getProjectDir(), config.get().runDir)); + environment(config.get().environmentVariables); super.exec(); } @@ -133,7 +133,7 @@ public abstract class AbstractRunTask extends JavaExec { } } - args.addAll(config.vmArgs); + args.addAll(config.get().vmArgs); return args; } @@ -204,11 +204,11 @@ public abstract class AbstractRunTask extends JavaExec { @Override public boolean isSatisfiedBy(File element) { if (excludedLibraryPaths == null) { - excludedLibraryPaths = config.getExcludedLibraryPaths(getProject()); + excludedLibraryPaths = config.get().getExcludedLibraryPaths(getProject()); } if (excludedLibraryPaths.contains(element.getAbsolutePath())) { - getProject().getLogger().debug("Excluding library {} from {} run config", element.getName(), config.configName); + getProject().getLogger().debug("Excluding library {} from {} run config", element.getName(), config.get().configName); return false; } diff --git a/src/test/resources/projects/runconfigs/build.gradle b/src/test/resources/projects/runconfigs/build.gradle index c9ce0613..76a3db44 100644 --- a/src/test/resources/projects/runconfigs/build.gradle +++ b/src/test/resources/projects/runconfigs/build.gradle @@ -49,4 +49,8 @@ dependencies { base { archivesName = "fabric-example-mod" +} + +runClient { + // Realise this task to ensure that the runConfig is lazily evaluated } \ No newline at end of file