#[cfg(feature = "bundled")]
extern crate jq_src;
#[cfg(feature = "pkg-config")]
extern crate pkg_config;
#[cfg(feature = "bundled")]
fn build_bundled() {
jq_src::build().expect("autotools build").print_cargo_metadata();
}
#[cfg(not(feature = "bundled"))]
fn build_bundled() {}
mod non_bundled {
use std::env;
#[cfg(feature = "pkg-config")]
pub fn configured_by_pkg_config(lib_cfg: &LibConfig) -> bool {
let got_jq = pkg_config::probe_library("libjq");
if !lib_cfg.no_onig {
let got_onig = pkg_config::probe_library("libonig");
got_jq.is_ok() && got_onig.is_ok()
} else {
got_jq.is_ok()
}
}
#[cfg(not(feature = "pkg-config"))]
pub fn configured_by_pkg_config(_lib_cfg: &LibConfig) -> bool {
false
}
#[derive(Debug)]
pub struct LibConfig {
pub jq_lib_dir: Option<String>,
pub jq_lib_static: bool,
pub no_onig: bool,
pub onig_lib_dir: Option<String>,
pub onig_lib_static: bool,
}
impl LibConfig {
pub fn from_env() -> Self {
let jq_lib_dir = env::var("JQ_LIB_DIR").ok();
let jq_lib_static = env::var("JQ_LIB_STATIC")
.ok()
.map(|s| !s.trim().is_empty())
.unwrap_or(false);
let onig_lib_dir = env::var("ONIG_LIB_DIR").ok();
let onig_lib_static = env::var("ONIG_LIB_STATIC")
.ok()
.map(|s| !s.trim().is_empty())
.unwrap_or(jq_lib_static);
LibConfig {
jq_lib_dir,
jq_lib_static,
onig_lib_dir,
onig_lib_static,
no_onig: env::var("JQ_NO_ONIG")
.ok()
.map(|s| !s.trim().is_empty())
.unwrap_or(false),
}
}
pub fn print_link_info(&self) {
println!(
"cargo:rustc-link-search=native={}",
&self.jq_lib_dir.as_ref().expect("JQ_LIB_DIR")
);
let statik = if self.jq_lib_static { "static=" } else { "" };
println!("cargo:rustc-link-lib={}{}", statik, "jq");
if !self.no_onig {
if let Some(onig_dir) = self.onig_lib_dir.as_ref() {
println!("cargo:rustc-link-search=native={}", onig_dir);
}
let statik = if self.onig_lib_static { "static=" } else { "" };
println!("cargo:rustc-link-lib={}{}", statik, "onig");
}
}
}
}
fn main() {
if cfg!(feature = "bundled") {
return build_bundled();
} else {
let lib_cfg = LibConfig::from_env();
use non_bundled::{configured_by_pkg_config, LibConfig};
if lib_cfg.jq_lib_dir.is_some() {
lib_cfg.print_link_info();
} else if configured_by_pkg_config(&lib_cfg) {
return; } else {
panic!(
"Unable to find libjq. \
Try setting `JQ_LIB_DIR` to specify the location of the lib."
);
}
}
}