gpui: make build dependencies mac only

This removes bindgen and cbindgen from the dependency graph on non-macos
systems, improving compile times on those systems.

Signed-off-by: Niklas Wimmer <mail@nwimmer.me>
This commit is contained in:
Niklas Wimmer 2024-03-13 14:34:47 +01:00 committed by Piotr Osiewicz
parent 50ab60b9f0
commit 97f1d61a4a
2 changed files with 183 additions and 172 deletions

View file

@ -78,7 +78,7 @@ backtrace = "0.3"
collections = { workspace = true, features = ["test-support"] } collections = { workspace = true, features = ["test-support"] }
util = { workspace = true, features = ["test-support"] } util = { workspace = true, features = ["test-support"] }
[build-dependencies] [target.'cfg(target_os = "macos")'.build-dependencies]
bindgen = "0.65.1" bindgen = "0.65.1"
cbindgen = "0.26.0" cbindgen = "0.26.0"

View file

@ -1,29 +1,36 @@
#![cfg_attr(any(not(target_os = "macos"), feature = "macos-blade"), allow(unused))] #![cfg_attr(any(not(target_os = "macos"), feature = "macos-blade"), allow(unused))]
use std::{
env,
path::{Path, PathBuf},
};
use cbindgen::Config;
//TODO: consider generating shader code for WGSL //TODO: consider generating shader code for WGSL
//TODO: deprecate "runtime-shaders" and "macos-blade" //TODO: deprecate "runtime-shaders" and "macos-blade"
fn main() { fn main() {
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
generate_dispatch_bindings(); macos::build();
#[cfg(all(target_os = "macos", not(feature = "macos-blade")))]
let header_path = generate_shader_bindings();
#[cfg(all(target_os = "macos", not(feature = "macos-blade")))]
#[cfg(feature = "runtime_shaders")]
emit_stitched_shaders(&header_path);
#[cfg(all(target_os = "macos", not(feature = "macos-blade")))]
#[cfg(not(feature = "runtime_shaders"))]
compile_metal_shaders(&header_path);
} }
fn generate_dispatch_bindings() { #[cfg(target_os = "macos")]
mod macos {
use std::{
env,
path::{Path, PathBuf},
};
use cbindgen::Config;
pub(super) fn build() {
generate_dispatch_bindings();
#[cfg(not(feature = "macos-blade"))]
{
let header_path = generate_shader_bindings();
#[cfg(feature = "runtime_shaders")]
emit_stitched_shaders(&header_path);
#[cfg(not(feature = "runtime_shaders"))]
compile_metal_shaders(&header_path);
}
}
fn generate_dispatch_bindings() {
println!("cargo:rustc-link-lib=framework=System"); println!("cargo:rustc-link-lib=framework=System");
println!("cargo:rerun-if-changed=src/platform/mac/dispatch.h"); println!("cargo:rerun-if-changed=src/platform/mac/dispatch.h");
@ -54,9 +61,9 @@ fn generate_dispatch_bindings() {
bindings bindings
.write_to_file(out_path.join("dispatch_sys.rs")) .write_to_file(out_path.join("dispatch_sys.rs"))
.expect("couldn't write dispatch bindings"); .expect("couldn't write dispatch bindings");
} }
fn generate_shader_bindings() -> PathBuf { fn generate_shader_bindings() -> PathBuf {
let output_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("scene.h"); let output_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("scene.h");
let crate_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()); let crate_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
let mut config = Config::default(); let mut config = Config::default();
@ -114,18 +121,19 @@ fn generate_shader_bindings() -> PathBuf {
.write_to_file(&output_path); .write_to_file(&output_path);
output_path output_path
} }
/// To enable runtime compilation, we need to "stitch" the shaders file with the generated header /// To enable runtime compilation, we need to "stitch" the shaders file with the generated header
/// so that it is self-contained. /// so that it is self-contained.
#[cfg(feature = "runtime_shaders")] #[cfg(feature = "runtime_shaders")]
fn emit_stitched_shaders(header_path: &Path) { fn emit_stitched_shaders(header_path: &Path) {
use std::str::FromStr; use std::str::FromStr;
fn stitch_header(header: &Path, shader_path: &Path) -> std::io::Result<PathBuf> { fn stitch_header(header: &Path, shader_path: &Path) -> std::io::Result<PathBuf> {
let header_contents = std::fs::read_to_string(header)?; let header_contents = std::fs::read_to_string(header)?;
let shader_contents = std::fs::read_to_string(shader_path)?; let shader_contents = std::fs::read_to_string(shader_path)?;
let stitched_contents = format!("{header_contents}\n{shader_contents}"); let stitched_contents = format!("{header_contents}\n{shader_contents}");
let out_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("stitched_shaders.metal"); let out_path =
PathBuf::from(env::var("OUT_DIR").unwrap()).join("stitched_shaders.metal");
std::fs::write(&out_path, stitched_contents)?; std::fs::write(&out_path, stitched_contents)?;
Ok(out_path) Ok(out_path)
} }
@ -133,13 +141,15 @@ fn emit_stitched_shaders(header_path: &Path) {
let shader_path = PathBuf::from_str(shader_source_path).unwrap(); let shader_path = PathBuf::from_str(shader_source_path).unwrap();
stitch_header(header_path, &shader_path).unwrap(); stitch_header(header_path, &shader_path).unwrap();
println!("cargo:rerun-if-changed={}", &shader_source_path); println!("cargo:rerun-if-changed={}", &shader_source_path);
} }
#[cfg(not(feature = "runtime_shaders"))]
fn compile_metal_shaders(header_path: &Path) { #[cfg(not(feature = "runtime_shaders"))]
fn compile_metal_shaders(header_path: &Path) {
use std::process::{self, Command}; use std::process::{self, Command};
let shader_path = "./src/platform/mac/shaders.metal"; let shader_path = "./src/platform/mac/shaders.metal";
let air_output_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("shaders.air"); let air_output_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("shaders.air");
let metallib_output_path = PathBuf::from(env::var("OUT_DIR").unwrap()).join("shaders.metallib"); let metallib_output_path =
PathBuf::from(env::var("OUT_DIR").unwrap()).join("shaders.metallib");
println!("cargo:rerun-if-changed={}", shader_path); println!("cargo:rerun-if-changed={}", shader_path);
let output = Command::new("xcrun") let output = Command::new("xcrun")
@ -183,4 +193,5 @@ fn compile_metal_shaders(header_path: &Path) {
); );
process::exit(1); process::exit(1);
} }
}
} }