xref: /relibc/core_io/build.rs (revision 8f253772c98389e8394eca99ba7ac72addf79dba)
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