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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#![warn(missing_docs)]

//! Simple library for getting the version information of a `rustc`
//! compiler in runtime.
//!
//! The goal of this crate is to provide debug information to developers,
//! not to branch application logic based on compiler version. Please, don't
//! do that.
//!
//! # Example
//!
//! ```rust
//! extern crate rustc_version_runtime;
//!
//! println!("This was compiled using {:?}", rustc_version_runtime::version());
//! ```

extern crate rustc_version;
extern crate semver;
use rustc_version::LlvmVersion;
use semver::{BuildMetadata, Prerelease, VersionReq};

pub use rustc_version::{Channel, Version, VersionMeta};
mod version {
    use super::*;
    include!(concat!(env!("OUT_DIR"), "/version.rs"));
}
pub use version::version_meta;

/// Returns the `rustc` SemVer version.
pub fn version() -> Version {
    version_meta().semver
}

/// Check wether the `rustc` version matches the given SemVer
/// version requirement.
pub fn version_matches(req: &str) -> bool {
    // There is some issue checking requirements for pre-releases
    // https://github.com/steveklabnik/semver/issues/172
    // I believe users of this crate would expect 1.31.0-nightly to be greater than 1.30 and
    // equal to 1.31.0. This might not be the case, but I cannot see why.
    let mut v = version();
    v.pre = Prerelease::new("").unwrap();
    VersionReq::parse(req).unwrap().matches(&v)
}

#[test]
fn smoketest() {
    let v = version();
    assert!(v.major >= 1);
    assert!(v.minor >= 2);

    let v = version_meta();
    assert!(v.semver.major >= 1);
    assert!(v.semver.minor >= 2);

    assert!(version_matches(">= 1.2.0"));
}