leafbuild/buildsys-utils/toolchain/c/
c_clang.rs1use 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}