-
Notifications
You must be signed in to change notification settings - Fork 1
/
build.rs
98 lines (92 loc) · 3.49 KB
/
build.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
use std::{env, path::Path};
fn main() {
build_language("java", "languages/tree-sitter-java", false, false, false);
build_language("julia", "languages/tree-sitter-julia", true, false, true);
build_language("bash", "languages/tree-sitter-bash", true, true, false);
build_language("json", "languages/tree-sitter-json", false, false, false);
build_language("c", "languages/tree-sitter-c", false, false, false);
build_language("c-sharp", "languages/tree-sitter-c-sharp", true, false, true);
build_language("rust", "languages/tree-sitter-rust", true, false, true);
build_language(
"javascript",
"languages/tree-sitter-javascript",
true,
false,
true,
);
build_language(
"typescript",
"languages/tree-sitter-typescript/typescript",
true,
false,
true,
);
build_language(
"tsx",
"languages/tree-sitter-typescript/tsx",
true,
false,
true,
);
build_language("cpp", "languages/tree-sitter-cpp", true, true, false);
build_language("python", "languages/tree-sitter-python", true, true, false);
build_language("php", "languages/tree-sitter-php", true, true, false);
build_language("go", "languages/tree-sitter-go", false, false, false);
build_language("scala", "languages/tree-sitter-scala", true, false, true);
build_language(
"haskell",
"languages/tree-sitter-haskell",
true,
false,
true,
);
build_language("ruby", "languages/tree-sitter-ruby", true, true, false);
}
fn build_language(
language: &str,
path: &str,
has_scanner: bool,
is_scanner_cpp: bool,
is_parser_scanner: bool,
) {
let path = Path::new(path);
let src_dir = path.join("src");
let mut c_config = cc::Build::new();
c_config.include(&src_dir);
c_config
.flag_if_supported("-Wno-unused-parameter")
.flag_if_supported("-Wno-unused-but-set-variable")
.flag_if_supported("-Wno-trigraphs");
let parser_path = src_dir.join("parser.c");
c_config.file(&parser_path);
if is_parser_scanner {
let scanner_path = src_dir.join("scanner.c");
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
c_config.file(&scanner_path);
}
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
c_config.compile(&format!("{}-parser", language));
if has_scanner && !is_parser_scanner {
if is_scanner_cpp {
let mut cpp_config = cc::Build::new();
cpp_config.cpp(true);
cpp_config.include(&src_dir);
if env::var("TARGET").unwrap() == "wasm32-wasi" {
cpp_config.flag_if_supported("-fno-exceptions");
}
cpp_config
.flag_if_supported("-Wno-unused-parameter")
.flag_if_supported("-Wimplicit-fallthrough=0") // for php scanner.cc
.flag_if_supported("-Wno-unused-but-set-variable");
let scanner_path = src_dir.join("scanner.cc");
cpp_config.file(&scanner_path);
println!("cargo:rerun-if-changed={}", scanner_path.to_str().unwrap());
cpp_config.compile(&format!("{}-scanner", language));
} else {
let scanner_path = src_dir.join("scanner.c");
c_config.file(&scanner_path);
println!("cargo:rerun-if-changed={}", parser_path.to_str().unwrap());
c_config.compile(&format!("{}-scanner", language));
}
}
}