Skip to content

Commit 23baa0a

Browse files
committed
Expose extra libraries option on run configs.
1 parent aa37e15 commit 23baa0a

6 files changed

Lines changed: 97 additions & 6 deletions

File tree

src/main/java/net/minecraftforge/gradle/SlimeLauncherOptionsNested.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,16 @@
1212
import org.gradle.api.Action;
1313
import org.gradle.api.Named;
1414
import org.gradle.api.NamedDomainObjectContainer;
15+
import org.gradle.api.file.ConfigurableFileCollection;
1516
import org.gradle.api.file.DirectoryProperty;
17+
import org.gradle.api.file.FileCollection;
1618
import org.gradle.api.provider.ListProperty;
1719
import org.gradle.api.provider.MapProperty;
1820
import org.gradle.api.provider.Property;
1921
import org.gradle.api.provider.Provider;
22+
import org.gradle.api.tasks.Classpath;
2023
import org.gradle.api.tasks.Input;
24+
import org.gradle.api.tasks.InputFiles;
2125
import org.gradle.api.tasks.Internal;
2226
import org.gradle.api.tasks.Nested;
2327
import org.gradle.api.tasks.Optional;
@@ -243,6 +247,67 @@ default void mods(Action<? super NamedDomainObjectContainer<? extends ModConfig>
243247
this.mods(Closures.action(this, action));
244248
}
245249

250+
/// Extra libraries to pass in to the 'minecraft classpath', which is used on older versions that manually build the Minecraft class loader.
251+
///
252+
/// This classpath will be in addition to Minecraft, and its transitive dependencies.
253+
///
254+
/// @return Additional libraries to use
255+
@InputFiles @Classpath @Optional ConfigurableFileCollection getExtraLibraries();
256+
257+
/// Adds to the extra libraries to use.
258+
///
259+
/// @param libraries The libraries to include with the existing libraries
260+
/// @apiNote Unlike [#setExtraLibraries(Object...)], this method does not replace the existing libraries.
261+
/// @see #getExtraLibraries()
262+
default void extraLibraries(Object... libraries) {
263+
this.getExtraLibraries().from(libraries);
264+
}
265+
266+
/// Adds to the extra libraries to use.
267+
///
268+
/// @param libraries The libraries to include with the existing libraries
269+
/// @apiNote Unlike [#setExtraLibraries(Object...)], this method does not replace the existing libraries.
270+
/// @see #getExtraLibraries()
271+
default void extraLibraries(Iterable<?> libraries) {
272+
this.getExtraLibraries().from(libraries);
273+
}
274+
275+
/// Adds to the extra libraries to use.
276+
///
277+
/// @param libraries The libraries to include with the existing libraries
278+
/// @apiNote Unlike [#setExtraLibraries(Object...)], this method does not replace the existing libraries.
279+
/// @see #getExtraLibraries()
280+
default void extraLibraries(FileCollection libraries) {
281+
this.getExtraLibraries().from(libraries);
282+
}
283+
284+
/// Sets the extra libraries to use.
285+
///
286+
/// @param libraries The libraries
287+
/// @apiNote This method will replace the existing libraries. To add to it, use [#extraLibraries(Object...)].
288+
/// @see #getExtraLibraries()
289+
default void setExtraLibraries(Object... libraries) {
290+
this.getExtraLibraries().setFrom(libraries);
291+
}
292+
293+
/// Sets the libraries to use.
294+
///
295+
/// @param libraries The libraries
296+
/// @apiNote This method will replace the existing libraries. To add to it, use [#extraLibraries(Iterable)].
297+
/// @see #getExtraLibraries()
298+
default void setExtraLibraries(Iterable<?> libraries) {
299+
this.getExtraLibraries().setFrom(libraries);
300+
}
301+
302+
/// Sets the libraries to use.
303+
///
304+
/// @param libraries The libraries
305+
/// @apiNote This method will replace the existing libraries. To add to it, use [#extraLibraries(FileCollection)].
306+
/// @see #getExtraLibraries()
307+
default void setExtraLibraries(FileCollection libraries) {
308+
this.getExtraLibraries().setFrom(libraries);
309+
}
310+
246311
/// Represents a legacy mod configuration for older versions of Forge.
247312
///
248313
/// @see #getMods()

