build.rs

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