diff --git a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java index d03cfda3..a08e8262 100644 --- a/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java +++ b/src/main/java/net/fabricmc/loom/configuration/CompileConfiguration.java @@ -72,7 +72,6 @@ public final class CompileConfiguration { configuration.extendsFrom(serverDeps.get()); configuration.setTransitive(false); }); - extension.createLazyConfiguration(Constants.Configurations.MINECRAFT_NATIVES, configuration -> configuration.setTransitive(false)); extension.createLazyConfiguration(Constants.Configurations.LOADER_DEPENDENCIES, configuration -> configuration.setTransitive(false)); extension.createLazyConfiguration(Constants.Configurations.MINECRAFT, configuration -> configuration.setTransitive(false)); extension.createLazyConfiguration(Constants.Configurations.INCLUDE, configuration -> configuration.setTransitive(false)); // Dont get transitive deps diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java index 260ec81f..b82ca2dc 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftLibraryProvider.java @@ -29,10 +29,13 @@ import java.util.regex.Pattern; import org.gradle.api.Project; import org.gradle.api.artifacts.ExternalModuleDependency; +import org.gradle.api.tasks.TaskContainer; +import org.gradle.api.tasks.TaskProvider; import net.fabricmc.loom.LoomGradleExtension; import net.fabricmc.loom.LoomRepositoryPlugin; import net.fabricmc.loom.configuration.providers.BundleMetadata; +import net.fabricmc.loom.task.ExtractNativesTask; import net.fabricmc.loom.util.Constants; import net.fabricmc.loom.util.OperatingSystem; @@ -53,6 +56,18 @@ public class MinecraftLibraryProvider { project.getLogger().warn("Loom is upgrading Minecraft's LWJGL version to {}", LWJGLVersionOverride.LWJGL_VERSION); } + if (versionInfo.hasNativesToExtract()) { + final TaskContainer tasks = project.getTasks(); + + extension.createLazyConfiguration(Constants.Configurations.MINECRAFT_NATIVES, configuration -> configuration.setTransitive(false)); + + TaskProvider extractNativesTask = tasks.register("extractNatives", ExtractNativesTask.class, t -> { + t.setDescription("Extracts the minecraft platform specific natives."); + }); + + tasks.named("configureClientLaunch", configureClientLaunch -> configureClientLaunch.dependsOn(extractNativesTask)); + } + for (MinecraftVersionMeta.Library library : versionInfo.libraries()) { if (overrideLWJGL && library.name().startsWith("org.lwjgl")) { continue; diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftVersionMeta.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftVersionMeta.java index 26612d49..6e38296f 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftVersionMeta.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/MinecraftVersionMeta.java @@ -56,6 +56,10 @@ public record MinecraftVersionMeta( return this.releaseTime().compareTo(releaseTime) >= 0; } + public boolean hasNativesToExtract() { + return libraries.stream().anyMatch(Library::hasNatives); + } + public record AssetIndex(String id, long totalSize, String path, String sha1, long size, String url) { public String fabricId(String version) { return id.equals(version) ? version : version + "-" + id; @@ -64,17 +68,20 @@ public record MinecraftVersionMeta( public record Library(Downloads downloads, String name, Map natives, List rules, Object extract) { public boolean isValidForOS() { - if (rules == null || rules.isEmpty()) { + if (rules == null) { + // No rules allow everything. return true; } - for (Rule rule : rules) { - if (rule.appliesToOS() && !rule.isAllowed()) { - return false; + boolean valid = false; + + for (Rule rule : this.rules) { + if (rule.appliesToOS()) { + valid = rule.isAllowed(); } } - return true; + return valid; } public boolean hasNatives() { diff --git a/src/main/java/net/fabricmc/loom/task/LoomTasks.java b/src/main/java/net/fabricmc/loom/task/LoomTasks.java index 78163b24..7ec675af 100644 --- a/src/main/java/net/fabricmc/loom/task/LoomTasks.java +++ b/src/main/java/net/fabricmc/loom/task/LoomTasks.java @@ -54,9 +54,6 @@ public final class LoomTasks { RemapTaskConfiguration.setupRemap(project); - tasks.register("extractNatives", ExtractNativesTask.class, t -> { - t.setDescription("Extracts the minecraft platform specific natives."); - }); tasks.register("downloadAssets", DownloadAssetsTask.class, t -> { t.setDescription("Downloads required assets for Fabric."); }); @@ -80,7 +77,6 @@ public final class LoomTasks { }); tasks.register("configureClientLaunch", task -> { - task.dependsOn(tasks.named("extractNatives")); task.dependsOn(tasks.named("downloadAssets")); task.dependsOn(tasks.named("configureLaunch")); diff --git a/src/main/java/net/fabricmc/loom/task/launch/GenerateDLIConfigTask.java b/src/main/java/net/fabricmc/loom/task/launch/GenerateDLIConfigTask.java index 3e078131..49a6b1c1 100644 --- a/src/main/java/net/fabricmc/loom/task/launch/GenerateDLIConfigTask.java +++ b/src/main/java/net/fabricmc/loom/task/launch/GenerateDLIConfigTask.java @@ -47,8 +47,6 @@ import net.fabricmc.loom.util.gradle.SourceSetHelper; public abstract class GenerateDLIConfigTask extends AbstractLoomTask { @TaskAction public void run() throws IOException { - final String nativesPath = getExtension().getFiles().getNativesDirectory(getProject()).getAbsolutePath(); - final MinecraftVersionMeta versionInfo = getExtension().getMinecraftProvider().getVersionInfo(); File assetsDirectory = new File(getExtension().getFiles().getUserCache(), "assets"); @@ -62,14 +60,19 @@ public abstract class GenerateDLIConfigTask extends AbstractLoomTask { .property("log4j.configurationFile", getAllLog4JConfigFiles()) .property("log4j2.formatMsgNoLookups", "true") - .property("client", "java.library.path", nativesPath) - .property("client", "org.lwjgl.librarypath", nativesPath) - .argument("client", "--assetIndex") .argument("client", getExtension().getMinecraftProvider().getVersionInfo().assetIndex().fabricId(getExtension().getMinecraftProvider().minecraftVersion())) .argument("client", "--assetsDir") .argument("client", assetsDirectory.getAbsolutePath()); + if (versionInfo.hasNativesToExtract()) { + String nativesPath = getExtension().getFiles().getNativesDirectory(getProject()).getAbsolutePath(); + + launchConfig + .property("client", "java.library.path", nativesPath) + .property("client", "org.lwjgl.librarypath", nativesPath); + } + if (getExtension().areEnvironmentSourceSetsSplit()) { launchConfig.property("client", "fabric.gameJarPath.client", getGameJarPath("client")); launchConfig.property("fabric.gameJarPath", getGameJarPath("common")); diff --git a/src/main/java/net/fabricmc/loom/util/Constants.java b/src/main/java/net/fabricmc/loom/util/Constants.java index c6417c90..87c977e5 100644 --- a/src/main/java/net/fabricmc/loom/util/Constants.java +++ b/src/main/java/net/fabricmc/loom/util/Constants.java @@ -69,6 +69,9 @@ public class Constants { public static final String MINECRAFT_SERVER_DEPENDENCIES = "minecraftServerLibraries"; public static final String MINECRAFT_DEPENDENCIES = "minecraftLibraries"; public static final String MINECRAFT_RUNTIME_DEPENDENCIES = "minecraftRuntimeOnlyLibraries"; + /** + * Not used on Minecraft 1.19-pre1 or later. Natives are all loaded from the classpath. + */ public static final String MINECRAFT_NATIVES = "minecraftNatives"; public static final String MAPPINGS = "mappings"; public static final String MAPPINGS_FINAL = "mappingsFinal"; diff --git a/src/test/groovy/net/fabricmc/loom/test/integration/NativesTest.groovy b/src/test/groovy/net/fabricmc/loom/test/integration/NativesTest.groovy index 76d5c438..a4e81f68 100644 --- a/src/test/groovy/net/fabricmc/loom/test/integration/NativesTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/integration/NativesTest.groovy @@ -83,4 +83,34 @@ class NativesTest extends Specification implements GradleProjectTestTrait { where: version << STANDARD_TEST_VERSIONS } + + @RestoreSystemProperties + @Unroll + def "1.19 classpath natives (gradle #version)"() { + setup: + def gradle = gradleProject(project: "minimalBase", version: version) + + gradle.buildGradle << ''' + loom { + noIntermediateMappings() + } + + dependencies { + minecraft "com.mojang:minecraft:1.19-pre1" + mappings loom.layered() { + // No names + } + } + ''' + + when: + // Run the task twice to ensure its up to date + def result = gradle.run(task: "build") + + then: + result.task(":build").outcome == SUCCESS + + where: + version << STANDARD_TEST_VERSIONS + } }