fn main() { #[cfg(feature = "std")] compile_rpo_falcon(); #[cfg(all(target_feature = "sve", feature = "sve"))] compile_arch_arm64_sve(); } #[cfg(feature = "std")] fn compile_rpo_falcon() { use std::path::PathBuf; const RPO_FALCON_PATH: &str = "src/dsa/rpo_falcon512/falcon_c"; println!("cargo:rerun-if-changed={RPO_FALCON_PATH}/falcon.h"); println!("cargo:rerun-if-changed={RPO_FALCON_PATH}/falcon.c"); println!("cargo:rerun-if-changed={RPO_FALCON_PATH}/rpo.h"); println!("cargo:rerun-if-changed={RPO_FALCON_PATH}/rpo.c"); let target_dir: PathBuf = ["PQClean", "crypto_sign", "falcon-512", "clean"].iter().collect(); let common_dir: PathBuf = ["PQClean", "common"].iter().collect(); let scheme_files = glob::glob(target_dir.join("*.c").to_str().unwrap()).unwrap(); let common_files = glob::glob(common_dir.join("*.c").to_str().unwrap()).unwrap(); cc::Build::new() .include(&common_dir) .include(target_dir) .files(scheme_files.into_iter().map(|p| p.unwrap().to_string_lossy().into_owned())) .files(common_files.into_iter().map(|p| p.unwrap().to_string_lossy().into_owned())) .file(format!("{RPO_FALCON_PATH}/falcon.c")) .file(format!("{RPO_FALCON_PATH}/rpo.c")) .flag("-O3") .compile("rpo_falcon512"); } #[cfg(all(target_feature = "sve", feature = "sve"))] fn compile_arch_arm64_sve() { const RPO_SVE_PATH: &str = "arch/arm64-sve/rpo"; println!("cargo:rerun-if-changed={RPO_SVE_PATH}/library.c"); println!("cargo:rerun-if-changed={RPO_SVE_PATH}/library.h"); println!("cargo:rerun-if-changed={RPO_SVE_PATH}/rpo_hash.h"); cc::Build::new() .file(format!("{RPO_SVE_PATH}/library.c")) .flag("-march=armv8-a+sve") .flag("-O3") .compile("rpo_sve"); }