|  | use std::env; | 
|  | use std::fs; | 
|  | use std::iter; | 
|  | use std::path::{self, Path}; | 
|  |  | 
|  | /* | 
|  | #[doc(hidden)] | 
|  | #[macro_export] | 
|  | macro_rules! count { | 
|  | () => { proc_macro_call_0!() }; | 
|  | (!) => { proc_macro_call_1!() }; | 
|  | (!!) => { proc_macro_call_2!() }; | 
|  | ... | 
|  | } | 
|  | */ | 
|  |  | 
|  | fn main() { | 
|  | // Tell Cargo not to rerun on src/lib.rs changes. | 
|  | println!("cargo:rerun-if-changed=build.rs"); | 
|  |  | 
|  | let mut content = String::new(); | 
|  | content += "#[doc(hidden)]\n"; | 
|  | content += "#[macro_export]\n"; | 
|  | content += "macro_rules! count {\n"; | 
|  | for i in 0..=64 { | 
|  | let bangs = iter::repeat("!").take(i).collect::<String>(); | 
|  | content += &format!("    ({}) => {{ proc_macro_call_{}!() }};\n", bangs, i); | 
|  | } | 
|  | content += "    ($(!)+) => {\n"; | 
|  | content += "        compile_error! {\n"; | 
|  | content += "            \"this macro does not support >64 nested macro invocations\"\n"; | 
|  | content += "        }\n"; | 
|  | content += "    };\n"; | 
|  | content += "}\n"; | 
|  |  | 
|  | let content = content.as_bytes(); | 
|  | let out_dir = env::var("OUT_DIR").unwrap(); | 
|  | let ref dest_path = Path::new(&out_dir).join("count.rs"); | 
|  |  | 
|  | // Avoid bumping filetime if content is up to date. Possibly related to | 
|  | // https://github.com/dtolnay/proc-macro-hack/issues/56 ...? | 
|  | if fs::read(dest_path) | 
|  | .map(|existing| existing != content) | 
|  | .unwrap_or(true) | 
|  | { | 
|  | fs::write(dest_path, content).unwrap(); | 
|  | } | 
|  |  | 
|  | println!("cargo:rustc-env=PATH_SEPARATOR={}", path::MAIN_SEPARATOR); | 
|  | } |