solana-program-library/token/cli/build.rs

80 lines
2.7 KiB
Rust

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() {
let is_debug = env::var("DEBUG").map(|v| v == "true").unwrap_or(false);
let build_dependent_programs = env::var("BUILD_DEPENDENT_PROGRAMS")
.map(|v| v != "false" && v != "0")
.unwrap_or(false);
if is_debug && build_dependent_programs {
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");
}