oo_bindgen/cli/builders/
c.rs

1use crate::backend::PlatformLocations;
2
3use std::path::PathBuf;
4use std::process::Command;
5
6use crate::cli::{BindingBuilder, BindingBuilderSettings};
7
8pub(crate) struct CBindingBuilder {
9    settings: BindingBuilderSettings,
10    platforms: PlatformLocations,
11    extra_files: Vec<PathBuf>,
12}
13
14impl CBindingBuilder {
15    pub(crate) fn new(
16        settings: BindingBuilderSettings,
17        platforms: PlatformLocations,
18        extra_files: &[PathBuf],
19    ) -> Self {
20        Self {
21            settings,
22            platforms,
23            extra_files: extra_files.to_vec(),
24        }
25    }
26
27    fn output_dir(&self) -> PathBuf {
28        self.settings.destination_path.join("c/generated")
29    }
30
31    fn build_dir(&self) -> PathBuf {
32        self.settings.destination_path.join("c/build")
33    }
34}
35
36impl BindingBuilder for CBindingBuilder {
37    fn name() -> &'static str {
38        "c"
39    }
40
41    fn generate(&mut self, _is_packaging: bool, generate_doxygen: bool) {
42        let config = crate::backend::c::CBindgenConfig {
43            output_dir: self.output_dir(),
44            ffi_name: self.settings.ffi_name,
45            extra_files: self.extra_files.clone(),
46            platform_locations: self.platforms.clone(),
47            generate_doxygen,
48        };
49
50        crate::backend::c::generate_c_package(&self.settings.library, &config)
51            .expect("failed to package C lib");
52    }
53
54    fn build(&mut self) {
55        // Clear/create build directory
56        let build_dir = self.build_dir();
57        if build_dir.exists() {
58            std::fs::remove_dir_all(&build_dir).unwrap();
59        }
60        std::fs::create_dir_all(&build_dir).unwrap();
61
62        // CMake configure
63        let result = Command::new("cmake")
64            .current_dir(&build_dir)
65            .arg("..")
66            .status()
67            .expect("cmake failed");
68        assert!(result.success());
69
70        // CMake build
71        let result = Command::new("cmake")
72            .current_dir(&build_dir)
73            .args(["--build", ".", "--config", "Debug"])
74            .status()
75            .expect("cmake failed");
76        assert!(result.success());
77    }
78
79    fn test(&mut self) {
80        // Run unit tests
81        let result = Command::new("ctest")
82            .current_dir(self.build_dir())
83            .args([".", "-C", "Debug"])
84            .status()
85            .unwrap();
86        assert!(result.success());
87    }
88
89    fn package(&mut self) {
90        // Already done in generate
91    }
92}