You've already forked pages
forked from didirus/AstralRinth
* chore: inherit dependencies from workspace, optimize some deps out * Update bitflags from 2.9.0 to 2.9.1 * Fix temp directory leak in check_java_at_filepath * Fix build * Fix lint * chore(app-lib): refactor overkill `futures` executor usage to Tokio MPSC * chore: fix Clippy lint * tweak: optimize out dependency on OpenSSL source build Contrary to what I expected before, this was caused due to the Tauri updater plugin using a different TLS stack than everything else. * chore(labrinth): drop now unused dependency * Update zip because 2.6.1 got yanked * Downgrade weezl to 0.1.8 * Mention that p256 is also a blocker for rand 0.9 * chore: sidestep GitHub review requirements * chore: sidestep GitHub review requirements (2) * chore: sidestep GitHub review requirements (3) --------- Co-authored-by: Josiah Glosson <soujournme@gmail.com>
119 lines
3.6 KiB
Rust
119 lines
3.6 KiB
Rust
//! Platform-related code
|
|
use daedalus::minecraft::{Os, OsRule};
|
|
|
|
// OS detection
|
|
pub trait OsExt {
|
|
/// Get the OS of the current system
|
|
fn native() -> Self;
|
|
|
|
/// Gets the OS + Arch of the current system
|
|
fn native_arch(java_arch: &str) -> Self;
|
|
|
|
/// Gets the OS from an OS + Arch
|
|
fn get_os(&self) -> Self;
|
|
}
|
|
|
|
impl OsExt for Os {
|
|
fn native() -> Self {
|
|
match std::env::consts::OS {
|
|
"windows" => Self::Windows,
|
|
"macos" => Self::Osx,
|
|
"linux" => Self::Linux,
|
|
_ => Self::Unknown,
|
|
}
|
|
}
|
|
|
|
fn native_arch(java_arch: &str) -> Self {
|
|
if std::env::consts::OS == "windows" {
|
|
if java_arch == "aarch64" {
|
|
Os::WindowsArm64
|
|
} else {
|
|
Os::Windows
|
|
}
|
|
} else if std::env::consts::OS == "linux" {
|
|
if java_arch == "aarch64" {
|
|
Os::LinuxArm64
|
|
} else if java_arch == "arm" {
|
|
Os::LinuxArm32
|
|
} else {
|
|
Os::Linux
|
|
}
|
|
} else if std::env::consts::OS == "macos" {
|
|
if java_arch == "aarch64" {
|
|
Os::OsxArm64
|
|
} else {
|
|
Os::Osx
|
|
}
|
|
} else {
|
|
Os::Unknown
|
|
}
|
|
}
|
|
|
|
fn get_os(&self) -> Self {
|
|
match self {
|
|
Os::OsxArm64 => Os::Osx,
|
|
Os::LinuxArm32 => Os::Linux,
|
|
Os::LinuxArm64 => Os::Linux,
|
|
Os::WindowsArm64 => Os::Windows,
|
|
_ => self.clone(),
|
|
}
|
|
}
|
|
}
|
|
|
|
// Bit width
|
|
#[cfg(target_pointer_width = "64")]
|
|
pub const ARCH_WIDTH: &str = "64";
|
|
|
|
#[cfg(target_pointer_width = "32")]
|
|
pub const ARCH_WIDTH: &str = "32";
|
|
|
|
// Platform rule handling
|
|
pub fn os_rule(
|
|
rule: &OsRule,
|
|
java_arch: &str,
|
|
// Minecraft updated over 1.18.2 (supports MacOS Natively)
|
|
minecraft_updated: bool,
|
|
) -> bool {
|
|
let mut rule_match = true;
|
|
|
|
if let Some(ref arch) = rule.arch {
|
|
rule_match &= !matches!(arch.as_str(), "x86" | "arm");
|
|
}
|
|
|
|
if let Some(name) = &rule.name {
|
|
if minecraft_updated
|
|
&& (name != &Os::LinuxArm64 || name != &Os::LinuxArm32)
|
|
{
|
|
rule_match &= Os::native() == name.get_os()
|
|
|| &Os::native_arch(java_arch) == name;
|
|
} else {
|
|
rule_match &= &Os::native_arch(java_arch) == name;
|
|
}
|
|
}
|
|
|
|
// `rule.version` is ignored because it's not usually seen on real recent
|
|
// Minecraft version manifests, its alleged regex syntax is undefined and is
|
|
// likely to not match `Regex`'s, and the way to get the value to match it
|
|
// against is allegedly calling `System.getProperty("os.version")`, which
|
|
// on Windows the OpenJDK implements by fetching the kernel32.dll version,
|
|
// an approach that no public Rust library implements. Moreover, launchers
|
|
// such as PrismLauncher also ignore this field. Code references:
|
|
// - https://github.com/openjdk/jdk/blob/948ade8e7003a41683600428c8e3155c7ed798db/src/java.base/windows/native/libjava/java_props_md.c#L556
|
|
// - https://github.com/PrismLauncher/PrismLauncher/blob/1c20faccf88999474af70db098a4c10e7a03af33/launcher/minecraft/Rule.h#L77
|
|
// - https://github.com/FillZpp/sys-info-rs/blob/60ecf1470a5b7c90242f429934a3bacb6023ec4d/c/windows.c#L23-L38
|
|
|
|
rule_match
|
|
}
|
|
|
|
pub fn classpath_separator(java_arch: &str) -> &'static str {
|
|
match Os::native_arch(java_arch) {
|
|
Os::Osx
|
|
| Os::OsxArm64
|
|
| Os::Linux
|
|
| Os::LinuxArm32
|
|
| Os::LinuxArm64
|
|
| Os::Unknown => ":",
|
|
Os::Windows | Os::WindowsArm64 => ";",
|
|
}
|
|
}
|