From 743ba4de66a8c35fc87265b11ca6cb688187a12b Mon Sep 17 00:00:00 2001 From: modmuss50 Date: Thu, 20 Apr 2023 22:42:44 +0100 Subject: [PATCH] Support 23w16a & Windows ARM64, and fix regression when adding ARM support on older versions. (#870) * Support 23w16a & Windows ARM64, and fix regression when adding ARM support on older versions. * Fix build --- .../minecraft/library/LibraryContext.java | 11 ++++++++-- .../ArmNativesLibraryProcessor.java | 20 ++++++++++++------- .../LWJGL3UpgradeLibraryProcessor.java | 2 +- .../LoomNativeSupportLibraryProcessor.java | 2 +- .../ObjcBridgeUpgradeLibraryProcessor.java | 2 +- .../unit/library/LibraryContextTest.groovy | 19 +++++++++++++++++- .../ArmNativesLibraryProcessorTest.groovy | 1 + 7 files changed, 44 insertions(+), 13 deletions(-) diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/LibraryContext.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/LibraryContext.java index 0b80189a..b344383e 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/LibraryContext.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/LibraryContext.java @@ -29,6 +29,7 @@ import java.util.Arrays; import org.gradle.api.JavaVersion; import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionMeta; +import net.fabricmc.loom.util.Platform; public final class LibraryContext { private final MinecraftVersionMeta versionMeta; @@ -42,9 +43,15 @@ public final class LibraryContext { /** * @return True when the Minecraft libraries support ARM64 MacOS */ - public boolean supportsArm64MacOS() { + public boolean supportsArm64(Platform.OperatingSystem operatingSystem) { + final String osName = switch (operatingSystem) { + case MAC_OS -> "macos"; + case WINDOWS -> "windows"; + case LINUX -> "linux"; + }; + return versionMeta.libraries().stream() - .anyMatch(library -> library.name().startsWith("org.lwjgl:lwjgl:3") && library.name().endsWith(":natives-macos-arm64")); + .anyMatch(library -> library.name().startsWith("org.lwjgl:lwjgl:3") && library.name().endsWith(":natives-%s-arm64".formatted(osName))); } /** diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/ArmNativesLibraryProcessor.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/ArmNativesLibraryProcessor.java index 7763c7cb..584e4a80 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/ArmNativesLibraryProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/ArmNativesLibraryProcessor.java @@ -57,13 +57,13 @@ public class ArmNativesLibraryProcessor extends LibraryProcessor { return ApplicationResult.DONT_APPLY; } - if (platform.getOperatingSystem().isMacOS()) { - if (context.supportsArm64MacOS()) { - // This version already supports arm64 macOS, nothing to do. - return ApplicationResult.DONT_APPLY; - } + if (context.supportsArm64(platform.getOperatingSystem())) { + // This version already supports arm64, nothing to do. + return ApplicationResult.DONT_APPLY; + } - // Must upgrade natives to support macos ARM + if (platform.getOperatingSystem().isMacOS()) { + // Must upgrade natives to support macos ARM, even if not using classpath natives. return ApplicationResult.MUST_APPLY; } @@ -78,8 +78,14 @@ public class ArmNativesLibraryProcessor extends LibraryProcessor { @Override public Predicate apply(Consumer dependencyConsumer) { + final String osName = switch (platform.getOperatingSystem()) { + case MAC_OS -> "macos"; + case WINDOWS -> "windows"; + case LINUX -> "linux"; + }; + return library -> { - if (library.is(LWJGL_GROUP) && library.target() == Library.Target.NATIVES && (library.classifier() != null && library.classifier().startsWith("natives-"))) { + if (library.is(LWJGL_GROUP) && library.target() == Library.Target.NATIVES && (library.classifier() != null && library.classifier().equals("natives-" + osName))) { // Add the arm64 natives. dependencyConsumer.accept(library.withClassifier(library.classifier() + "-arm64")); diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/LWJGL3UpgradeLibraryProcessor.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/LWJGL3UpgradeLibraryProcessor.java index d238fd6c..ae53ff0a 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/LWJGL3UpgradeLibraryProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/LWJGL3UpgradeLibraryProcessor.java @@ -85,6 +85,6 @@ public class LWJGL3UpgradeLibraryProcessor extends LibraryProcessor { // Add support for macOS private boolean upgradeMacOSArm() { - return platform.getOperatingSystem().isMacOS() && platform.getArchitecture().isArm() && !context.supportsArm64MacOS() && !context.hasClasspathNatives(); + return platform.getOperatingSystem().isMacOS() && platform.getArchitecture().isArm() && !context.supportsArm64(Platform.OperatingSystem.MAC_OS) && !context.hasClasspathNatives(); } } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/LoomNativeSupportLibraryProcessor.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/LoomNativeSupportLibraryProcessor.java index 7c195024..89f85f82 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/LoomNativeSupportLibraryProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/LoomNativeSupportLibraryProcessor.java @@ -45,7 +45,7 @@ public class LoomNativeSupportLibraryProcessor extends LibraryProcessor { return ApplicationResult.DONT_APPLY; } - if (platform.getOperatingSystem().isMacOS() && platform.getArchitecture().isArm() && !context.supportsArm64MacOS()) { + if (platform.getOperatingSystem().isMacOS() && platform.getArchitecture().isArm() && !context.supportsArm64(Platform.OperatingSystem.MAC_OS)) { // Add the loom native support mod when adding ARM64 macOS support return ApplicationResult.MUST_APPLY; } diff --git a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/ObjcBridgeUpgradeLibraryProcessor.java b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/ObjcBridgeUpgradeLibraryProcessor.java index 0d55a887..ed4f3633 100644 --- a/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/ObjcBridgeUpgradeLibraryProcessor.java +++ b/src/main/java/net/fabricmc/loom/configuration/providers/minecraft/library/processors/ObjcBridgeUpgradeLibraryProcessor.java @@ -54,7 +54,7 @@ public class ObjcBridgeUpgradeLibraryProcessor extends LibraryProcessor { } // Apply when Arm64 macOS is unsupported by Minecraft - return context.supportsArm64MacOS() ? ApplicationResult.DONT_APPLY : ApplicationResult.MUST_APPLY; + return context.supportsArm64(Platform.OperatingSystem.MAC_OS) ? ApplicationResult.DONT_APPLY : ApplicationResult.MUST_APPLY; } @Override diff --git a/src/test/groovy/net/fabricmc/loom/test/unit/library/LibraryContextTest.groovy b/src/test/groovy/net/fabricmc/loom/test/unit/library/LibraryContextTest.groovy index 458ac837..871d318d 100644 --- a/src/test/groovy/net/fabricmc/loom/test/unit/library/LibraryContextTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/unit/library/LibraryContextTest.groovy @@ -30,6 +30,7 @@ import spock.lang.Specification import net.fabricmc.loom.configuration.providers.minecraft.MinecraftVersionMeta import net.fabricmc.loom.configuration.providers.minecraft.library.LibraryContext import net.fabricmc.loom.test.util.MinecraftTestUtils +import net.fabricmc.loom.util.Platform class LibraryContextTest extends Specification { def "Supports ARM64 macOS"() { @@ -37,7 +38,7 @@ class LibraryContextTest extends Specification { def context = new LibraryContext(MinecraftTestUtils.getVersionMeta(id), JavaVersion.VERSION_17) then: - context.supportsArm64MacOS() == supported + context.supportsArm64(Platform.OperatingSystem.MAC_OS) == supported where: id || supported @@ -47,6 +48,22 @@ class LibraryContextTest extends Specification { "1.4.7" || false } + def "Supports ARM64 windows"() { + when: + def context = new LibraryContext(MinecraftTestUtils.getVersionMeta(id), JavaVersion.VERSION_17) + + then: + context.supportsArm64(Platform.OperatingSystem.WINDOWS) == supported + + where: + id || supported + "23w16a" || true + "1.19.4" || false + "1.18.2" || false + "1.16.5" || false + "1.4.7" || false + } + def "Uses LWJGL 3"() { when: def context = new LibraryContext(MinecraftTestUtils.getVersionMeta(id), JavaVersion.VERSION_17) diff --git a/src/test/groovy/net/fabricmc/loom/test/unit/library/processors/ArmNativesLibraryProcessorTest.groovy b/src/test/groovy/net/fabricmc/loom/test/unit/library/processors/ArmNativesLibraryProcessorTest.groovy index d1897064..7a7af5c9 100644 --- a/src/test/groovy/net/fabricmc/loom/test/unit/library/processors/ArmNativesLibraryProcessorTest.groovy +++ b/src/test/groovy/net/fabricmc/loom/test/unit/library/processors/ArmNativesLibraryProcessorTest.groovy @@ -57,6 +57,7 @@ class ArmNativesLibraryProcessorTest extends LibraryProcessorTest { where: id || result + "23w16a" || LibraryProcessor.ApplicationResult.DONT_APPLY // Supports ARM64 Windows "1.19.4" || LibraryProcessor.ApplicationResult.MUST_APPLY "1.18.2" || LibraryProcessor.ApplicationResult.DONT_APPLY // Only support versions with classpath natives. "1.12.2" || LibraryProcessor.ApplicationResult.DONT_APPLY // Not LWJGL 3