extern crate bindgen;
use std::env;
use std::path::Path;
use std::path::PathBuf;
use std::process::Command;
use std::str;
fn find_version(lib: &Path) -> String {
str::from_utf8(
&Command::new("otool")
.arg("-l")
.arg(lib)
.output()
.unwrap()
.stdout,
).ok().and_then(|out|
out.lines()
.skip_while(|s| !(s.contains("LC_VERSION_MIN_MACOSX") || s.contains("LC_BUILD_VERSION")))
.find(|s| s.contains("minos") || s.contains("version"))
.and_then(|s| s.split_ascii_whitespace().last().map(|s| s.to_string()))
).or_else(|| {
str::from_utf8(
&Command::new("sw_vers")
.arg("-productVersion")
.output()
.unwrap()
.stdout,
)
.map(|s| s.to_string())
.ok()
}).unwrap()
}
fn main() {
if cfg!(not(target_vendor = "apple")) {
panic!("The KERN_PROCARGS2 sysctl only exists in xnu kernels, BSD or Linux users should just read /proc/$PID/cmdline which is much easier and faster, Solaris users should use pargs.\nIf you are writing a cross platform program, you can depend on this crate only on macOS by specifying the dependency as:\n[target.'cfg(target_vendor = \"apple\")'.dependencies]\ngetargv = \"{}\"",env!("CARGO_PKG_VERSION"))
}
let lib_env = "LIBGETARGV_LIB_DIR";
let lib_path = env::var(lib_env).unwrap_or_else(|_| "/usr/local/lib".to_string());
let lib_name = "libgetargv.dylib";
let lib = Path::new(&lib_path).join(lib_name);
if !lib.exists() && env::var_os(lib_env).is_some() {
panic!("Couldn't locate {1} in {0}, check version in name.", env::var(lib_env).unwrap(), lib_name);
} else if !lib.exists() {
panic!("Couldn't locate {1}, try setting the {0} env var to the path to the directory in which {1} is located.", lib_env, lib_name);
}
println!("cargo:rustc-link-search={}", Path::new(&lib_path).canonicalize().expect("cannot canonicalize path").display());
println!("cargo:rustc-link-lib=getargv");
println!("cargo:rerun-if-env-changed={}", lib_env);
let header = "wrapper.h";
println!("cargo:rerun-if-changed={}", header);
let key = "LLVM_CONFIG_PATH";
env::set_var(
key,
env::var(key).unwrap_or_else(|_| "/usr/local/opt/llvm/bin/llvm-config".to_string()),
);
let key = "MACOSX_DEPLOYMENT_TARGET";
let version = env::var(key).unwrap_or_else(|_|find_version(&lib));
let version_n = version.parse::<f32>().unwrap();
env::set_var(key, version);
println!("cargo:{}={}", key, version_n);
println!("cargo:PID_MAX={}", if version_n >= 10.6 { 99_999 } else { 30_000 });
let bindings = bindgen::Builder::default()
.header(header)
.parse_callbacks(Box::new(bindgen::CargoCallbacks))
.allowlist_function(".*_of_pid")
.allowlist_type(".*Argv.*")
.no_copy(".*Result")
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}