1use std::{
2 env,
3 path::PathBuf,
4 process::{self, Command},
5};
6
7fn main() {
8 generate_dispatch_bindings();
9 compile_context_predicate_parser();
10 compile_metal_shaders();
11 generate_shader_bindings();
12}
13
14fn generate_dispatch_bindings() {
15 println!("cargo:rustc-link-lib=framework=System");
16 println!("cargo:rerun-if-changed=src/platform/mac/dispatch.h");
17
18 let bindings = bindgen::Builder::default()
19 .header("src/platform/mac/dispatch.h")
20 .allowlist_var("_dispatch_main_q")
21 .allowlist_function("dispatch_async_f")
22 .parse_callbacks(Box::new(bindgen::CargoCallbacks))
23 .layout_tests(false)
24 .generate()
25 .expect("unable to generate bindings");
26
27 let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
28 bindings
29 .write_to_file(out_path.join("dispatch_sys.rs"))
30 .expect("couldn't write dispatch bindings");
31}
32
33fn compile_context_predicate_parser() {
34 let dir = PathBuf::from("./grammars/context-predicate/src");
35 let parser_c = dir.join("parser.c");
36
37 println!("cargo:rerun-if-changed={}", &parser_c.to_str().unwrap());
38 cc::Build::new()
39 .include(&dir)
40 .file(parser_c)
41 .compile("tree_sitter_context_predicate");
42}
43
44const SHADER_HEADER_PATH: &str = "./src/platform/mac/shaders/shaders.h";
45
46fn compile_metal_shaders() {
47 let shader_path = "./src/platform/mac/shaders/shaders.metal";
48 let air_output_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("shaders.air");
49 let metallib_output_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("shaders.metallib");
50
51 println!("cargo:rerun-if-changed={}", SHADER_HEADER_PATH);
52 println!("cargo:rerun-if-changed={}", shader_path);
53
54 let output = Command::new("xcrun")
55 .args(&[
56 "-sdk",
57 "macosx",
58 "metal",
59 "-gline-tables-only",
60 "-mmacosx-version-min=10.15.7",
61 "-MO",
62 "-c",
63 shader_path,
64 "-o",
65 ])
66 .arg(&air_output_path)
67 .output()
68 .unwrap();
69
70 if !output.status.success() {
71 eprintln!(
72 "metal shader compilation failed:\n{}",
73 String::from_utf8_lossy(&output.stderr)
74 );
75 process::exit(1);
76 }
77
78 let output = Command::new("xcrun")
79 .args(&["-sdk", "macosx", "metallib"])
80 .arg(air_output_path)
81 .arg("-o")
82 .arg(metallib_output_path)
83 .output()
84 .unwrap();
85
86 if !output.status.success() {
87 eprintln!(
88 "metallib compilation failed:\n{}",
89 String::from_utf8_lossy(&output.stderr)
90 );
91 process::exit(1);
92 }
93}
94
95fn generate_shader_bindings() {
96 let bindings = bindgen::Builder::default()
97 .header(SHADER_HEADER_PATH)
98 .allowlist_type("GPUI.*")
99 .parse_callbacks(Box::new(bindgen::CargoCallbacks))
100 .layout_tests(false)
101 .generate()
102 .expect("unable to generate bindings");
103
104 let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
105 bindings
106 .write_to_file(out_path.join("shaders.rs"))
107 .expect("couldn't write shader bindings");
108}