src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherEclipseConfiguration.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ static TaskProvider<SlimeLauncherEclipseConfiguration> register(Project project,
136136
task.getSourceSetName().set(sourceSet.getName());
137137

138138
task.getCacheDir().set(task.getObjects().directoryProperty().value(task.globalCaches().dir("slime-launcher/cache/%s".formatted(mcdep.getPath())).map(task.problems.ensureFileLocation())));
139-
task.getLocalCacheDir().set(task.getObjects().directoryProperty().value(task.localCaches().dir("slime-launcher/cache/%s".formatted(mcdep.getPath())).map(task.problems.ensureFileLocation())));
139+
task.getLocalCacheDir().set(task.getObjects().directoryProperty().value(task.localCaches().dir("slime-launcher/cache/%s".formatted(task.getName())).map(task.problems.ensureFileLocation())));
140140
task.getMetadata().setFrom(metadata.map(SlimeLauncherMetadata::getMetadata));
141141
task.getRunsJson().set(metadata.flatMap(SlimeLauncherMetadata::getRunsJson));
142142

src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherExec.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ static TaskProvider<SlimeLauncherExec> register(Project project, SourceSet sourc
6060
SlimeLauncherRunHelper.configure(task, mcdep, runtimeClasspath);
6161

6262
task.getCacheDir().set(task.getObjectFactory().directoryProperty().value(task.globalCaches().dir("slime-launcher/cache/%s".formatted(mcdep.getPath())).map(task.problems.ensureFileLocation())));
63-
task.getLocalCacheDir().set(task.getObjectFactory().directoryProperty().value(task.localCaches().dir("slime-launcher/cache/%s".formatted(mcdep.getPath())).map(task.problems.ensureFileLocation())));
63+
task.getLocalCacheDir().set(task.getObjectFactory().directoryProperty().value(task.localCaches().dir("slime-launcher/cache/%s".formatted(task.getName())).map(task.problems.ensureFileLocation())));
6464
task.getMetadata().setFrom(metadata.map(SlimeLauncherMetadata::getMetadata));
6565
task.getRunsJson().set(metadata.flatMap(SlimeLauncherMetadata::getRunsJson));
6666

@@ -80,6 +80,7 @@ static TaskProvider<SlimeLauncherExec> register(Project project, SourceSet sourc
8080
public abstract @Internal @Override DirectoryProperty getLocalCacheDir();
8181
public abstract @InputFiles @Override ConfigurableFileCollection getMetadata();
8282
public abstract @InputFiles @Override ConfigurableFileCollection getMinecraftClasspath();
83+
8384
public abstract @InputFiles @Override ConfigurableFileCollection getRuntimeClasspath();
8485
public abstract @InputFiles @Override ConfigurableFileCollection getPatcherModules();
8586
public abstract @Input @Override Property<String> getMinecraftVersion();

src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherOptionsImpl.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ public abstract class SlimeLauncherOptionsImpl implements SlimeLauncherOptionsIn
4040
private final Property<Boolean> inheritJvmArgs = this.getObjects().property(Boolean.class);
4141
private final ListProperty<String> jvmArgs = this.getObjects().listProperty(String.class);
4242
private final ConfigurableFileCollection classpath = this.getObjects().fileCollection();
43+
private final ConfigurableFileCollection extraLibraries = this.getObjects().fileCollection();
4344
private final Property<String> minHeapSize = this.getObjects().property(String.class);
4445
private final Property<String> maxHeapSize = this.getObjects().property(String.class);
4546
private final MapProperty<String, String> systemProperties = this.getObjects().mapProperty(String.class, String.class);
@@ -98,6 +99,11 @@ public ConfigurableFileCollection getClasspath() {
9899
return this.classpath;
99100
}
100101

102+
@Override
103+
public ConfigurableFileCollection getExtraLibraries() {
104+
return this.extraLibraries;
105+
}
106+
101107
@Override
102108
public Property<String> getMinHeapSize() {
103109
return this.minHeapSize;
@@ -143,6 +149,7 @@ public NamedDomainObjectContainer<ModConfigImpl> getMods() {
143149
@Override
144150
public void with(String sourceSetName, Action<? super SlimeLauncherOptionsNested> action) {
145151
var child = getObjects().newInstance(SlimeLauncherOptionsImpl.class, this.name);
152+
child.getExtraLibraries().setFrom(this.getExtraLibraries());
146153
action.execute(child);
147154
this.getNested().put(sourceSetName, child);
148155
}
@@ -311,6 +318,10 @@ public SlimeLauncherOptionsInternal inherit(Map<String, RunConfig> configs, Stri
311318
if (child != null) {
312319
LOGGER.log(level, "Inheriting from Child");
313320
target.inherit(child);
321+
if (!child.getExtraLibraries().isEmpty())
322+
target.setExtraLibraries(child.getExtraLibraries());
323+
} else {
324+
target.setExtraLibraries(this.getExtraLibraries());
314325
}
315326
return target;
316327
}

src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherRunHelper.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package net.minecraftforge.gradle.internal;
66

7+
import net.minecraftforge.gradle.SlimeLauncherOptions;
78
import org.gradle.api.file.FileCollection;
89
import org.gradle.api.plugins.JavaPluginExtension;
910
import org.gradle.api.tasks.SourceSet;
@@ -32,14 +33,14 @@ static Map<String, Supplier<String>> buildTokens(SlimeLauncherRunTask task, Slim
3233
ret.put("natives", () -> "{natives}");
3334

3435
ret.put("mcp_mappings", task.getMappingChannel().zip(task.getMappingVersion(), (c, v) -> c + '_' + v)::get);
35-
var minecraft = getClasspath(task.getMinecraftClasspath());
36+
var minecraft = getClasspath(task.getMinecraftClasspath(), options.getExtraLibraries());
3637
var runtime = getClasspath(task.getRuntimeClasspath());
3738
var modules = getClasspath(task.getPatcherModules());
3839
ret.put("minecraft_classpath", getClasspath(minecraft));
3940
ret.put("runtime_classpath", getClasspath(runtime));
4041
ret.put("modules", getClasspath(modules));
4142
ret.put("minecraft_classpath_file", getClasspathFile(task, "minecraft", minecraft));
42-
ret.put("runtime_classpath_file", getClasspathFile(task, "runtime_" + task.getSourceSetName().get(), runtime));
43+
ret.put("runtime_classpath_file", getClasspathFile(task, "runtime", runtime));
4344
ret.put("mc_version", task.getMinecraftVersion()::get);
4445
ret.put("mcp_version", task.getMCPVersion()::get);
4546
ret.put("source_roots", getSourceRoots(task, options, defaultSourceSets, sourceOutputs));
@@ -58,6 +59,16 @@ private static Supplier<List<String>> getClasspath(FileCollection files) {
5859
return ret;
5960
});
6061
}
62+
private static Supplier<List<String>> getClasspath(FileCollection... collections) {
63+
return new Lazy<>(() -> {
64+
var set = new LinkedHashSet<String>();
65+
for (var files : collections) {
66+
for (var file: files.getFiles())
67+
set.add(file.getAbsolutePath());
68+
}
69+
return new ArrayList<>(set);
70+
});
71+
}
6172

6273
private static Supplier<String> getClasspath(Supplier<List<String>> files) {
6374
return new Lazy<>(() -> String.join(File.pathSeparator, files.get()));
@@ -67,6 +78,7 @@ private static Supplier<String> getClasspathFile(SlimeLauncherRunTask task, Stri
6778
var file = task.getLocalCacheDir().file(name + "_classpath.txt").get().getAsFile();
6879
return new Lazy<>(() -> {
6980
try {
81+
Files.createDirectories(file.toPath().getParent());
7082
Files.writeString(file.toPath(), String.join(System.lineSeparator(), files.get()), StandardCharsets.UTF_8);
7183
} catch (IOException e) {
7284
throw new RuntimeException("Error when writing classpath file: " + file.getAbsolutePath(), e);

src/main/java/net/minecraftforge/gradle/internal/SlimeLauncherRunTask.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import org.gradle.api.file.DirectoryProperty;
1010
import org.gradle.api.file.RegularFileProperty;
1111
import org.gradle.api.provider.Property;
12+
import org.gradle.api.tasks.Classpath;
1213
import org.gradle.api.tasks.Input;
1314
import org.gradle.api.tasks.InputFile;
1415
import org.gradle.api.tasks.InputFiles;
@@ -19,8 +20,9 @@ public interface SlimeLauncherRunTask extends Task {
1920
@Input Property<String> getSourceSetName();
2021
@Internal DirectoryProperty getLocalCacheDir();
2122
@InputFiles ConfigurableFileCollection getMetadata();
22-
@InputFiles ConfigurableFileCollection getMinecraftClasspath();
23-
@InputFiles ConfigurableFileCollection getRuntimeClasspath();
23+
@InputFiles @Classpath ConfigurableFileCollection getMinecraftClasspath();
24+
@InputFiles @Classpath @Optional ConfigurableFileCollection getExtraLibraries();
25+
@InputFiles @Classpath ConfigurableFileCollection getRuntimeClasspath();
2426
@InputFiles ConfigurableFileCollection getPatcherModules();
2527
@Input Property<String> getMinecraftVersion();
2628
@Input Property<String> getMCPVersion();

0 commit comments

Comments
 (0)