use std::process::Command; use std::path::Path; use std::ffi::OsStr; use std::fs::File; use std::io::Write; use std::io::prelude::*; fn main() -> std::io::Result<()> { println!("building shaders..."); //shaders path let shaders = Path::new("./src/shaders"); //shader target path let out = Command::new("mkdir") .arg("target/shaders/") .output(); let shader_target = Path::new("./target/shaders/"); //compile all glsl shaders for entry in shaders.read_dir().expect("reading shader directory failed") { if let Ok(entry) = entry { let shader_path = entry.path(); println!("compiling shader: {:?}", shader_path); let shader_path_string: String = "./target/shaders/".to_string() + shader_path.file_name().unwrap().to_str().unwrap() + ".spv"; let shader_file: &OsStr = OsStr::new::(shader_path_string.as_str()); let out = Command::new("glslc") .arg("-c") .arg(shader_path) .arg("-o") .arg(shader_file) .output(); } } //include all compiled shaders in shaders.rs file in src dir let mut txt: String = String::new(); for entry in shader_target.read_dir().expect("reading compiled shader target directory failed") { if let Ok(entry) = entry { let bin_path = entry.path(); let bin_path_string = bin_path.file_name().unwrap().to_str().unwrap().to_string(); txt += &("const ".to_owned() + &bin_path_string.replace(".spv", "").replace(".", "_").to_uppercase() + " = include_bytes!(\"../target/shaders/" + &bin_path_string + "\");\n"); } } let mut file = File::create("./src/shaders.rs")?; file.write_all(txt.as_bytes())?; Ok(()) }