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}