mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-26 11:53:53 -06:00

Once qemu-api is split in multiple crates, each of them will have its own invocation of bindgen. There cannot be only one, because there are occasional "impl" blocks for the bindgen-generated structs (e.g. VMStateFlags or QOM classes) that have to reside in the same crate as the bindgen-generated code. For now, prepare for this new organization by invoking bindgen within the qemu-api crate's build definitions; it's also a much better place to list enums that need specific treatment from bindgen. Reviewed-by: Zhao Liu <zhao1.liu@intel.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
41 lines
1.4 KiB
Rust
41 lines
1.4 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};
|
|
|
|
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!("{path}/rust/qemu-api/bindings.inc.rs");
|
|
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!("{out_dir}/bindings.inc.rs");
|
|
let dest_path = Path::new(&dest_path);
|
|
if dest_path.symlink_metadata().is_ok() {
|
|
remove_file(dest_path)?;
|
|
}
|
|
symlink_file(file, dest_path)?;
|
|
|
|
println!("cargo:rerun-if-changed=build.rs");
|
|
Ok(())
|
|
}
|