libhdf5_lib/
lib.rs

1use std::os::raw::{c_int, c_uint};
2
3extern {
4    pub fn H5open() -> c_int;
5    pub fn H5get_libversion(majnum: *mut c_uint, minnum: *mut c_uint,
6                            relnum: *mut c_uint) -> c_int;
7}
8
9pub fn hdf5_version() -> Result<(u8, u8, u8), &'static str> {
10    let mut v: (c_uint, c_uint, c_uint) = (0, 0, 0);
11    unsafe {
12        if H5open() != 0 {
13            Err("cannot open HDF5 library")
14        } else {
15            if H5get_libversion(&mut v.0, &mut v.1, &mut v.2) != 0 {
16                Err("cannot get HDF5 version")
17            } else {
18                Ok((v.0 as u8, v.1 as u8, v.2 as u8))
19            }
20        }
21    }
22}
23
24pub fn dump_build_flags() {
25    let version = hdf5_version().unwrap();
26    assert!(version >= (1, 8, 4));
27    let mut vs: Vec<_> = (5..17).map(|v| (1, 8, v)).collect();
28    vs.extend((0..1).map(|v| (1, 10, v)));
29    for v in vs.into_iter().filter(|&v| version >= v) {
30        println!("cargo:rustc-cfg=hdf5_{}_{}_{}", v.0, v.1, v.2);
31    }
32}
33
34#[cfg(test)]
35pub mod tests {
36    use super::hdf5_version;
37
38    #[test]
39    fn test_version() {
40        assert!(hdf5_version().unwrap() >= (1, 8, 4));
41    }
42}