diff --git a/bindings/bindings-linux-aarch64-R4.1.rs b/bindings/bindings-linux-aarch64-R4.1.rs index 0d113f4f..a2a60ac8 100644 --- a/bindings/bindings-linux-aarch64-R4.1.rs +++ b/bindings/bindings-linux-aarch64-R4.1.rs @@ -1,7 +1,9 @@ +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ /* bindgen clang version: Ubuntu clang version 14.0.0-1ubuntu1 */ /* clang-rs version: Ubuntu clang version 14.0.0-1ubuntu1 */ /* r version: 4.1.3 */ -/* automatically generated by rust-bindgen 0.64.0 */ pub const M_E: f64 = 2.718281828459045; pub const M_LOG2E: f64 = 1.4426950408889634; diff --git a/bindings/bindings-linux-aarch64-R4.2.rs b/bindings/bindings-linux-aarch64-R4.2.rs index 2838f6d6..ca9e9f49 100644 --- a/bindings/bindings-linux-aarch64-R4.2.rs +++ b/bindings/bindings-linux-aarch64-R4.2.rs @@ -1,7 +1,9 @@ +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ /* bindgen clang version: Ubuntu clang version 14.0.0-1ubuntu1 */ /* clang-rs version: Ubuntu clang version 14.0.0-1ubuntu1 */ /* r version: 4.2.3 */ -/* automatically generated by rust-bindgen 0.64.0 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/bindings/bindings-linux-aarch64-R4.4-devel.rs b/bindings/bindings-linux-aarch64-R4.4-devel.rs index 08f8a931..a469a68a 100644 --- a/bindings/bindings-linux-aarch64-R4.4-devel.rs +++ b/bindings/bindings-linux-aarch64-R4.4-devel.rs @@ -1,7 +1,9 @@ +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ /* bindgen clang version: Ubuntu clang version 14.0.0-1ubuntu1 */ /* clang-rs version: Ubuntu clang version 14.0.0-1ubuntu1 */ /* r version: 4.4.0-devel */ -/* automatically generated by rust-bindgen 0.64.0 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/bindings/bindings-linux-x86_64-R4.1.rs b/bindings/bindings-linux-x86_64-R4.1.rs index 46b5d6ff..42772c92 100644 --- a/bindings/bindings-linux-x86_64-R4.1.rs +++ b/bindings/bindings-linux-x86_64-R4.1.rs @@ -1,7 +1,9 @@ +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ /* bindgen clang version: Ubuntu clang version 14.0.0-1ubuntu1 */ /* clang-rs version: Ubuntu clang version 14.0.0-1ubuntu1 */ /* r version: 4.1.3 */ -/* automatically generated by rust-bindgen 0.64.0 */ pub const M_E: f64 = 2.718281828459045; pub const M_LOG2E: f64 = 1.4426950408889634; diff --git a/bindings/bindings-linux-x86_64-R4.2.rs b/bindings/bindings-linux-x86_64-R4.2.rs index 78623b14..0bed4b41 100644 --- a/bindings/bindings-linux-x86_64-R4.2.rs +++ b/bindings/bindings-linux-x86_64-R4.2.rs @@ -1,7 +1,9 @@ +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ /* bindgen clang version: Ubuntu clang version 14.0.0-1ubuntu1 */ /* clang-rs version: Ubuntu clang version 14.0.0-1ubuntu1 */ /* r version: 4.2.3 */ -/* automatically generated by rust-bindgen 0.64.0 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/bindings/bindings-linux-x86_64-R4.4-devel.rs b/bindings/bindings-linux-x86_64-R4.4-devel.rs index cbbd5914..6d483a30 100644 --- a/bindings/bindings-linux-x86_64-R4.4-devel.rs +++ b/bindings/bindings-linux-x86_64-R4.4-devel.rs @@ -1,7 +1,9 @@ +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ /* bindgen clang version: Ubuntu clang version 14.0.0-1ubuntu1 */ /* clang-rs version: Ubuntu clang version 14.0.0-1ubuntu1 */ /* r version: 4.4.0-devel */ -/* automatically generated by rust-bindgen 0.64.0 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/bindings/bindings-macos-aarch64-R4.2.rs b/bindings/bindings-macos-aarch64-R4.2.rs index da65616f..b7dc6713 100644 --- a/bindings/bindings-macos-aarch64-R4.2.rs +++ b/bindings/bindings-macos-aarch64-R4.2.rs @@ -1,7 +1,9 @@ +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ /* bindgen clang version: Homebrew clang version 16.0.1 */ /* clang-rs version: Homebrew clang version 16.0.1 */ /* r version: 4.2.3 */ -/* automatically generated by rust-bindgen 0.64.0 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/bindings/bindings-macos-x86_64-R4.1.rs b/bindings/bindings-macos-x86_64-R4.1.rs index a362514a..216ece2d 100644 --- a/bindings/bindings-macos-x86_64-R4.1.rs +++ b/bindings/bindings-macos-x86_64-R4.1.rs @@ -1,7 +1,9 @@ +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ /* bindgen clang version: Homebrew clang version 16.0.1 */ /* clang-rs version: Homebrew clang version 16.0.1 */ /* r version: 4.1.3 */ -/* automatically generated by rust-bindgen 0.64.0 */ pub const INT_MIN: i32 = -2147483648; pub const M_E: f64 = 2.718281828459045; diff --git a/bindings/bindings-macos-x86_64-R4.2.rs b/bindings/bindings-macos-x86_64-R4.2.rs index 4286e4e6..bfd1a16e 100644 --- a/bindings/bindings-macos-x86_64-R4.2.rs +++ b/bindings/bindings-macos-x86_64-R4.2.rs @@ -1,7 +1,9 @@ +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ /* bindgen clang version: Homebrew clang version 16.0.1 */ /* clang-rs version: Homebrew clang version 16.0.1 */ /* r version: 4.2.3 */ -/* automatically generated by rust-bindgen 0.64.0 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/bindings/bindings-macos-x86_64-R4.4-devel.rs b/bindings/bindings-macos-x86_64-R4.4-devel.rs index bff9ae92..21a68a28 100644 --- a/bindings/bindings-macos-x86_64-R4.4-devel.rs +++ b/bindings/bindings-macos-x86_64-R4.4-devel.rs @@ -1,7 +1,9 @@ +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ /* bindgen clang version: Homebrew clang version 16.0.1 */ /* clang-rs version: Homebrew clang version 16.0.1 */ /* r version: 4.4.0-devel */ -/* automatically generated by rust-bindgen 0.64.0 */ #[repr(C)] #[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] diff --git a/bindings/bindings-windows-x86-R4.1.rs b/bindings/bindings-windows-x86-R4.1.rs index 7d57e551..6d0568d6 100644 --- a/bindings/bindings-windows-x86-R4.1.rs +++ b/bindings/bindings-windows-x86-R4.1.rs @@ -1,7 +1,9 @@ +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ /* bindgen clang version: clang version 15.0.7 */ /* clang-rs version: clang version 15.0.7 */ /* r version: 4.1.3 */ -/* automatically generated by rust-bindgen 0.64.0 */ pub const INT_MIN: i32 = -2147483648; pub const M_E: f64 = 2.718281828459045; diff --git a/bindings/bindings-windows-x86_64-R4.1.rs b/bindings/bindings-windows-x86_64-R4.1.rs index d38c857f..61434088 100644 --- a/bindings/bindings-windows-x86_64-R4.1.rs +++ b/bindings/bindings-windows-x86_64-R4.1.rs @@ -1,7 +1,9 @@ +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ /* bindgen clang version: clang version 15.0.7 */ /* clang-rs version: clang version 15.0.7 */ /* r version: 4.1.3 */ -/* automatically generated by rust-bindgen 0.64.0 */ pub const INT_MIN: i32 = -2147483648; pub const M_E: f64 = 2.718281828459045; diff --git a/bindings/bindings-windows-x86_64-R4.2.rs b/bindings/bindings-windows-x86_64-R4.2.rs index b1750e80..81075942 100644 --- a/bindings/bindings-windows-x86_64-R4.2.rs +++ b/bindings/bindings-windows-x86_64-R4.2.rs @@ -1,8 +1,10 @@ -/* bindgen clang version: clang version 15.0.7 */ -/* clang-rs version: clang version 15.0.7 */ -/* r version: 4.2.3 */ -/* automatically generated by rust-bindgen 0.64.0 */ - +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ +/* bindgen clang version: clang version 15.0.7 */ +/* clang-rs version: clang version 15.0.7 */ +/* r version: 4.2.3 */ + pub const INT_MIN: i32 = -2147483648; pub const M_E: f64 = 2.718281828459045; pub const M_LOG2E: f64 = 1.4426950408889634; diff --git a/bindings/bindings-windows-x86_64-R4.4-devel.rs b/bindings/bindings-windows-x86_64-R4.4-devel.rs index b2e90f03..e9534e76 100644 --- a/bindings/bindings-windows-x86_64-R4.4-devel.rs +++ b/bindings/bindings-windows-x86_64-R4.4-devel.rs @@ -1,8 +1,10 @@ -/* bindgen clang version: clang version 15.0.7 */ -/* clang-rs version: clang version 15.0.7 */ -/* r version: 4.4.0-devel */ -/* automatically generated by rust-bindgen 0.64.0 */ - +/* automatically generated by rust-bindgen 0.64.0 */ + +/* libR-sys version: 0.4.0 */ +/* bindgen clang version: clang version 15.0.7 */ +/* clang-rs version: clang version 15.0.7 */ +/* r version: 4.4.0-devel */ + pub const INT_MIN: i32 = -2147483648; pub const M_E: f64 = 2.718281828459045; pub const M_LOG2E: f64 = 1.4426950408889634; diff --git a/build.rs b/build.rs index e481abf7..9f6532bd 100644 --- a/build.rs +++ b/build.rs @@ -30,6 +30,7 @@ const ENVVAR_R_HOME: &str = "R_HOME"; const ENVVAR_R_VERSION: &str = "LIBRSYS_R_VERSION"; // A path to a dir containing pre-computed bindings (default: "bindings"). +#[cfg(not(feature = "use-bindgen"))] const ENVVAR_BINDINGS_PATH: &str = "LIBRSYS_BINDINGS_PATH"; // A path to libclang toolchain. If this is set, the path is added to the @@ -41,7 +42,8 @@ const ENVVAR_LIBCLANG_INCLUDE_PATH: &str = "LIBRSYS_LIBCLANG_INCLUDE_PATH"; // dir. If this is set, generated bindings are also put there. #[cfg(feature = "use-bindgen")] const ENVVAR_BINDINGS_OUTPUT_PATH: &str = "LIBRSYS_BINDINGS_OUTPUT_PATH"; -#[allow(dead_code)] + +#[derive(Debug)] struct InstallationPaths { r_home: PathBuf, include: PathBuf, @@ -69,11 +71,14 @@ struct RVersionInfo { } impl RVersionInfo { + /// Returns the name for precompiled bindings, given R version and targets. + /// e.g. `bindings-windows-x86_64-R4.4-devel.rs` fn get_r_bindings_filename(&self, target_os: &str, target_arch: &str) -> PathBuf { let devel_suffix = if self.devel { "-devel" } else { "" }; + let major = &self.major; + let minor = &self.minor; PathBuf::from(format!( - "bindings-{}-{}-R{}.{}{}.rs", - target_os, target_arch, self.major, self.minor, devel_suffix + "bindings-{target_os}-{target_arch}-R{major}.{minor}{devel_suffix}.rs" )) } } @@ -464,8 +469,7 @@ fn generate_bindings(r_paths: &InstallationPaths, version_info: &RVersionInfo) { let target_arch = env::var("CARGO_CFG_TARGET_ARCH").unwrap(); println!( - "Generating bindings for target: {}, os: {}, architecture: {}", - target, target_os, target_arch + "Generating bindings for target: {target}, os: {target_os}, architecture: {target_arch}" ); // Point to the correct headers @@ -492,6 +496,16 @@ fn generate_bindings(r_paths: &InstallationPaths, version_info: &RVersionInfo) { // Finish the builder and generate the bindings. let bindings = bindgen_builder + .raw_line(format!( + "/* libR-sys version: {} */", + env!("CARGO_PKG_VERSION") + )) + .raw_line(format!( + "/* bindgen clang version: {} */", + bindgen::clang_version().full + )) + .raw_line(format!("/* clang-rs version: {} */", clang::get_version())) + .raw_line(format!("/* r version: {} */", version_info.full)) .generate_comments(true) .parse_callbacks(Box::new(TrimCommentsCallbacks)) .clang_arg("-fparse-all-comments") @@ -522,7 +536,9 @@ fn generate_bindings(r_paths: &InstallationPaths, version_info: &RVersionInfo) { let bindings_file_full = version_info.get_r_bindings_filename(&target_os, &target_arch); let out_file = out_path.join(bindings_file_full); - save_bindings_to_file(bindings, version_info, out_file); + bindings + .write_to_file(&out_file) + .expect(&format!("Couldn't write bindings: {}", out_file.display())); } else { println!( "Warning: Couldn't write the bindings since `LIBRSYS_BINDINGS_OUTPUT_PATH` is not set." @@ -530,31 +546,7 @@ fn generate_bindings(r_paths: &InstallationPaths, version_info: &RVersionInfo) { } } -#[cfg(feature = "use-bindgen")] -fn save_bindings_to_file( - bindings: bindgen::Bindings, - version_info: &RVersionInfo, - out_file: PathBuf, -) { - let clang_version_bindgen = bindgen::clang_version(); - let clang_rs_version = clang::get_version(); - let header = [ - format!( - "/* bindgen clang version: {} */", - clang_version_bindgen.full - ), - format!("/* clang-rs version: {} */", clang_rs_version), - format!("/* r version: {} */", version_info.full), - ]; - let header = header.join("\n"); - - let bindings = bindings.to_string(); - let bindings = format!("{header}\n{bindings}"); - std::fs::write(&out_file, bindings) - .expect(&format!("Couldn't write bindings: {}", out_file.display())); -} - -#[allow(dead_code)] +#[cfg(not(feature = "use-bindgen"))] /// Retrieve bindings from cache, if available. Errors out otherwise. fn retrieve_prebuild_bindings(version_info: &RVersionInfo) { let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap(); @@ -565,7 +557,7 @@ fn retrieve_prebuild_bindings(version_info: &RVersionInfo) { // we try a few different file names, from more specific to less specific let bindings_file_full = version_info.get_r_bindings_filename(&target_os, &target_arch); - let bindings_file_novers = PathBuf::from(format!("bindings-{}-{}.rs", target_os, target_arch)); + let bindings_file_novers = PathBuf::from(format!("bindings-{target_os}-{target_arch}.rs")); let mut from = bindings_path.join(bindings_file_full); if !from.exists() {