aboutsummaryrefslogtreecommitdiffstats
path: root/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'build.rs')
-rw-r--r--build.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..d152090
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,52 @@
1fn main() {
2 // espeak-rs-sys builds espeak-ng from source but misses linking sonic
3 // and the speechPlayer audio_object symbols. piper-rs only uses
4 // espeak-ng for phonemization (never audio output), so stub implementations
5 // satisfy the linker without providing real functionality.
6
7 let out_dir = std::env::var("OUT_DIR").unwrap();
8 let stubs_c = format!("{}/tts_stubs.c", out_dir);
9 let stubs_o = format!("{}/tts_stubs.o", out_dir);
10 let stubs_a = format!("{}/libtts_stubs.a", out_dir);
11
12 std::fs::write(
13 &stubs_c,
14 r#"
15#include <stddef.h>
16typedef void* sonicStream;
17sonicStream sonicCreateStream(int sampleRate, int channels) { return NULL; }
18void sonicDestroyStream(sonicStream s) {}
19void sonicSetSpeed(sonicStream s, float speed) {}
20float sonicGetSpeed(sonicStream s) { return 1.0f; }
21void sonicWriteShortToStream(sonicStream s, const short *samples, int n) {}
22int sonicReadShortFromStream(sonicStream s, short *samples, int n) { return 0; }
23void sonicFlushStream(sonicStream s) {}
24typedef void* audio_object_t;
25int audio_object_open(audio_object_t o) { return 0; }
26int audio_object_write(audio_object_t o, const void *buf, size_t n) { return (int)n; }
27int audio_object_close(audio_object_t o) { return 0; }
28int audio_object_flush(audio_object_t o) { return 0; }
29int audio_object_drain(audio_object_t o) { return 0; }
30const char* audio_object_strerror(audio_object_t o, int err) { return "stub"; }
31audio_object_t create_audio_device_object(void* d, const char* device) { return NULL; }
32"#,
33 )
34 .expect("write stubs");
35
36 // cc -c
37 let status = std::process::Command::new("cc")
38 .args(["-c", &stubs_c, "-o", &stubs_o])
39 .status()
40 .expect("run cc");
41 assert!(status.success(), "cc -c failed");
42
43 // ar rcs
44 let status = std::process::Command::new("ar")
45 .args(["rcs", &stubs_a, &stubs_o])
46 .status()
47 .expect("run ar");
48 assert!(status.success(), "ar rcs failed");
49
50 println!("cargo:rustc-link-search=native={}", out_dir);
51 println!("cargo:rustc-link-lib=static=tts_stubs");
52}