Skip to main content

opencv_binding_generator/
version.rs

1use std::fs::File;
2use std::io::BufReader;
3use std::ops::ControlFlow;
4use std::path::{Path, PathBuf};
5
6use semver::Version;
7
8use crate::line_reader;
9
10pub trait OpenCVHeaderVersionExt {
11	fn opencv_find_module_header_dir(&self) -> Option<PathBuf>;
12	fn opencv_find_version_header(&self) -> Option<PathBuf>;
13	fn opencv_find_version(&self) -> Option<Version>;
14}
15
16impl OpenCVHeaderVersionExt for Path {
17	fn opencv_find_module_header_dir(&self) -> Option<PathBuf> {
18		let mut out = self.join("opencv2.framework/Headers");
19		if out.is_dir() {
20			return Some(out);
21		}
22		out = self.join("opencv2");
23		if out.is_dir() {
24			return Some(out);
25		}
26		None
27	}
28
29	fn opencv_find_version_header(&self) -> Option<PathBuf> {
30		self
31			.opencv_find_module_header_dir()
32			.map(|dir| dir.join("core/version.hpp"))
33			.filter(|hdr| hdr.is_file())
34	}
35
36	fn opencv_find_version(&self) -> Option<Version> {
37		let version_hpp = self.opencv_find_version_header()?;
38		let mut major = None;
39		let mut minor = None;
40		let mut revision = None;
41		let reader = BufReader::new(File::open(version_hpp).ok()?);
42		line_reader(reader, |line| {
43			if let Some(line) = line.strip_prefix("#define CV_VERSION_") {
44				let mut parts = line.split_whitespace();
45				if let Some(ver_spec) = parts.next()
46					&& let Some(version) = parts.next()
47				{
48					match ver_spec {
49						"MAJOR" => major = version.parse().ok(),
50						"MINOR" => minor = version.parse().ok(),
51						"REVISION" => revision = version.parse().ok(),
52						_ => {}
53					}
54				}
55				if major.is_some() && minor.is_some() && revision.is_some() {
56					return ControlFlow::Break(());
57				}
58			}
59			ControlFlow::Continue(())
60		});
61		if let Some(major) = major
62			&& let Some(minor) = minor
63			&& let Some(revision) = revision
64		{
65			Some(Version::new(major, minor, revision))
66		} else {
67			None
68		}
69	}
70}
71
72pub trait OpenCVVersionExt {
73	fn is_opencv_5(&self) -> bool;
74}
75
76impl OpenCVVersionExt for Version {
77	fn is_opencv_5(&self) -> bool {
78		self.major == 5
79	}
80}