use io::Write; use std::{env, fs, io, path::Path, process::Command}; const XML_HEADER: &str = r#" "#; const XML_FOOTER: &str = r#" "#; fn add_files(xml: &mut String, folder: &str) { for path in fs::read_dir(folder).unwrap() { let path = path.as_ref().unwrap(); if path.path().display().to_string().ends_with('~') { continue; } if path.path().is_file() { xml.push_str(&format!( "\t\t{}\n", path.path() .display() .to_string() .replace("\\", "/") .trim_start_matches("resources/") )); } else if path.path().is_dir() { add_files(xml, &path.path().display().to_string()); } else { panic!("expected file or folder"); } } } fn main() { let out_dir = env::var("OUT_DIR").unwrap(); let mut resources = Path::new(&out_dir).to_path_buf(); resources.push("resources"); fs::create_dir_all(resources.clone()).unwrap(); fs_extra::dir::copy("resources", out_dir, &{ let mut options = fs_extra::dir::CopyOptions::new(); options.copy_inside = true; options.overwrite = true; options }) .unwrap(); let mut xml = String::with_capacity(XML_HEADER.len() + XML_FOOTER.len() + 1024); xml.push_str(XML_HEADER); add_files(&mut xml, "resources"); xml.push_str(XML_FOOTER); let resource_xml = { let mut f = resources.clone(); f.push("resources.xml"); f }; let mut file = fs::File::create(resource_xml).unwrap(); file.write_all(xml.as_bytes()).unwrap(); let mut cmd = Command::new(if let Ok(path) = env::var("GLIB_COMPILE_RESOURCES") { path } else if cfg!(target_os = "window") { "glib-compile-resources.exe".to_owned() } else { "glib-compile-resources".to_owned() }); cmd.arg("resources.xml") .current_dir(resources) .output() .expect("failed to compile resources"); #[cfg(windows)] { let mut res = winres::WindowsResource::new(); res.set_icon("wix/boop-gtk.ico"); res.compile().unwrap(); } }