blob: 01dbc0d58f3a9f9b781f12e6e00083d6c95e9ffb [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;
Joel Galenson794f2012021-06-16 09:55:23 -07004use std::path::{self, Path};
Jason Macnakbbac34b2020-03-25 01:28:44 +00005
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";
Joel Galenson794f2012021-06-16 09:55:23 -070030 content += " compile_error! {\n";
31 content += " \"this macro does not support >64 nested macro invocations\"\n";
32 content += " }\n";
Haibo Huang58095de2020-07-10 20:23:47 -070033 content += " };\n";
34 content += "}\n";
Jason Macnakbbac34b2020-03-25 01:28:44 +000035
Haibo Huang58095de2020-07-10 20:23:47 -070036 let content = content.as_bytes();
37 let out_dir = env::var("OUT_DIR").unwrap();
38 let ref dest_path = Path::new(&out_dir).join("count.rs");
39
40 // Avoid bumping filetime if content is up to date. Possibly related to
41 // https://github.com/dtolnay/proc-macro-hack/issues/56 ...?
42 if fs::read(dest_path)
43 .map(|existing| existing != content)
44 .unwrap_or(true)
45 {
46 fs::write(dest_path, content).unwrap();
47 }
Joel Galenson794f2012021-06-16 09:55:23 -070048
49 println!("cargo:rustc-env=PATH_SEPARATOR={}", path::MAIN_SEPARATOR);
Jason Macnakbbac34b2020-03-25 01:28:44 +000050}