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") .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:?}");
}
}
}