extern crate rustc_version; extern crate semver; use std::fs::File; use std::io::Write; use std::{env, path}; use rustc_version::{version_meta, Channel}; fn main() { let mut path = path::PathBuf::from(env::var_os("OUT_DIR").unwrap()); path.push("version.rs"); let mut f = File::create(&path).unwrap(); let version = version_meta().expect("Failed to read rustc version."); let llvm_version = match version.llvm_version { Some(ver) => format!( "Some(LlvmVersion{{ major: {}, minor: {} }})", ver.major, ver.minor ), None => "None".to_owned(), }; write!( f, " /// Returns the `rustc` SemVer version and additional metadata /// like the git short hash and build date. pub fn version_meta() -> VersionMeta {{ VersionMeta {{ semver: Version {{ major: {major}, minor: {minor}, patch: {patch}, pre: Prerelease::new(\"{pre}\").unwrap(), build: BuildMetadata::new(\"{build}\").unwrap(), }}, host: \"{host}\".to_owned(), short_version_string: \"{short_version_string}\".to_owned(), commit_hash: {commit_hash}, commit_date: {commit_date}, build_date: {build_date}, channel: Channel::{channel}, llvm_version: {llvm_version}, }} }} ", major = version.semver.major, minor = version.semver.minor, patch = version.semver.patch, pre = version.semver.pre, build = version.semver.build, commit_hash = version .commit_hash .map(|h| format!("Some(\"{}\".to_owned())", h)) .unwrap_or("None".to_owned()), commit_date = version .commit_date .map(|h| format!("Some(\"{}\".to_owned())", h)) .unwrap_or("None".to_owned()), build_date = version .build_date .map(|h| format!("Some(\"{}\".to_owned())", h)) .unwrap_or("None".to_owned()), host = version.host, short_version_string = version.short_version_string, channel = match version.channel { Channel::Dev => "Dev", Channel::Nightly => "Nightly", Channel::Beta => "Beta", Channel::Stable => "Stable", }, llvm_version = llvm_version, ) .unwrap(); }