use std::{ env, path::{Path, PathBuf}, }; fn main() { let soundio_build_output = build_and_link_soundio(); generate_rust_binding(&soundio_build_output); } fn build_and_link_soundio() -> PathBuf { let soundio_build_output = cmake::Config::new("./libsoundio/") .define("BUILD_STATIC_LIBS", "ON") .define("BUILD_DYNAMIC_LIBS", "OFF") .define("BUILD_EXAMPLE_PROGRAMS", "OFF") .define("BUILD_TESTS", "OFF") .define("ENABLE_JACK", "ON") .define("ENABLE_PULSEAUDIO", "ON") .define("ENABLE_ALSA", "ON") .define("ENABLE_COREAUDIO", "ON") .define("ENABLE_WASAPI", "ON") .build(); println!( "cargo:rustc-link-search=native={}", soundio_build_output.join("lib").display() ); println!("cargo:rustc-link-lib=static=soundio"); #[cfg(target_os = "macos")] link_macos_system_frameworks(); soundio_build_output } #[cfg(target_os = "macos")] fn link_macos_system_frameworks() { println!("cargo:rustc-link-lib=framework=AudioToolbox"); println!("cargo:rustc-link-lib=framework=CoreAudio"); println!("cargo:rustc-link-lib=framework=CoreFoundation"); } fn generate_rust_binding(build_output: &Path) { let umbrella_header_path = build_output .join("include") .join("soundio") .join("soundio.h"); println!("cargo:rerun-if-changed={}", umbrella_header_path.display()); let bindings = bindgen::Builder::default() .header(umbrella_header_path.to_str().unwrap()) .parse_callbacks(Box::new(bindgen::CargoCallbacks)) .generate() .expect("Failed to generate bindings"); let out_path = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap()) .join("src") .join("bindings.rs"); if let Err(error) = bindings.write_to_file(out_path) { println!("cargo:warning={}", error); } }