use std::{
convert::Infallible,
fmt::{Display, Formatter},
path::Path,
};
pub enum LinkSearchKind {
Dependency,
Crate,
Native,
Framework,
All,
}
impl Display for LinkSearchKind {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
let s = match self {
LinkSearchKind::Dependency => "dependency",
LinkSearchKind::Crate => "crate",
LinkSearchKind::Native => "native",
LinkSearchKind::Framework => "framework",
LinkSearchKind::All => "all",
};
write!(f, "{s}")
}
}
pub struct Rustc(Infallible);
impl Rustc {
pub fn link_arg(flag: impl AsRef<str>) {
let flag = flag.as_ref();
println!("cargo::rustc-link-arg={flag}");
}
pub fn link_arg_bin(bin: impl AsRef<str>, flag: impl AsRef<str>) {
let bin = bin.as_ref();
let flag = flag.as_ref();
println!("cargo::rustc-link-arg-bin={bin}={flag}");
}
pub fn link_arg_bins(flag: impl AsRef<str>) {
let flag = flag.as_ref();
println!("cargo::rustc-link-arg-bins={flag}");
}
pub fn link_lib(lib: impl AsRef<str>) {
let lib = lib.as_ref();
println!("cargo::rustc-link-lib={lib}");
}
pub fn link_arg_tests(flag: impl AsRef<str>) {
let flag = flag.as_ref();
println!("cargo::rustc-link-arg-tests={flag}");
}
pub fn link_arg_examples(flag: impl AsRef<str>) {
let flag = flag.as_ref();
println!("cargo::rustc-link-arg-examples={flag}");
}
pub fn link_search(path: impl AsRef<Path>, kind: impl Into<Option<LinkSearchKind>>) {
let path = path.as_ref().display();
let kind = kind.into();
match kind {
Some(kind) => println!("cargo::rustc-link-search={kind}={path}"),
None => println!("carg::rustc-link-search={path}"),
}
}
pub fn flags(flags: impl AsRef<str>) {
let flags = flags.as_ref();
println!("cargo::rustc-flags={flags}");
}
pub fn cfg<'a>(key: impl AsRef<str>, value: impl Into<Option<&'a str>>) {
let key = key.as_ref();
let value = value.into();
match value {
Some(value) => println!("cargo::rustc-cfg={key}=\"{value}\""),
None => println!("cargo::rustc-cfg={key}"),
}
}
pub fn check_cfg(cfg: impl AsRef<str>) {
let cfg = cfg.as_ref();
println!("cargo::rustc-check-cfg={cfg}");
}
pub fn env(var: impl AsRef<str>, value: impl AsRef<str>) {
let var = var.as_ref();
let value = value.as_ref();
println!("cargo::rustc-env={var}={value}");
}
pub fn cdylib_link_arg(flag: impl AsRef<str>) {
let flag = flag.as_ref();
println!("cargo::rustc-cdylib-link-arg={flag}");
}
}