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