80 lines
3.0 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

fn main() {
// Skip pkg-config check if just generating documentation.
if std::env::var_os("DOCS_RS").is_some() {
return;
}
let lib_name = "libpulse";
let fallback_name = {
#[cfg(target_os = "linux")]
{ "pulse::libpulse.so.0" }
#[cfg(target_os = "macos")]
{ "pulse::libpulse.0.dylib" }
#[cfg(windows)]
{ "pulse::libpulse-0.dll" }
#[cfg(not(any(target_os = "linux", target_os = "macos", windows)))]
{ "pulse" }
};
let min_version = {
#[cfg(feature = "pa_v15")]
{ "15.0" }
#[cfg(all(feature = "pa_v14", not(feature = "pa_v15")))]
{ "14.0" }
#[cfg(all(feature = "pa_v13", not(feature = "pa_v14")))]
{ "13.0" }
#[cfg(all(feature = "pa_v12", not(feature = "pa_v13")))]
{ "12.0" }
#[cfg(all(feature = "pa_v8", not(feature = "pa_v12")))]
{ "8.0" }
#[cfg(all(feature = "pa_v6", not(feature = "pa_v8")))]
{ "6.0" }
#[cfg(not(feature = "pa_v6"))]
{ "5.0" }
};
let mut config = pkg_config::Config::new();
// Has the user got pkg-config and the PA pkg-config file installed (via dev package)?
// This is a little crude, since impossible to reliably distinguish between pkg-config errors
// (it only gives strings, and they could be translated). We perform a non-version specific
// check here, and disable generation of cargo meta data, thus doing a 'exists' type check.
config.cargo_metadata(false);
let fallback = match config.probe(lib_name) {
// We assume all failure here (being a non-version specific check) indicates no *.pc file
Err(pkg_config::Error::ProbeFailure { .. }) |
Err(pkg_config::Error::Failure { .. }) => {
println!("cargo:warning=Pkg-config seems to not know about PulseAudio (dev package not installed?), \
trying generic fallback...");
true
},
// Also allow fallback if pkg-config not installed, or disabled
Err(pkg_config::Error::EnvNoPkgConfig(_)) |
Err(pkg_config::Error::Command { .. }) => {
println!("cargo:warning=No pkg-config or disabled, trying generic fallback...");
true
},
// In all other cases we will perform a version-specfic check and honor the result
_ => false,
};
// If the user does not have pkg-config or the PA *.pc file (they have not installed the dev
// package), then lets try a default fallback (having to install dev packages for Rust
// development is unnatural imo, ideally distros should start shipping *.pc files differently).
if fallback {
println!("cargo:rustc-link-lib={}", fallback_name);
return;
}
config.cargo_metadata(true)
.atleast_version(min_version);
// Do version specific pkg-config check and honor result
match config.probe(lib_name) {
Err(e) => {
println!("cargo:warning={}", e);
std::process::exit(1);
},
Ok(_) => {},
}
}