use std::path::{Path, PathBuf};
use std::process::Command;
use super::ResourceSet;
use crate::meta::Project;
pub fn qresource_path(project: &Project) -> PathBuf {
project.root.join("build/day/qt/app.rcc")
}
fn find_rcc() -> Option<PathBuf> {
let names: &[&str] = if cfg!(windows) {
&["rcc.exe", "rcc"]
} else {
&["rcc"]
};
for qmake in ["qmake6", "qmake"] {
for var in ["QT_INSTALL_LIBEXECS", "QT_HOST_BINS"] {
if let Ok(out) = Command::new(qmake).args(["-query", var]).output()
&& out.status.success()
{
let dir = String::from_utf8_lossy(&out.stdout).trim().to_string();
for name in names {
let p = Path::new(&dir).join(name);
if p.exists() {
return Some(p);
}
}
}
}
}
Some(PathBuf::from("rcc"))
}
pub fn stage(project: &Project, set: &ResourceSet) -> Result<(), String> {
if set.is_empty() {
return Ok(());
}
let out = project.root.join("build/day/qt");
std::fs::create_dir_all(&out).map_err(|e| format!("mkdir {}: {e}", out.display()))?;
let mut files = String::new();
for d in &set.data {
files += &format!(
" <file alias=\"assets/{}\">{}</file>\n",
d.name,
d.path.display()
);
}
for img in &set.images {
files += &format!(
" <file alias=\"images/{}\">{}</file>\n",
img.name,
img.path.display()
);
}
let qrc = format!(
"<!DOCTYPE RCC><RCC version=\"1.0\">\n <qresource prefix=\"/day\">\n{files} </qresource>\n</RCC>\n"
);
let manifest = out.join("app.qrc");
std::fs::write(&manifest, qrc).map_err(|e| format!("write {}: {e}", manifest.display()))?;
let rcc = find_rcc().ok_or("could not locate Qt's rcc")?;
let blob = qresource_path(project);
let status = Command::new(&rcc)
.arg("-binary")
.arg("-no-compress")
.arg(&manifest)
.arg("-o")
.arg(&blob)
.status()
.map_err(|e| format!("rcc ({e})"))?;
if !status.success() {
return Err("rcc failed".into());
}
Ok(())
}