| 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); | 
 | } |