autocxx_build/
lib.rs

1// Copyright 2020 Google LLC
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
6// option. This file may not be copied, modified, or distributed
7// except according to those terms.
8
9#![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}