|
| 1 | +use std::env; |
| 2 | +use std::path::PathBuf; |
| 3 | + |
1 | 4 | fn main() { |
2 | | - let src_dir = std::path::Path::new("src"); |
| 5 | + // tree-sitter-generate produces parser.c, grammar.json, node-types.json, |
| 6 | + // and src/tree_sitter/*.h headers from grammar.js. We write them into |
| 7 | + // OUT_DIR so the build is sandbox-friendly and we don't litter the source |
| 8 | + // tree. |
| 9 | + let crate_dir: PathBuf = env::var("CARGO_MANIFEST_DIR").unwrap().into(); |
| 10 | + let out_dir: PathBuf = env::var("OUT_DIR").unwrap().into(); |
| 11 | + let grammar_js = crate_dir.join("grammar.js"); |
| 12 | + |
| 13 | + tree_sitter_generate::generate_parser_in_directory( |
| 14 | + &crate_dir, |
| 15 | + Some(&out_dir), |
| 16 | + Some(&grammar_js), |
| 17 | + tree_sitter_generate::ABI_VERSION_MAX, |
| 18 | + None, |
| 19 | + None, |
| 20 | + true, |
| 21 | + tree_sitter_generate::OptLevel::default(), |
| 22 | + ) |
| 23 | + .expect("failed to generate tree-sitter-swift parser"); |
3 | 24 |
|
4 | 25 | let mut c_config = cc::Build::new(); |
5 | | - c_config.std("c11").include(src_dir); |
| 26 | + c_config |
| 27 | + .std("c11") |
| 28 | + .include(&out_dir) |
| 29 | + .include(out_dir.join("tree_sitter")); |
6 | 30 |
|
7 | 31 | #[cfg(target_env = "msvc")] |
8 | 32 | c_config.flag("-utf-8"); |
9 | 33 |
|
10 | | - let parser_path = src_dir.join("parser.c"); |
11 | | - c_config.file(&parser_path); |
12 | | - println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap()); |
| 34 | + c_config.file(out_dir.join("parser.c")); |
| 35 | + |
| 36 | + // scanner.c is hand-written and lives in the source tree. |
| 37 | + let scanner_path = crate_dir.join("src").join("scanner.c"); |
| 38 | + c_config.include(crate_dir.join("src")).file(&scanner_path); |
13 | 39 |
|
14 | | - let scanner_path = src_dir.join("scanner.c"); |
15 | | - c_config.file(&scanner_path); |
| 40 | + println!("cargo:rerun-if-changed={}", grammar_js.to_str().unwrap()); |
16 | 41 | println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap()); |
| 42 | + // Re-export OUT_DIR so consumers can include_str! the generated files. |
| 43 | + println!( |
| 44 | + "cargo:rustc-env=TREE_SITTER_SWIFT_OUT_DIR={}", |
| 45 | + out_dir.to_str().unwrap() |
| 46 | + ); |
17 | 47 |
|
18 | 48 | c_config.compile("tree-sitter-swift"); |
19 | 49 | } |
0 commit comments