use heck::ToShoutySnakeCase;
use std::fs;
use std::path::PathBuf;
pub fn in_build_script() -> bool {
std::env::var_os("OUT_DIR").is_some()
}
pub fn cargo_rerun_if(suffix: &str) {
if in_build_script() {
println!("cargo::rerun-if-{}", suffix);
}
}
pub fn cargo_warning(msg: &str) {
if in_build_script() {
println!("cargo::warning={}", msg);
} else {
eprintln!("warning: {}", msg);
}
}
pub fn out_dir() -> PathBuf {
let out_dir = std::env::var("OUT_DIR").expect("OUT_DIR not set - must be run from build.rs");
PathBuf::from(out_dir)
}
pub fn target_dir() -> PathBuf {
if let Ok(target_dir) = std::env::var("CARGO_TARGET_DIR") {
return PathBuf::from(target_dir);
}
let out_dir = out_dir();
out_dir
.ancestors()
.nth(4)
.expect(
"ver-shim-build: could not find target dir from OUT_DIR. \
Set CARGO_TARGET_DIR in .cargo/config.toml:\n\n\
[env]\n\
CARGO_TARGET_DIR = { value = \"target\", relative = true }",
)
.to_path_buf()
}
pub fn target_profile_dir() -> PathBuf {
let out_dir = out_dir();
out_dir
.ancestors()
.nth(3)
.expect("ver-shim-build: could not find target dir from OUT_DIR")
.to_path_buf()
}
pub fn find_artifact_binary(dep_name: &str, bin_name: &str) -> PathBuf {
let dep_upper = dep_name.to_shouty_snake_case();
let file_env_var_original = format!("CARGO_BIN_FILE_{}_{}", dep_upper, bin_name);
if let Ok(path) = std::env::var(&file_env_var_original) {
let path = PathBuf::from(path);
if path.exists() {
return path;
}
panic!(
"ver-shim-build: {} is set to '{}' but file does not exist",
file_env_var_original,
path.display()
);
}
let file_env_var_default = format!("CARGO_BIN_FILE_{}", dep_upper);
if let Ok(path) = std::env::var(&file_env_var_default) {
let path = PathBuf::from(path);
if path.exists() {
return path;
}
panic!(
"ver-shim-build: {} is set to '{}' but file does not exist",
file_env_var_default,
path.display()
);
}
let dir_env_var = format!("CARGO_BIN_DIR_{}", dep_upper);
if let Ok(dir) = std::env::var(&dir_env_var) {
let dir_path = PathBuf::from(&dir);
if let Ok(entries) = fs::read_dir(&dir_path) {
for entry in entries.flatten() {
let file_name = entry.file_name();
let file_name_str = file_name.to_string_lossy();
let bin_name_underscore = bin_name.replace('-', "_");
if file_name_str.starts_with(&bin_name_underscore) {
return entry.path();
}
}
}
panic!(
"ver-shim-build: {} is set to '{}' but no binary matching '{}' found in that directory",
dir_env_var, dir, bin_name
);
}
panic!(
"ver-shim-build: could not find artifact binary for dep='{}', bin='{}'\n\
Expected one of:\n\
- {} (not set)\n\
- {} (not set)\n\
- {} (not set)\n\
\n\
Make sure you have an artifact dependency in Cargo.toml:\n\
[build-dependencies]\n\
{} = {{ path = \"...\", artifact = \"bin\" }}",
dep_name, bin_name, file_env_var_original, file_env_var_default, dir_env_var, dep_name
);
}