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