mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'build.rs')
| -rw-r--r-- | build.rs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..b740e86 --- /dev/null +++ b/build.rs @@ -0,0 +1,63 @@ +use std::fs::File; +use std::io::prelude::*; +use std::io::{Seek, Write}; +use std::iter::Iterator; +use std::path::Path; +use walkdir::{DirEntry, WalkDir}; +use zip::result::ZipError; +use zip::write::FileOptions; + +fn zip_dir<T>( + it: &mut dyn Iterator<Item = DirEntry>, + prefix: &str, + writer: T, + method: zip::CompressionMethod, +) -> zip::result::ZipResult<()> +where + T: Write + Seek, +{ + let mut zip = zip::ZipWriter::new(writer); + let options = FileOptions::default() + .compression_method(method) + .unix_permissions(0o755); + + let mut buffer = Vec::new(); + for entry in it { + let path = entry.path(); + let name = path.strip_prefix(Path::new(prefix)).unwrap(); + + // Write file or directory explicitly + // Some unzip tools unzip files with directory paths correctly, some do not! + if path.is_file() { + println!("adding file {path:?} as {name:?} ..."); + #[allow(deprecated)] + zip.start_file_from_path(name, options)?; + let mut f = File::open(path)?; + + f.read_to_end(&mut buffer)?; + zip.write_all(&buffer)?; + buffer.clear(); + } else if !name.as_os_str().is_empty() { + // Only if not root! Avoids path spec / warning + // and mapname conversion failed error on unzip + println!("adding dir {path:?} as {name:?} ..."); + #[allow(deprecated)] + zip.add_directory_from_path(name, options)?; + } + } + zip.finish()?; + Result::Ok(()) +} + +fn main() -> Result<(), ZipError> { + let walkdir = WalkDir::new("assets"); + let it = walkdir.into_iter(); + println!("cargo:rerun-if-changed=assets/"); + println!("cargo:rerun-if-changed=build.rs"); + zip_dir( + &mut it.filter_map(|e| e.ok()), + "assets", + File::create(std::env::var("OUT_DIR").unwrap() + "/asset").unwrap(), + zip::CompressionMethod::Zstd, + ) +} |