blob: ef56f8e2e1359bb2e76e686686c7944617f92fef [file] [log] [blame]
Jason Macnakbbac34b2020-03-25 01:28:44 +00001use std::env;
Haibo Huang58095de2020-07-10 20:23:47 -07002use std::fs;
Jason Macnakbbac34b2020-03-25 01:28:44 +00003use std::iter;
4use std::path::Path;
5
6/*
7#[doc(hidden)]
8#[macro_export]
9macro_rules! count {
10 () => { proc_macro_call_0!() };
11 (!) => { proc_macro_call_1!() };
12 (!!) => { proc_macro_call_2!() };
13 ...
14}
15*/
16
17fn main() {
Haibo Huang58095de2020-07-10 20:23:47 -070018 // Tell Cargo not to rerun on src/lib.rs changes.
19 println!("cargo:rerun-if-changed=build.rs");
Jason Macnakbbac34b2020-03-25 01:28:44 +000020
21 let mut content = String::new();
Haibo Huang58095de2020-07-10 20:23:47 -070022 content += "#[doc(hidden)]\n";
23 content += "#[macro_export]\n";
24 content += "macro_rules! count {\n";
Jason Macnakbbac34b2020-03-25 01:28:44 +000025 for i in 0..=64 {
26 let bangs = iter::repeat("!").take(i).collect::<String>();
Haibo Huang58095de2020-07-10 20:23:47 -070027 content += &format!(" ({}) => {{ proc_macro_call_{}!() }};\n", bangs, i);
Jason Macnakbbac34b2020-03-25 01:28:44 +000028 }
Haibo Huang58095de2020-07-10 20:23:47 -070029 content += " ($(!)+) => {\n";
30 content += " compile_error! { \"this macro does not support >64 nested macro invocations\" }\n";
31 content += " };\n";
32 content += "}\n";
Jason Macnakbbac34b2020-03-25 01:28:44 +000033
Haibo Huang58095de2020-07-10 20:23:47 -070034 let content = content.as_bytes();
35 let out_dir = env::var("OUT_DIR").unwrap();
36 let ref dest_path = Path::new(&out_dir).join("count.rs");
37
38 // Avoid bumping filetime if content is up to date. Possibly related to
39 // https://github.com/dtolnay/proc-macro-hack/issues/56 ...?
40 if fs::read(dest_path)
41 .map(|existing| existing != content)
42 .unwrap_or(true)
43 {
44 fs::write(dest_path, content).unwrap();
45 }
Jason Macnakbbac34b2020-03-25 01:28:44 +000046}