支持 FreeBSD x86-64 (#2656)

close #2652
This commit is contained in:
Glavo
2024-01-18 20:13:47 +08:00
committed by GitHub
parent 3f1be961a6
commit 1a1f2133f7
17 changed files with 716 additions and 119 deletions

View File

@@ -57,6 +57,7 @@ public final class JavaRepository {
Optional.ofNullable(System.getenv("ProgramFiles(x86)")).orElse("C:\\Program Files (x86)"),
"Minecraft Launcher\\runtime"));
case LINUX:
case FREEBSD:
return Stream.of(FileUtils.tryGetPath(System.getProperty("user.home", ".minecraft/runtime")));
case OSX:
return Stream.of(FileUtils.tryGetPath(System.getProperty("user.home"), "Library/Application Support/minecraft/runtime"));

View File

@@ -64,7 +64,8 @@ public final class OSRestriction {
}
public boolean allow() {
if (name != OperatingSystem.UNKNOWN && name != OperatingSystem.CURRENT_OS)
if (name != OperatingSystem.UNKNOWN && name != OperatingSystem.CURRENT_OS
&& !(name == OperatingSystem.LINUX && OperatingSystem.CURRENT_OS.isLinuxOrBSD()))
return false;
if (version != null)

View File

@@ -70,14 +70,14 @@ public class DefaultLauncher extends Launcher {
case HIGH:
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) {
// res.add("cmd", "/C", "start", "unused title", "/B", "/high");
} else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX || OperatingSystem.CURRENT_OS == OperatingSystem.OSX) {
} else if (OperatingSystem.CURRENT_OS.isLinuxOrBSD() || OperatingSystem.CURRENT_OS == OperatingSystem.OSX) {
res.add("nice", "-n", "-5");
}
break;
case ABOVE_NORMAL:
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) {
// res.add("cmd", "/C", "start", "unused title", "/B", "/abovenormal");
} else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX || OperatingSystem.CURRENT_OS == OperatingSystem.OSX) {
} else if (OperatingSystem.CURRENT_OS.isLinuxOrBSD() || OperatingSystem.CURRENT_OS == OperatingSystem.OSX) {
res.add("nice", "-n", "-1");
}
break;
@@ -87,14 +87,14 @@ public class DefaultLauncher extends Launcher {
case BELOW_NORMAL:
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) {
// res.add("cmd", "/C", "start", "unused title", "/B", "/belownormal");
} else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX || OperatingSystem.CURRENT_OS == OperatingSystem.OSX) {
} else if (OperatingSystem.CURRENT_OS.isLinuxOrBSD() || OperatingSystem.CURRENT_OS == OperatingSystem.OSX) {
res.add("nice", "-n", "1");
}
break;
case LOW:
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) {
// res.add("cmd", "/C", "start", "unused title", "/B", "/low");
} else if (OperatingSystem.CURRENT_OS == OperatingSystem.LINUX || OperatingSystem.CURRENT_OS == OperatingSystem.OSX) {
} else if (OperatingSystem.CURRENT_OS.isLinuxOrBSD() || OperatingSystem.CURRENT_OS == OperatingSystem.OSX) {
res.add("nice", "-n", "5");
}
break;

View File

@@ -72,7 +72,7 @@ final class ExitWaiter implements Runnable {
} else if (exitCode != 0 || StringUtils.containsOne(errorLines, "Unable to launch")) {
EventBus.EVENT_BUS.fireEvent(new ProcessExitedAbnormallyEvent(this, process));
if (exitCode == 137 && OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) {
if (exitCode == 137 && OperatingSystem.CURRENT_OS.isLinuxOrBSD()) {
exitType = ProcessListener.ExitType.SIGKILL;
} else {
exitType = ProcessListener.ExitType.APPLICATION_ERROR;

View File

@@ -326,6 +326,7 @@ public final class JavaVersion {
break;
case LINUX:
case FREEBSD:
javaExecutables.add(listDirectory(Paths.get("/usr/java")).map(JavaVersion::getExecutable)); // Oracle RPMs
javaExecutables.add(listDirectory(Paths.get("/usr/lib/jvm")).map(JavaVersion::getExecutable)); // General locations
javaExecutables.add(listDirectory(Paths.get("/usr/lib32/jvm")).map(JavaVersion::getExecutable)); // General locations

View File

@@ -100,7 +100,7 @@ public class ManagedProcess {
// However, this method is supplied since Java 9.
// So, there is no ways to get the pid.
throw new UnsupportedOperationException("Cannot get the pid of a Process on Java 8 on Windows.");
} else if (OperatingSystem.CURRENT_OS == OperatingSystem.OSX || OperatingSystem.CURRENT_OS == OperatingSystem.LINUX) {
} else if (OperatingSystem.CURRENT_OS == OperatingSystem.OSX || OperatingSystem.CURRENT_OS.isLinuxOrBSD()) {
// On Linux or Mac, we can get field UnixProcess.pid field to get the pid.
// All the Java version is accepted.
// See https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/solaris/classes/java/lang/UNIXProcess.java.linux

View File

@@ -51,6 +51,10 @@ public enum OperatingSystem {
* Mac OS X.
*/
OSX("osx"),
/**
* FreeBSD.
*/
FREEBSD("freebsd"),
/**
* Unknown operating system.
*/
@@ -66,6 +70,10 @@ public enum OperatingSystem {
return checkedName;
}
public boolean isLinuxOrBSD() {
return this == LINUX || this == FREEBSD;
}
/**
* The current operating system.
*/
@@ -213,6 +221,8 @@ public enum OperatingSystem {
return OSX;
else if (name.contains("solaris") || name.contains("linux") || name.contains("unix") || name.contains("sunos"))
return LINUX;
else if (name.equals("freebsd"))
return FREEBSD;
else
return UNKNOWN;
}
@@ -273,6 +283,7 @@ public enum OperatingSystem {
String home = System.getProperty("user.home", ".");
switch (OperatingSystem.CURRENT_OS) {
case LINUX:
case FREEBSD:
return Paths.get(home, "." + folder).toAbsolutePath();
case WINDOWS:
String appdata = System.getenv("APPDATA");