xref: /qemu/rust/qemu-api/build.rs (revision c5f122fdcc280a82e7c5f31de890f985aa7ba773)
15a5110d2SManos Pitsidianakis // Copyright 2024, Linaro Limited
25a5110d2SManos Pitsidianakis // Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
35a5110d2SManos Pitsidianakis // SPDX-License-Identifier: GPL-2.0-or-later
45a5110d2SManos Pitsidianakis 
5cb7ada54SPaolo Bonzini #[cfg(unix)]
6cb7ada54SPaolo Bonzini use std::os::unix::fs::symlink as symlink_file;
7cb7ada54SPaolo Bonzini #[cfg(windows)]
8cb7ada54SPaolo Bonzini use std::os::windows::fs::symlink_file;
9cb7ada54SPaolo Bonzini use std::{env, fs::remove_file, io::Result, path::Path};
105a5110d2SManos Pitsidianakis 
main() -> Result<()>11cb7ada54SPaolo Bonzini fn main() -> Result<()> {
12cb7ada54SPaolo Bonzini     // Placing bindings.inc.rs in the source directory is supported
13cb7ada54SPaolo Bonzini     // but not documented or encouraged.
14cb7ada54SPaolo Bonzini     let path = env::var("MESON_BUILD_ROOT")
15cb7ada54SPaolo Bonzini         .unwrap_or_else(|_| format!("{}/src", env!("CARGO_MANIFEST_DIR")));
16cb7ada54SPaolo Bonzini 
17*c6b04613SPaolo Bonzini     let file = format!("{path}/bindings.inc.rs");
18cb7ada54SPaolo Bonzini     let file = Path::new(&file);
19cb7ada54SPaolo Bonzini     if !Path::new(&file).exists() {
20cb7ada54SPaolo Bonzini         panic!(concat!(
21cab1d0bcSPaolo Bonzini             "\n",
22cab1d0bcSPaolo Bonzini             "    No generated C bindings found! Maybe you wanted one of\n",
23cab1d0bcSPaolo Bonzini             "    `make clippy`, `make rustfmt`, `make rustdoc`?\n",
24cab1d0bcSPaolo Bonzini             "\n",
25cab1d0bcSPaolo Bonzini             "    For other uses of `cargo`, start a subshell with\n",
26cab1d0bcSPaolo Bonzini             "    `pyvenv/bin/meson devenv`, or point MESON_BUILD_ROOT to\n",
27cab1d0bcSPaolo Bonzini             "    the top of the build tree."
28cb7ada54SPaolo Bonzini         ));
295a5110d2SManos Pitsidianakis     }
30f3518400SJunjie Mao 
31cb7ada54SPaolo Bonzini     let out_dir = env::var("OUT_DIR").unwrap();
32*c6b04613SPaolo Bonzini     let dest_path = format!("{out_dir}/bindings.inc.rs");
33cb7ada54SPaolo Bonzini     let dest_path = Path::new(&dest_path);
34cb7ada54SPaolo Bonzini     if dest_path.symlink_metadata().is_ok() {
35cb7ada54SPaolo Bonzini         remove_file(dest_path)?;
36cb7ada54SPaolo Bonzini     }
37cb7ada54SPaolo Bonzini     symlink_file(file, dest_path)?;
38cb7ada54SPaolo Bonzini 
39f3518400SJunjie Mao     println!("cargo:rerun-if-changed=build.rs");
40cb7ada54SPaolo Bonzini     Ok(())
415a5110d2SManos Pitsidianakis }
42