cargo_lib/
lib.rs

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
32/// Tells Cargo when to re-run the script.
33pub fn rerun_if_changed<P: AsRef<Path>>(p: P) {
34    println!("cargo:rerun-if-changed={}", p.as_ref().display());
35}
36
37/// Tells Cargo when to re-run the script.
38pub fn rerun_if_env_changed(env_var: &str) {
39    println!("cargo:rerun-if-env-changed={}", env_var);
40}
41
42/// Sets an environment variable which can be accessed using var! macro
43pub fn rustc_env(var: &str, value: &str) {
44    println!("cargo:rustc-env={}={}", var, value);
45}
46
47/// Enables compile-time cfg settings.
48pub 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
57/// Passes custom flags to a linker for benchmarks, binaries, cdylib crates, examples, and tests.
58pub 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
83/// Adds to the library search path.
84pub 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
97/// Adds a library to link
98pub 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
107/// Metadata, used by links scripts.
108pub fn metadata_set(key: &str, val: &str) {
109    println!("cargo:{}={}", key, val);
110}
111
112/// Displays a warning on the terminal.
113pub fn warning(msg: &str) {
114    println!("cargo:warning={}", msg);
115}