Abstract common invocations of "cargo", that do not require copying the generated bindgen file or setting up MESON_BUILD_ROOT. In the future these could also do completely without cargo and invoke the underlying programs directly. Reviewed-by: Junjie Mao <junjie.mao@hotmail.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
		
			
				
	
	
		
			49 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
// Copyright 2024, Linaro Limited
 | 
						|
// Author(s): Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
 | 
						|
// SPDX-License-Identifier: GPL-2.0-or-later
 | 
						|
 | 
						|
#[cfg(unix)]
 | 
						|
use std::os::unix::fs::symlink as symlink_file;
 | 
						|
#[cfg(windows)]
 | 
						|
use std::os::windows::fs::symlink_file;
 | 
						|
use std::{env, fs::remove_file, io::Result, path::Path};
 | 
						|
 | 
						|
use version_check as rustc;
 | 
						|
 | 
						|
fn main() -> Result<()> {
 | 
						|
    // Placing bindings.inc.rs in the source directory is supported
 | 
						|
    // but not documented or encouraged.
 | 
						|
    let path = env::var("MESON_BUILD_ROOT")
 | 
						|
        .unwrap_or_else(|_| format!("{}/src", env!("CARGO_MANIFEST_DIR")));
 | 
						|
 | 
						|
    let file = format!("{}/bindings.inc.rs", path);
 | 
						|
    let file = Path::new(&file);
 | 
						|
    if !Path::new(&file).exists() {
 | 
						|
        panic!(concat!(
 | 
						|
            "\n",
 | 
						|
            "    No generated C bindings found! Maybe you wanted one of\n",
 | 
						|
            "    `make clippy`, `make rustfmt`, `make rustdoc`?\n",
 | 
						|
            "\n",
 | 
						|
            "    For other uses of `cargo`, start a subshell with\n",
 | 
						|
            "    `pyvenv/bin/meson devenv`, or point MESON_BUILD_ROOT to\n",
 | 
						|
            "    the top of the build tree."
 | 
						|
        ));
 | 
						|
    }
 | 
						|
 | 
						|
    let out_dir = env::var("OUT_DIR").unwrap();
 | 
						|
    let dest_path = format!("{}/bindings.inc.rs", out_dir);
 | 
						|
    let dest_path = Path::new(&dest_path);
 | 
						|
    if dest_path.symlink_metadata().is_ok() {
 | 
						|
        remove_file(dest_path)?;
 | 
						|
    }
 | 
						|
    symlink_file(file, dest_path)?;
 | 
						|
 | 
						|
    // Check for available rustc features
 | 
						|
    if rustc::is_min_version("1.77.0").unwrap_or(false) {
 | 
						|
        println!("cargo:rustc-cfg=has_offset_of");
 | 
						|
    }
 | 
						|
 | 
						|
    println!("cargo:rerun-if-changed=build.rs");
 | 
						|
    Ok(())
 | 
						|
}
 |