From 1c8e35227a0b025b2fa42eb2268d9eb43f2c7410 Mon Sep 17 00:00:00 2001 From: Sean Madden Date: Sat, 26 Oct 2024 14:12:53 -0400 Subject: [PATCH] feat(buildrs): add linux sysinfo --- libraries/build-rs/src/cargo.rs | 89 ++++++++++++++++++++++++++++++--- 1 file changed, 81 insertions(+), 8 deletions(-) diff --git a/libraries/build-rs/src/cargo.rs b/libraries/build-rs/src/cargo.rs index 111fd4e1..b0809277 100644 --- a/libraries/build-rs/src/cargo.rs +++ b/libraries/build-rs/src/cargo.rs @@ -47,10 +47,11 @@ pub static RUSTC_ENV_VARIABLES: [&str; 10] = [ "DEBUG", ]; -pub static BUILD_HOST_VARIABLES: [&str; 6] = [ +pub static BUILD_HOST_VARIABLES: [&str; 7] = [ "RUSTC_VERSION", "CARGO_VERSION", "BUILD_HOST_HOSTNAME", + "BUILD_HOST_KERNELVER", "BUILD_HOST_OSNAME", "BUILD_HOST_OSVER", "BUILD_TIME", @@ -60,17 +61,20 @@ static COMMANDS: &[(&str, &[&str])] = &[ ("RUSTC_VERSION", &["rustc", "--version"]), ("CARGO_VERSION", &["cargo", "--version"]), ]; - +fn run_command(cmd: &[&str]) -> Result { + let output = std::process::Command::new(cmd[0]) + .args(&cmd[1..]) + .output()?; + let res = String::from_utf8_lossy(&output.stdout); + let res = res.trim(); + Ok(res.to_string()) +} pub fn load_buildhost_variables(env: &mut BuildEnvironment) -> Result<(), Error> { for (var, cmd) in COMMANDS { - let output = std::process::Command::new(cmd[0]) - .args(&cmd[1..]) - .output()?; - let res = String::from_utf8_lossy(&output.stdout); - let res = res.trim(); + let res = run_command(cmd)?; env.variables.insert( var.to_string(), - BuildVariable::new_str(var, res, VariableSource::BuildHost), + BuildVariable::new_str(var, &res, VariableSource::BuildHost), ); } @@ -80,10 +84,14 @@ pub fn load_buildhost_variables(env: &mut BuildEnvironment) -> Result<(), Error> BuildVariable::new_str("BUILD_TIME", &build_time, VariableSource::BuildHost), ); + #[cfg(target_os = "windows")] load_windows_sysinfo(env)?; + #[cfg(target_os = "linux")] + load_linux_sysinfo(env)?; Ok(()) } +#[cfg(target_os = "windows")] pub fn load_windows_sysinfo(env: &mut BuildEnvironment) -> Result<(), Error> { static SYSINFO_VARS: &[(&str, &str)] = &[ ("BUILD_HOST_HOSTNAME", "Host Name"), @@ -120,3 +128,68 @@ pub fn load_windows_sysinfo(env: &mut BuildEnvironment) -> Result<(), Error> { Ok(()) } +#[cfg(target_os = "linux")] +pub fn load_linux_sysinfo(env: &mut BuildEnvironment) -> Result<(), Error> { + let kernel_ver = run_command(&["uname", "-r"])?; + env.variables.insert( + "BUILD_HOST_KERNELVER".to_string(), + BuildVariable::new_str( + "BUILD_HOST_HOSTNAME", + &kernel_ver, + VariableSource::BuildHost, + ), + ); + let hostname = run_command(&["uname", "-n"])?; + env.variables.insert( + "BUILD_HOST_HOSTNAME".to_string(), + BuildVariable::new_str("BUILD_HOST_HOSTNAME", &hostname, VariableSource::BuildHost), + ); + let mut found_prettyname = false; + let reader = BufReader::new( + std::fs::OpenOptions::new() + .read(true) + .open("/etc/os-release")?, + ); + for line in reader.lines() { + let line = line?; + let Some((key, val)) = line.split_once('=') else { + continue; + }; + let val = val.replace('"', ""); + let key = key.trim(); + let mut name = None; + let mut version = None; + match key { + "PRETTY_NAME" => { + found_prettyname = true; + let var = + BuildVariable::new_str("BUILD_HOST_OSNAME", &val, VariableSource::BuildHost); + env.variables.insert("BUILD_HOST_OSNAME".to_string(), var); + } + "NAME" => { + name = Some(val.to_string()); + } + "VERSION" => { + version = Some(val.to_string()); + } + _ => continue, + } + if let Some(version) = version { + let var = + BuildVariable::new_str("BUILD_HOST_OSVER", &version, VariableSource::BuildHost); + env.variables.insert("BUILD_HOST_OSVER".to_string(), var); + if !found_prettyname { + if let Some(name) = name { + let osname = format!("{name} {version}"); + let var = BuildVariable::new_str( + "BUILD_HOST_OSNAME", + &osname, + VariableSource::BuildHost, + ); + env.variables.insert("BUILD_HOST_OSNAME".to_string(), var); + } + } + } + } + Ok(()) +}