pub fn map_sys_crate(crate_name: &str) -> Vec<(&'static str, Option<&'static str>)> {
match crate_name {
"libz-sys" | "libz-ng-sys" => vec![("zlib", None)],
"bzip2-sys" => vec![("bzip2", None)],
"lzma-sys" => vec![("xz", None)],
"libdeflate-sys" => vec![("libdeflate", None)],
"lz4-sys" => vec![("lz4", None)],
"zstd-sys" => vec![("zstd", None)],
"openssl-sys" => vec![("openssl", Some("not osx"))],
"curl-sys" | "libcurl-sys" => vec![("libcurl", None)],
"libsqlite3-sys" => vec![("sqlite", None)],
"gsl-sys" => vec![("gsl", None)],
"blas-sys" | "openblas-sys" => vec![("openblas", None)],
"cblas-sys" => vec![("libcblas", None)],
"lapack-sys" => vec![("liblapack", None)],
"libgit2-sys" => vec![("libgit2", None)],
"protobuf-src" | "protoc-grpcio" => vec![("protobuf", None)],
"rust-htslib" | "hts-sys" => vec![
("htslib", None),
("zlib", None),
("bzip2", None),
("xz", None),
("libdeflate", None),
("libcurl", None),
],
_ => vec![],
}
}
pub fn detect_host_deps(dependency_names: &[&str]) -> Vec<(&'static str, Option<&'static str>)> {
let mut deps: Vec<(&str, Option<&str>)> =
dependency_names.iter().flat_map(|name| map_sys_crate(name)).collect();
deps.sort_by_key(|(name, _)| *name);
deps.dedup_by_key(|(name, _)| *name);
deps
}
pub fn needs_c_compiler(dependency_names: &[&str]) -> bool {
dependency_names.iter().any(|name| *name == "cc" || !map_sys_crate(name).is_empty())
}
pub fn needs_cxx_compiler(dependency_names: &[&str]) -> bool {
const CXX_CRATES: &[&str] = &[
"cxx",
"cxx-build",
"cpp",
"mimalloc",
"libmimalloc-sys",
"cmake",
"cmake-build",
"rocksdb",
"rocksdb-sys",
"snappy-sys",
"leveldb-sys",
"grpcio-sys",
"protobuf-src",
"rust-htslib",
"hts-sys",
"libgit2-sys",
];
dependency_names.iter().any(|name| CXX_CRATES.contains(name))
}
pub fn needs_bindgen(dependency_names: &[&str]) -> bool {
dependency_names.iter().any(|name| *name == "bindgen")
}
pub fn needs_pkg_config(dependency_names: &[&str]) -> bool {
const PKG_CONFIG_CRATES: &[&str] = &[
"openssl-sys",
"libz-sys",
"libz-ng-sys",
"bzip2-sys",
"lzma-sys",
"libdeflate-sys",
"lz4-sys",
"zstd-sys",
"curl-sys",
"libcurl-sys",
"libsqlite3-sys",
"gsl-sys",
"blas-sys",
"openblas-sys",
"cblas-sys",
"lapack-sys",
"libgit2-sys",
"hts-sys",
"rust-htslib",
];
dependency_names.iter().any(|name| PKG_CONFIG_CRATES.contains(name))
}
pub fn needs_cmake(dependency_names: &[&str]) -> bool {
const CMAKE_CRATES: &[&str] = &[
"grpcio-sys",
"rocksdb-sys",
"snappy-sys",
"leveldb-sys",
"libgit2-sys",
"libssh2-sys",
"zstd-sys",
];
dependency_names
.iter()
.any(|name| CMAKE_CRATES.contains(name) || *name == "cmake" || *name == "cmake-build")
}
pub fn needs_make(dependency_names: &[&str]) -> bool {
dependency_names.iter().any(|name| !map_sys_crate(name).is_empty())
}