| // 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(()) |
| } |