use {
std::env,
std::path::{Path, PathBuf},
};
fn build_with_artifacts_in_dir(path: &Path) {
println!("using pre-built artifacts from {}", path.display());
let cargo_metadata_path = path.join("cargo_metadata.txt");
let metadata = std::fs::read_to_string(&cargo_metadata_path)
.unwrap_or_else(|_| panic!("failed to read {}", cargo_metadata_path.display()));
println!("{}", metadata);
}
fn build_with_pyoxidizer_exe(exe: Option<String>, resolve_target: Option<&str>) {
let pyoxidizer_exe = if let Some(path) = exe {
path
} else {
"pyoxidizer".to_string()
};
let mut args = vec!["run-build-script", "build.rs"];
if let Some(target) = resolve_target {
args.push("--target");
args.push(target);
}
match std::process::Command::new(pyoxidizer_exe)
.args(args)
.status()
{
Ok(status) => {
if !status.success() {
panic!("`pyoxidizer run-build-script` failed");
}
}
Err(e) => panic!("`pyoxidizer run-build-script` failed: {}", e.to_string()),
}
}
fn main() {
let mut library_mode = "pyembed";
if env::var("CARGO_FEATURE_BUILD_MODE_STANDALONE").is_ok() {
} else if env::var("CARGO_FEATURE_BUILD_MODE_PYOXIDIZER_EXE").is_ok() {
let target = if let Ok(target) = env::var("PYOXIDIZER_BUILD_TARGET") {
Some(target)
} else {
None
};
build_with_pyoxidizer_exe(
env::var("PYOXIDIZER_EXE").ok(),
if let Some(target) = &target {
Some(target.as_ref())
} else {
None
},
);
} else if env::var("CARGO_FEATURE_BUILD_MODE_PREBUILT_ARTIFACTS").is_ok() {
let artifact_dir_env = env::var("PYOXIDIZER_ARTIFACT_DIR");
let artifact_dir_path = match artifact_dir_env {
Ok(ref v) => PathBuf::from(v),
Err(_) => {
let out_dir = env::var("OUT_DIR").unwrap();
PathBuf::from(&out_dir)
}
};
println!("cargo:rerun-if-env-changed=PYOXIDIZER_ARTIFACT_DIR");
build_with_artifacts_in_dir(&artifact_dir_path);
} else if env::var("CARGO_FEATURE_BUILD_MODE_EXTENSION_MODULE").is_ok() {
library_mode = "extension";
} else if env::var("CARGO_FEATURE_BUILD_MODE_TEST").is_ok() {
println!(
"cargo:rustc-env=PYEMBED_TESTS_DIR={}/src/test",
env::var("CARGO_MANIFEST_DIR").unwrap()
);
} else {
panic!("build-mode-* feature not set");
}
println!("cargo:rustc-cfg=library_mode=\"{}\"", library_mode);
}