1#![doc = include_str!("../README.md")]
2#![allow(clippy::needless_doctest_main)]
3
4use std::path::Path;
5
6#[derive(Copy, Clone, Debug)]
7pub enum SearchLibKind {
8 Dependency,
9 Crate,
10 Native,
11 Framework,
12 All,
13}
14
15#[derive(Copy, Clone, Debug)]
16pub enum LibKind {
17 Dylib,
18 Static,
19 Framework,
20}
21
22#[derive(Copy, Clone, Debug)]
23pub enum LinkArgTarget {
24 Bin(&'static str),
25 Bins,
26 Tests,
27 Examples,
28 Benches,
29 Cdylib,
30}
31
32pub fn rerun_if_changed<P: AsRef<Path>>(p: P) {
34 println!("cargo:rerun-if-changed={}", p.as_ref().display());
35}
36
37pub fn rerun_if_env_changed(env_var: &str) {
39 println!("cargo:rerun-if-env-changed={}", env_var);
40}
41
42pub fn rustc_env(var: &str, value: &str) {
44 println!("cargo:rustc-env={}={}", var, value);
45}
46
47pub fn rustc_cfg(key: &str, value: Option<&str>) {
49 let value = if let Some(v) = value {
50 format!("{}={}", key, v)
51 } else {
52 key.to_string()
53 };
54 println!("cargo:rustc-cfg={}", value);
55}
56
57pub fn rustc_link_arg<T: Into<Option<LinkArgTarget>>>(arg: &str, target: T) {
59 let mut is_cdylib = false;
60 let target = if let Some(t) = target.into() {
61 match t {
62 LinkArgTarget::Bin(s) => format!("-bin={}", &s),
63 LinkArgTarget::Bins => "-bins".to_string(),
64 LinkArgTarget::Tests => "-tests".to_string(),
65 LinkArgTarget::Benches => "-benches".to_string(),
66 LinkArgTarget::Examples => "-examples".to_string(),
67 LinkArgTarget::Cdylib => {
68 is_cdylib = true;
69 String::new()
70 }
71 }
72 } else {
73 String::new()
74 };
75 println!(
76 "cargo:rustc-{}link-arg{}={}",
77 if is_cdylib { "cdylib-" } else { "" },
78 target,
79 arg
80 );
81}
82
83pub fn rustc_link_search<P: AsRef<Path>, T: Into<Option<SearchLibKind>>>(p: P, kind: T) {
85 let kind = if let Some(k) = kind.into() {
86 k
87 } else {
88 SearchLibKind::All
89 };
90 println!(
91 "cargo:rustc-link-search={}={}",
92 &format!("{:?}", kind).to_lowercase(),
93 p.as_ref().display()
94 );
95}
96
97pub fn rustc_link_lib<T: Into<Option<LibKind>>>(lib: &str, kind: T) {
99 let lib = if let Some(k) = kind.into() {
100 format!("{}={}", format!("{:?}", k).to_lowercase(), lib)
101 } else {
102 lib.to_string()
103 };
104 println!("cargo:rustc-link-lib={}", lib);
105}
106
107pub fn metadata_set(key: &str, val: &str) {
109 println!("cargo:{}={}", key, val);
110}
111
112pub fn warning(msg: &str) {
114 println!("cargo:warning={}", msg);
115}