extern crate walkdir; use { std::{env, path::Path, process::Command}, walkdir::WalkDir, }; fn rerun_if_changed(directory: &Path) { let src = directory.join("src"); let files_in_src: Vec<_> = WalkDir::new(src) .into_iter() .map(|entry| entry.unwrap()) .filter(|entry| { if !entry.file_type().is_file() { return false; } true }) .map(|f| f.path().to_str().unwrap().to_owned()) .collect(); for file in files_in_src { if !Path::new(&file).is_file() { panic!("{} is not a file", file); } println!("cargo:rerun-if-changed={}", file); } let toml = directory.join("Cargo.toml").to_str().unwrap().to_owned(); println!("cargo:rerun-if-changed={}", toml); } fn build_bpf(program_directory: &Path) { let toml_file = program_directory.join("Cargo.toml"); let toml_file = format!("{}", toml_file.display()); let args = vec!["build-bpf", "--manifest-path", &toml_file]; let output = Command::new("cargo") .args(&args) .output() .expect("Error running cargo build-bpf"); if let Ok(output_str) = std::str::from_utf8(&output.stdout) { let subs = output_str.split('\n'); for sub in subs { println!("cargo:warning=(not a warning) {}", sub); } } } fn main() { if let Ok(debug) = env::var("DEBUG") { if debug == "true" { let cwd = env::current_dir().expect("Unable to get current working directory"); let spl_token_2022_dir = cwd .parent() .expect("Unable to get parent directory of current working dir") .join("program-2022"); rerun_if_changed(&spl_token_2022_dir); let spl_token_dir = cwd .parent() .expect("Unable to get parent directory of current working dir") .join("program"); rerun_if_changed(&spl_token_dir); let spl_associated_token_account_dir = cwd .parent() .expect("Unable to get parent directory of current working dir") .parent() .expect("Unable to get parent directory of current working dir") .join("associated-token-account") .join("program"); rerun_if_changed(&spl_associated_token_account_dir); build_bpf(&spl_token_dir); build_bpf(&spl_token_2022_dir); build_bpf(&spl_associated_token_account_dir); } } println!("cargo:rerun-if-changed=build.rs"); }