libgir/codegen/sys/
build.rs

1use std::io::{Result, Write};
2
3use log::info;
4
5use super::collect_versions;
6use crate::{codegen::general, env::Env, file_saver::save_to_file};
7
8pub fn generate(env: &Env) {
9    info!(
10        "Generating sys build script for {}",
11        env.config.library_name
12    );
13
14    let split_build_rs = env.config.split_build_rs;
15    let path = env.config.target_path.join("build.rs");
16
17    if !split_build_rs || !path.exists() {
18        info!("Generating file {:?}", path);
19        save_to_file(&path, env.config.make_backup, |w| {
20            generate_build_script(w, env, split_build_rs)
21        });
22    }
23
24    if split_build_rs {
25        let path = env.config.target_path.join("build_version.rs");
26        info!("Generating file {:?}", path);
27        save_to_file(&path, env.config.make_backup, |w| {
28            generate_build_version(w, env)
29        });
30    }
31}
32
33#[allow(clippy::write_literal)]
34fn generate_build_script(w: &mut dyn Write, env: &Env, split_build_rs: bool) -> Result<()> {
35    if !split_build_rs {
36        general::start_comments(w, &env.config)?;
37        writeln!(w)?;
38    }
39    writeln!(
40        w,
41        "{}",
42        r#"#[cfg(not(docsrs))]
43use std::process;"#
44    )?;
45
46    if split_build_rs {
47        writeln!(w)?;
48        writeln!(w, "mod build_version;")?;
49    }
50
51    write!(
52        w,
53        "{}",
54        r#"
55#[cfg(docsrs)]
56fn main() {} // prevent linking libraries to avoid documentation failure
57
58#[cfg(not(docsrs))]
59fn main() {
60    if let Err(s) = system_deps::Config::new().probe() {
61        println!("cargo:warning={s}");
62        process::exit(1);
63    }
64}
65"#
66    )
67}
68
69fn generate_build_version(w: &mut dyn Write, env: &Env) -> Result<()> {
70    general::start_comments(w, &env.config)?;
71    writeln!(w)?;
72    writeln!(w, "pub fn version() -> &'static str {{")?;
73    write_version(w, env, false)?;
74    writeln!(w, "}}")
75}
76
77fn write_version(w: &mut dyn Write, env: &Env, for_let: bool) -> Result<()> {
78    let versions = collect_versions(env);
79
80    for (version, lib_version) in versions.iter().rev() {
81        write!(
82            w,
83            "if cfg!({}) {{\n\t\t\"{}\"\n\t}} else ",
84            version.to_cfg(None),
85            lib_version
86        )?;
87    }
88    let end = if for_let { ";" } else { "" };
89    writeln!(w, "{{\n\t\t\"{}\"\n\t}}{}", env.config.min_cfg_version, end)
90}