mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'build.rs')
-rw-r--r--build.rs63
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,
+ )
+}