163809052SJethro Beekman extern crate rustc_version;
263809052SJethro Beekman
363809052SJethro Beekman use std::env;
463809052SJethro Beekman use std::fs::File;
563809052SJethro Beekman use std::io::Write;
663809052SJethro Beekman use std::path::PathBuf;
763809052SJethro Beekman use std::ops::{Neg,Sub};
863809052SJethro Beekman
963809052SJethro Beekman /*
1063809052SJethro Beekman * Let me explain this hack. For the sync shell script it's easiest if every
1163809052SJethro Beekman * line in mapping.rs looks exactly the same. This means that specifying an
1263809052SJethro Beekman * array literal is not possible. include!() can only expand to expressions, so
1363809052SJethro Beekman * just specifying the contents of an array is also not possible.
1463809052SJethro Beekman *
1563809052SJethro Beekman * This leaves us with trying to find an expression in which every line looks
1663809052SJethro Beekman * the same. This can be done using the `-` operator. This can be a unary
1763809052SJethro Beekman * operator (first thing on the first line), or a binary operator (later
1863809052SJethro Beekman * lines). That is exactly what's going on here, and Neg and Sub simply build a
1963809052SJethro Beekman * vector of the operangs.
2063809052SJethro Beekman */
2163809052SJethro Beekman struct Mapping(&'static str,&'static str);
2263809052SJethro Beekman
2363809052SJethro Beekman impl Neg for Mapping {
2463809052SJethro Beekman type Output = Vec<Mapping>;
neg(self) -> Vec<Mapping>2563809052SJethro Beekman fn neg(self) -> Vec<Mapping> {
2663809052SJethro Beekman vec![self.into()]
2763809052SJethro Beekman }
2863809052SJethro Beekman }
2963809052SJethro Beekman
3063809052SJethro Beekman impl Sub<Mapping> for Vec<Mapping> {
3163809052SJethro Beekman type Output=Vec<Mapping>;
sub(mut self, rhs: Mapping) -> Vec<Mapping>3263809052SJethro Beekman fn sub(mut self, rhs: Mapping) -> Vec<Mapping> {
3363809052SJethro Beekman self.push(rhs.into());
3463809052SJethro Beekman self
3563809052SJethro Beekman }
3663809052SJethro Beekman }
3763809052SJethro Beekman
main()3863809052SJethro Beekman fn main() {
3964dd1634SJethro Beekman let ver=rustc_version::version_meta();
4064dd1634SJethro Beekman
41*8f253772SJeremy Soller let io_commit="b9adc3327ec7d2820ab2db8bb3cc2a0196a8375d";
42*8f253772SJeremy Soller /*
433ad99dcdSJethro Beekman let io_commit=match env::var("CORE_IO_COMMIT") {
443ad99dcdSJethro Beekman Ok(c) => c,
453ad99dcdSJethro Beekman Err(env::VarError::NotUnicode(_)) => panic!("Invalid commit specified in CORE_IO_COMMIT"),
463ad99dcdSJethro Beekman Err(env::VarError::NotPresent) => {
4763809052SJethro Beekman let mappings=include!("mapping.rs");
4863809052SJethro Beekman
4964dd1634SJethro Beekman let compiler=ver.commit_hash.expect("Couldn't determine compiler version");
503ad99dcdSJethro Beekman mappings.iter().find(|&&Mapping(elem,_)|elem==compiler).expect("Unknown compiler version, upgrade core_io?").1.to_owned()
513ad99dcdSJethro Beekman }
523ad99dcdSJethro Beekman };
53*8f253772SJeremy Soller */
5463809052SJethro Beekman
55*8f253772SJeremy Soller if ver.commit_date.as_ref().map_or(true,|d| &**d>="2018-01-01") {
562da6c763SJethro Beekman println!("cargo:rustc-cfg=core_memchr");
572da6c763SJethro Beekman }
582da6c763SJethro Beekman
59*8f253772SJeremy Soller if ver.commit_date.as_ref().map_or(true,|d| &**d>="2017-06-15") {
602da6c763SJethro Beekman println!("cargo:rustc-cfg=no_collections");
612da6c763SJethro Beekman }
622da6c763SJethro Beekman
6364dd1634SJethro Beekman if ver.commit_date.as_ref().map_or(false,|d| &**d<"2016-12-15") {
6464dd1634SJethro Beekman println!("cargo:rustc-cfg=rustc_unicode");
6564dd1634SJethro Beekman } else if ver.commit_date.as_ref().map_or(false,|d| &**d<"2017-03-03") {
6664dd1634SJethro Beekman println!("cargo:rustc-cfg=std_unicode");
6764dd1634SJethro Beekman }
6864dd1634SJethro Beekman
6963809052SJethro Beekman let mut dest_path=PathBuf::from(env::var_os("OUT_DIR").unwrap());
7063809052SJethro Beekman dest_path.push("io.rs");
7163809052SJethro Beekman let mut f=File::create(&dest_path).unwrap();
7263809052SJethro Beekman
7363809052SJethro Beekman let mut target_path=PathBuf::from(env::var_os("CARGO_MANIFEST_DIR").unwrap());
7463809052SJethro Beekman target_path.push("src");
7563809052SJethro Beekman target_path.push(io_commit);
7663809052SJethro Beekman target_path.push("mod.rs");
7763809052SJethro Beekman
7863809052SJethro Beekman f.write_all(br#"#[path=""#).unwrap();
79636656c1SRobin Lambertz f.write_all(target_path.into_os_string().into_string().unwrap().replace("\\", "\\\\").as_bytes()).unwrap();
8063809052SJethro Beekman f.write_all(br#""] mod io;"#).unwrap();
8163809052SJethro Beekman }
82