// Copyright 2024, Linaro Limited // Author(s): Manos Pitsidianakis // 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}/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(()) }