1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use std::os::raw::{c_int, c_uint};

extern {
    pub fn H5open() -> c_int;
    pub fn H5get_libversion(majnum: *mut c_uint, minnum: *mut c_uint,
                            relnum: *mut c_uint) -> c_int;
}

pub fn hdf5_version() -> Result<(u8, u8, u8), &'static str> {
    let mut v: (c_uint, c_uint, c_uint) = (0, 0, 0);
    unsafe {
        if H5open() != 0 {
            Err("cannot open HDF5 library")
        } else {
            if H5get_libversion(&mut v.0, &mut v.1, &mut v.2) != 0 {
                Err("cannot get HDF5 version")
            } else {
                Ok((v.0 as u8, v.1 as u8, v.2 as u8))
            }
        }
    }
}

pub fn dump_build_flags() {
    let version = hdf5_version().unwrap();
    assert!(version >= (1, 8, 4));
    let mut vs: Vec<_> = (5..17).map(|v| (1, 8, v)).collect();
    vs.extend((0..1).map(|v| (1, 10, v)));
    for v in vs.into_iter().filter(|&v| version >= v) {
        println!("cargo:rustc-cfg=hdf5_{}_{}_{}", v.0, v.1, v.2);
    }
}

#[cfg(test)]
pub mod tests {
    use super::hdf5_version;

    #[test]
    fn test_version() {
        assert!(hdf5_version().unwrap() >= (1, 8, 4));
    }
}