Skip to content

Commit c87a39f

Browse files
committed
probe_or_exit for cleaner Cargo error output
1 parent e0c0daa commit c87a39f

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

src/lib.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,15 @@ pub fn find_library(name: &str) -> Result<Library, String> {
488488
probe_library(name).map_err(|e| e.to_string())
489489
}
490490

491+
/// Simple shortcut for using all default options for finding a library,
492+
/// and exiting the build script with a verbose error message on failure.
493+
///
494+
/// This is preferred over `probe_library().unwrap()`, because it can
495+
/// print a more readable output.
496+
pub fn probe_library_or_exit(name: &str) -> Library {
497+
Config::new().probe_or_exit(name)
498+
}
499+
491500
/// Simple shortcut for using all default options for finding a library.
492501
pub fn probe_library(name: &str) -> Result<Library, Error> {
493502
Config::new().probe(name)
@@ -530,6 +539,21 @@ impl Config {
530539
}
531540
}
532541

542+
/// Clone the Config, with output buffering enabled
543+
fn with_metadata_buffer(&self) -> Config {
544+
Config {
545+
statik: self.statik,
546+
min_version: self.min_version.clone(),
547+
max_version: self.max_version.clone(),
548+
extra_args: self.extra_args.clone(),
549+
print_system_cflags: self.print_system_cflags,
550+
print_system_libs: self.print_system_libs,
551+
cargo_metadata: self.cargo_metadata,
552+
env_metadata: self.env_metadata,
553+
metadata_buffer: Some(Mutex::default()),
554+
}
555+
}
556+
533557
/// Emit buffered metadata, if any
534558
fn print_bufferred(&self) {
535559
if let Some(mut buf) = self.metadata_buffer.as_ref().and_then(|m| m.lock().ok()) {
@@ -627,6 +651,34 @@ impl Config {
627651
self.probe(name).map_err(|e| e.to_string())
628652
}
629653

654+
/// Run `pkg-config` to find the library `name`, or exit the
655+
/// build script with a verbose error.
656+
///
657+
/// This is preferred over `probe().unwrap()`, because it can
658+
/// print a more readable error.
659+
///
660+
/// This will use all configuration previously set to specify how
661+
/// `pkg-config` is run.
662+
pub fn probe_or_exit(&self, name: &str) -> Library {
663+
let buffered = self.with_metadata_buffer();
664+
match buffered.probe(name) {
665+
Ok(lib) => {
666+
buffered.print_bufferred();
667+
lib
668+
}
669+
Err(err) => {
670+
println!(
671+
"cargo:warning={}",
672+
err.error_message().replace("\n", "\ncargo:warning=")
673+
);
674+
eprintln!("{}", err);
675+
676+
// The same error code as a panic, but it won't print an irrelevant backtrace
677+
std::process::exit(101);
678+
}
679+
}
680+
}
681+
630682
/// Run `pkg-config` to find the library `name`.
631683
///
632684
/// This will use all configuration previously set to specify how

0 commit comments

Comments
 (0)