xref: /qemu/rust/qemu-api/build.rs (revision cab1d0bceb6d042674f6892216d1769021f73916)
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 
11f3518400SJunjie Mao use version_check as rustc;
12f3518400SJunjie Mao 
13cb7ada54SPaolo Bonzini fn main() -> Result<()> {
14cb7ada54SPaolo Bonzini     // Placing bindings.inc.rs in the source directory is supported
15cb7ada54SPaolo Bonzini     // but not documented or encouraged.
16cb7ada54SPaolo Bonzini     let path = env::var("MESON_BUILD_ROOT")
17cb7ada54SPaolo Bonzini         .unwrap_or_else(|_| format!("{}/src", env!("CARGO_MANIFEST_DIR")));
18cb7ada54SPaolo Bonzini 
19cb7ada54SPaolo Bonzini     let file = format!("{}/bindings.inc.rs", path);
20cb7ada54SPaolo Bonzini     let file = Path::new(&file);
21cb7ada54SPaolo Bonzini     if !Path::new(&file).exists() {
22cb7ada54SPaolo Bonzini         panic!(concat!(
23*cab1d0bcSPaolo Bonzini             "\n",
24*cab1d0bcSPaolo Bonzini             "    No generated C bindings found! Maybe you wanted one of\n",
25*cab1d0bcSPaolo Bonzini             "    `make clippy`, `make rustfmt`, `make rustdoc`?\n",
26*cab1d0bcSPaolo Bonzini             "\n",
27*cab1d0bcSPaolo Bonzini             "    For other uses of `cargo`, start a subshell with\n",
28*cab1d0bcSPaolo Bonzini             "    `pyvenv/bin/meson devenv`, or point MESON_BUILD_ROOT to\n",
29*cab1d0bcSPaolo Bonzini             "    the top of the build tree."
30cb7ada54SPaolo Bonzini         ));
315a5110d2SManos Pitsidianakis     }
32f3518400SJunjie Mao 
33cb7ada54SPaolo Bonzini     let out_dir = env::var("OUT_DIR").unwrap();
34cb7ada54SPaolo Bonzini     let dest_path = format!("{}/bindings.inc.rs", out_dir);
35cb7ada54SPaolo Bonzini     let dest_path = Path::new(&dest_path);
36cb7ada54SPaolo Bonzini     if dest_path.symlink_metadata().is_ok() {
37cb7ada54SPaolo Bonzini         remove_file(dest_path)?;
38cb7ada54SPaolo Bonzini     }
39cb7ada54SPaolo Bonzini     symlink_file(file, dest_path)?;
40cb7ada54SPaolo Bonzini 
41f3518400SJunjie Mao     // Check for available rustc features
42f3518400SJunjie Mao     if rustc::is_min_version("1.77.0").unwrap_or(false) {
43f3518400SJunjie Mao         println!("cargo:rustc-cfg=has_offset_of");
44f3518400SJunjie Mao     }
45f3518400SJunjie Mao 
46f3518400SJunjie Mao     println!("cargo:rerun-if-changed=build.rs");
47cb7ada54SPaolo Bonzini     Ok(())
485a5110d2SManos Pitsidianakis }
49