corge/
extension_manager.rs1use std::process::Command;
2use std::str::FromStr;
3use target_lexicon::{OperatingSystem, Triple};
4use crate::std_command_ext::ExecuteCommand;
5
6#[derive(Debug)]
7pub enum Extension {
8 Object,
9 Executable,
10 StaticLibrary,
11 DynamicLibrary,
12}
13
14impl Extension {
15 fn linux_extension(&self) -> Option<String> {
16 match self {
17 Extension::Object => Some("o".to_string()),
18 Extension::Executable => None,
19 Extension::StaticLibrary => Some("a".to_string()),
20 Extension::DynamicLibrary => Some("so".to_string())
21 }
22 }
23 fn macos_extension(&self) -> Option<String> {
24 match self {
25 Extension::Object => Some("o".to_string()),
26 Extension::Executable => None,
27 Extension::StaticLibrary => Some("a".to_string()),
28 Extension::DynamicLibrary => Some("dylib".to_string())
29 }
30 }
31 fn windows_extension(&self) -> Option<String> {
32 match self {
33 Extension::Object => Some("obj".to_string()),
34 Extension::Executable => Some("exe".to_string()),
35 Extension::StaticLibrary => Some("lib".to_string()),
36 Extension::DynamicLibrary => Some("dll".to_string())
37 }
38 }
39
40 fn for_triple(&self, target_triple: &str) -> Option<String> {
41 let operating_system =
42 match Triple::from_str(target_triple) {
43 Ok(triple) => triple.operating_system,
44 Err(_) => OperatingSystem::Linux
45 };
46
47 match operating_system {
48 OperatingSystem::Linux => self.linux_extension(),
49 OperatingSystem::MacOSX(_) => self.macos_extension(),
50 OperatingSystem::Windows => self.windows_extension(),
51 _ => self.linux_extension(),
52 }
53 }
54
55 fn for_compiler(&self, compiler: &str) -> Option<String> {
56 log::info!("{:?}. Getting extention for compiler: {}", &self, compiler);
57 let stdout = Command::new(compiler)
58 .arg("-dumpmachine")
59 .execute(true)
60 .expect(format!("Failed to execute: {} -dumpmachine", compiler).as_str());
61
62 let triple = stdout.strip_suffix("\n").unwrap().to_string();
64
65 self.for_triple(&triple)
66 }
67
68 pub fn file_name(&self, name: &str, compiler: &str) -> String {
69 let extension = match self.for_compiler(compiler) {
70 None => "",
71 Some(extension) => &format!(".{}", extension),
72 };
73
74 match self {
75 Extension::Object => format!("{}{}", name, extension),
76 Extension::Executable => format!("{}{}", name, extension),
77 Extension::StaticLibrary => format!("lib{}{}", name, extension),
78 Extension::DynamicLibrary => format!("lib{}{}", name, extension),
79 }
80 }
81}