extern crate cc; use walkdir::WalkDir; use std::env; use std::path::PathBuf; #[cfg(not(feature = "difficulty-test"))] fn find_crypto(_cfg: &mut cc::Build) {} #[cfg(feature = "difficulty-test")] fn find_crypto(cfg: &mut cc::Build) { let target = env::var("TARGET").unwrap(); if target.contains("apple") { let mut path = if let Ok(p) = env::var("PKG_CONFIG_PATH") { p } else { String::new() }; for maybe_entry in WalkDir::new("/usr/local/Cellar") { let e = if let Ok(e) = maybe_entry { e } else { continue; }; if e.path().ends_with("libcrypto.pc") { let dir = e.path().parent().unwrap().to_str().unwrap(); println!("Found libcrypto.pc in {}", dir); if path.len() > 0 { path = format!("{}:{}", path, dir); } else { path = String::from(dir); } } } println!("PKG_CONFIG_PATH={}", path); env::set_var("PKG_CONFIG_PATH", path); } let libcrypto = pkg_config::Config::new().probe("libcrypto").unwrap(); libcrypto.include_paths.iter().for_each(|p| { cfg.include(p); }); println!( "cargo:rustc-flags={}", libcrypto .link_paths .iter() .map(|p| { format!(" -L {}", p.to_str().unwrap()) }) .collect::() ); cfg.file("packetcrypt/src/DifficultyTest.c"); } fn main() { #[cfg(feature = "generate-bindings")] { let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()); bindgen::Builder::default() .header("bindings.h") .clang_args(&["-I", "packetcrypt/include"]) .generate_comments(false) .generate() .expect("Unable to generate bindings") .write_to_file(out_path.join("bindings.rs")) .expect("Couldn't write bindings!"); } let mut cfg = cc::Build::new(); find_crypto(&mut cfg); let dst = PathBuf::from(env::var_os("OUT_DIR").unwrap()); let mut sodium_found = false; let search_path = dst.parent().unwrap().parent().unwrap(); for _ in 0..600 { println!("Looking for libsodium in {}", search_path.to_str().unwrap()); for maybe_entry in WalkDir::new(search_path) { let e = if let Ok(e) = maybe_entry { e } else { continue; }; if e.path().ends_with("sodium.h") { let dir = e.path().parent().unwrap(); cfg.include(dir); println!("Found sodium.h in {}", dir.to_str().unwrap()); sodium_found = true; break; } } if sodium_found { break; } std::thread::sleep(std::time::Duration::from_secs(1)); } if !sodium_found { panic!("Could not find libsodium source code"); } cfg.include("packetcrypt/include") .include("packetcrypt/src") .file("packetcrypt/src/Validate.c") .file("packetcrypt/src/AnnMerkle.c") .file("packetcrypt/src/AnnMiner.c") .file("packetcrypt/src/Announce.c") .file("packetcrypt/src/CryptoCycle.c") .file("packetcrypt/src/Hash.c") .file("packetcrypt/src/PacketCryptProof.c") .file("packetcrypt/src/PcCompress.c") .file("packetcrypt/src/RandGen.c") .file("packetcrypt/src/RandHash_interpreted.c") .file("packetcrypt/src/Time.c") .file("packetcrypt/src/Work.c") .out_dir(dst.join("lib")) .compile("libpacketcrypt.a"); let src = env::current_dir().unwrap().join("packetcrypt"); println!("cargo:root={}", dst.display()); println!("cargo:include={}", dst.join("include").display()); for f in src.join("src").iter() { println!("cargo:rerun-if-changed={}", f.to_string_lossy()); } for f in src.join("include").join("packetcrypt").iter() { println!("cargo:rerun-if-changed={}", f.to_string_lossy()); } }