1#![forbid(unsafe_code)]
10
11use autocxx_engine::{BuilderContext, RebuildDependencyRecorder};
12use indexmap::set::IndexSet as HashSet;
13use std::{io::Write, sync::Mutex};
14
15pub use autocxx_engine::{BuilderError, BuilderSuccess};
16
17pub type Builder = autocxx_engine::Builder<'static, CargoBuilderContext>;
18
19#[doc(hidden)]
20pub struct CargoBuilderContext;
21
22impl BuilderContext for CargoBuilderContext {
23 fn setup() {
24 let _ = env_logger::builder()
25 .format(|buf, record| writeln!(buf, "cargo:warning=MESSAGE:{}", record.args()))
26 .try_init();
27 }
28 fn get_dependency_recorder() -> Option<Box<dyn RebuildDependencyRecorder>> {
29 Some(Box::new(CargoRebuildDependencyRecorder::new()))
30 }
31}
32
33#[derive(Debug)]
34struct CargoRebuildDependencyRecorder {
35 printed_already: Mutex<HashSet<String>>,
36}
37
38impl CargoRebuildDependencyRecorder {
39 fn new() -> Self {
40 Self {
41 printed_already: Mutex::new(HashSet::new()),
42 }
43 }
44}
45
46impl RebuildDependencyRecorder for CargoRebuildDependencyRecorder {
47 fn record_header_file_dependency(&self, filename: &str) {
48 let mut already = self.printed_already.lock().unwrap();
49 if already.insert(filename.into()) {
50 println!("cargo:rerun-if-changed={filename}");
51 }
52 }
53}