Skip to main content

leafbuild/buildsys-utils/toolchain/c/
c_clang.rs

1use crate::buildsys_utils::toolchain::flags::c::{CCompilationFlag, CFlag, CLinkFlag};
2use crate::buildsys_utils::toolchain::{CCompiler, CToolchain, CToolchainLinker, Toolchain};
3use std::path::{Path, PathBuf};
4
5pub struct CClangToolchain {
6    clang: CClang,
7}
8
9impl CClangToolchain {
10    pub(crate) fn new(clang_location: Box<Path>) -> Self {
11        Self {
12            clang: CClang {
13                path: clang_location.into_path_buf(),
14            },
15        }
16    }
17}
18
19impl Toolchain for CClangToolchain {
20    fn can_consume(filename: &str) -> bool {
21        filename.ends_with(".c") || filename.ends_with(".h")
22    }
23
24    fn can_compile(filename: &str) -> bool {
25        filename.ends_with(".c")
26    }
27}
28
29impl CToolchain for CClangToolchain {
30    type Compiler = CClang;
31    type Linker = CClang;
32
33    fn get_compiler(&self) -> &Self::Compiler {
34        &self.clang
35    }
36
37    fn get_linker(&self) -> &Self::Linker {
38        &self.clang
39    }
40}
41
42pub struct CClang {
43    path: PathBuf,
44}
45
46impl CCompiler for CClang {
47    fn get_flag(&self, flag: CCompilationFlag) -> String {
48        match flag {
49            CCompilationFlag::FromString { s } => s,
50            CCompilationFlag::CSTD { std } => format!("--std={}", std.as_str()),
51            CCompilationFlag::IncludeDir { include_dir } => format!("-I{}", include_dir),
52            CCompilationFlag::Flag { flag } => match flag {
53                CFlag::PositionIndependentCode => "-fPIC".into(),
54            },
55            CCompilationFlag::None => "".into(),
56        }
57    }
58
59    fn get_location(&self) -> &Path {
60        self.path.as_path()
61    }
62}
63
64impl CToolchainLinker for CClang {
65    fn get_linker_flag(&self, flag: CLinkFlag) -> String {
66        match flag {
67            CLinkFlag::FromString { s } => s,
68            CLinkFlag::LibLocation { s } => format!("-L{}", s),
69            CLinkFlag::Lib { name } => format!("-l{}", name),
70            CLinkFlag::LibShared => "--shared".into(),
71            CLinkFlag::None => "".into(),
72        }
73    }
74
75    fn get_location(&self) -> &Path {
76        self.path.as_path()
77    }
78}