corge/
extension_manager.rs

1use 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        /* fixme */
63        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}