hyprshell-hyprland-plugin 4.9.5

Plugin for hyprland, used to monitor keypresses
Documentation
use crate::PLUGIN_OUTPUT_PATH;
use anyhow::{Context, bail};
use std::env;
use std::process::{Command, Stdio};
use tempfile::TempDir;
use tracing::{debug_span, info, trace, warn};

pub fn build(dir: &TempDir) -> anyhow::Result<()> {
    let _span = debug_span!("build", path =? dir.path()).entered();
    trace!("PATH: {:?}", env::var_os("PATH"));
    trace!("CPATH: {:?}", env::var_os("CPATH"));
    let mut cmd = Command::new("gcc");
    cmd.current_dir(dir.path())
        .args(["-shared", "-fPIC", "--no-gnu-unique", "-std=c++2c"])
        .arg("-I/usr/include/pixman-1") // fix for arch?
        .arg("-O2")
        .arg("-o")
        .arg(PLUGIN_OUTPUT_PATH);

    cmd.arg("all.cpp");

    trace!("Running build command: {cmd:?}");
    let out = cmd
        .stdout(Stdio::piped())
        .stderr(Stdio::piped())
        .spawn()
        .context("Failed to spawn build process")?;
    let output = out.wait_with_output();
    match output {
        Ok(output) => {
            if output.status.success() {
                Ok(())
            } else {
                info!("Build output (code: {:?})", output.status.code());
                for line in String::from_utf8(output.stderr).unwrap_or_default().lines() {
                    warn!("{line}");
                }
                bail!("Build failed with exit code: {:?}", output.status.code());
            }
        }
        Err(err) => {
            bail!("Error from [{cmd:?}]: {err:?}");
        }
    }
}