diff options
author | syn <isaqtm@gmail.com> | 2020-01-16 14:46:18 +0300 |
---|---|---|
committer | syn <isaqtm@gmail.com> | 2020-01-16 14:46:18 +0300 |
commit | 263ade47ba4ca15d8166f5bbd220b6ab9dc091c8 (patch) | |
tree | 7e5db1fbf75a10378106cb1fd751269185ca4b63 | |
parent | e149c37f16b19236887afeadfbe774eabeb3510d (diff) | |
download | evr-263ade47ba4ca15d8166f5bbd220b6ab9dc091c8.tar.gz |
Add c/cxx support
-rw-r--r-- | src/backends/clang.rs | 73 |
1 files changed, 68 insertions, 5 deletions
diff --git a/src/backends/clang.rs b/src/backends/clang.rs index 5a0c37f..b5f9be8 100644 --- a/src/backends/clang.rs +++ b/src/backends/clang.rs @@ -1,12 +1,68 @@ use serde_derive::{ Serialize, Deserialize }; -use crate::backends::Backend; +use crate::backends::{ Backend, mk_tmp_dir }; use std::path::Path; +use std::process::Command; +use std::collections::hash_map::DefaultHasher; +use std::hash::{Hash, Hasher}; +use log::trace; + +type Result<T> = std::io::Result<T>; #[derive(Debug, Serialize, Deserialize, Default)] pub struct ClangBackend { - template: Option<String> + template: Option<String>, + + #[serde(default)] + args: Vec<String>, + + #[serde(default = "default_cc")] + cc: String, +} + + +fn default_cc() -> String { + "clang++".to_string() } + +fn get_binary_by_filename(fname: &Path) -> Result<std::path::PathBuf> { + let hashed_fname = { + let mut hasher = DefaultHasher::new(); + fname.hash(&mut hasher); + format!("{:x}", hasher.finish()) + }; + + Ok(mk_tmp_dir()?.join(hashed_fname)) +} + + +impl ClangBackend { + fn build(&self, fname: &Path) -> Result<std::path::PathBuf> { + let binary_fname = get_binary_by_filename(fname)?; + let get_mtime = |file| { + std::fs::metadata(file)? + .modified() + }; + let src_mod = get_mtime(fname); + let binary_mod = get_mtime(&binary_fname); + + if src_mod.is_err() || binary_mod.is_err() || src_mod.unwrap() > binary_mod.unwrap() { + let clang_status = Command::new(&self.cc) + .args(&self.args) + .arg("-x").arg("c++") + .arg(fname.as_os_str()) + .arg("-o").arg(&binary_fname) + .arg("-lstdc++") + .status(); + + trace!("{:#?}", clang_status); + } + + Ok(binary_fname) + } +} + + impl Backend for ClangBackend { fn get_template(&self) -> Option<&str> { match self.template { @@ -15,7 +71,14 @@ impl Backend for ClangBackend { } } - fn run(&self, _fname: &Path) -> std::io::Result<()> { - todo!(); + fn run(&self, fname: &Path) -> std::io::Result<()> { + let binary_fname = self.build(fname)?; + + Command::new(&binary_fname) + .status() + .map(|status| { + trace!("{:#?}", status); + () + }) } -}
\ No newline at end of file +} |