use std::env;
use pyo3_build_config::pyo3_build_script_impl::{
cargo_env_var, env_var, errors::Result, print_feature_cfgs,
};
use pyo3_build_config::{InterpreterConfig, add_libpython_rpath_link_args, bail};
fn ensure_auto_initialize_ok(interpreter_config: &InterpreterConfig) -> Result<()> {
if cargo_env_var("CARGO_FEATURE_AUTO_INITIALIZE").is_some() && !interpreter_config.shared() {
bail!(
"The `auto-initialize` feature is enabled, but your python installation only supports \
embedding the Python interpreter statically. If you are attempting to run tests, or a \
binary which is okay to link dynamically, install a Python distribution which ships \
with the Python shared library.\n\
\n\
Embedding the Python interpreter statically does not yet have first-class support in \
PyO3. If you are sure you intend to do this, disable the `auto-initialize` feature.\n\
\n\
For more information, see \
https://pyo3.rs/v{pyo3_version}/\
building-and-distribution.html#embedding-python-in-rust",
pyo3_version = env::var("CARGO_PKG_VERSION").unwrap()
);
}
Ok(())
}
fn configure_pyo3() -> Result<()> {
let interpreter_config = pyo3_build_config::get();
ensure_auto_initialize_ok(interpreter_config)?;
for cfg in interpreter_config.build_script_outputs() {
println!("{cfg}")
}
print_feature_cfgs();
interpreter_config.to_cargo_dep_env()?;
add_libpython_rpath_link_args();
Ok(())
}
fn configure_wip_no_std() {
println!("cargo:rustc-check-cfg=cfg(wip_feature_std)");
match env_var("PYO3_WIP_NO_STD").map(|s| s.into_string().unwrap()) {
Some(no_std) if no_std.trim() == "1" || no_std.trim().eq_ignore_ascii_case("true") => (),
_ => println!("cargo:rustc-cfg=wip_feature_std"),
}
}
fn main() {
configure_wip_no_std();
pyo3_build_config::print_expected_cfgs();
if let Err(e) = configure_pyo3() {
eprintln!("error: {}", e.report());
std::process::exit(1)
}
}