use std::{ env::{current_dir, var}, error::Error, fs::{copy, create_dir_all, read_dir}, path::PathBuf, }; use cc::Build; fn compile_liblz4() -> Result<(), Box> { let mut compiler = Build::new(); compiler .define("XXH_NAMESPACE", "LZ4_") .file("liblz4/lib/lz4.c") .file("liblz4/lib/lz4frame.c") .file("liblz4/lib/lz4hc.c") .file("liblz4/lib/xxhash.c") .opt_level(3); let target = var("TARGET")?; if target == "i686-pc-windows-gnu" { compiler.flag("-fno-tree-vectorize"); } compiler.compile("liblz4.a"); let src_dir = current_dir()?.join("liblz4").join("lib"); let out_dir = PathBuf::from(var("OUT_DIR")?); let inc_dir = out_dir.join("include"); create_dir_all(&inc_dir)?; for entry in read_dir(&src_dir)? { let entry = entry?; let file_name = entry.file_name(); let file_name = file_name.to_string_lossy(); if file_name.ends_with(".h") { copy(&entry.path(), &inc_dir.join(entry.file_name()))?; } } println!("cargo:root={}", out_dir.display()); Ok(()) } fn main() { compile_liblz4().expect("error compiling liblz4"); }