library-ify nasm helper
parent
ed0f9119f4
commit
ae2720c826
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "buildtools"
|
||||
version = "0.1.0"
|
||||
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "buildtools"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
@ -0,0 +1,109 @@
|
||||
use std::{ffi::OsString, path::{Path, PathBuf}, process::Command};
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct Nasm {
|
||||
bin_path: PathBuf,
|
||||
includes: Vec<PathBuf>,
|
||||
warnings: Vec<String>,
|
||||
werror: bool,
|
||||
out_format: Option<String>,
|
||||
}
|
||||
|
||||
impl Nasm {
|
||||
pub fn new(bin_path: PathBuf) -> Self {
|
||||
Self {
|
||||
bin_path,
|
||||
includes: Vec::new(),
|
||||
warnings: Vec::new(),
|
||||
werror: true,
|
||||
out_format: None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn include<T, I>(self, paths: I) -> Self
|
||||
where
|
||||
PathBuf: From<T>,
|
||||
I: IntoIterator<Item = T>,
|
||||
{
|
||||
Self {
|
||||
includes: {
|
||||
let mut updated_includes = self.includes;
|
||||
updated_includes.extend(paths.into_iter().map(From::from));
|
||||
updated_includes
|
||||
},
|
||||
..self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn warnings<T, I>(self, warnings: I) -> Self
|
||||
where
|
||||
String: From<T>,
|
||||
I: IntoIterator<Item = T>,
|
||||
{
|
||||
Self {
|
||||
warnings: {
|
||||
let mut updated_warnings = self.warnings;
|
||||
updated_warnings.extend(warnings.into_iter().map(From::from));
|
||||
updated_warnings
|
||||
},
|
||||
..self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn werror(self, enabled: bool) -> Self {
|
||||
Self {
|
||||
werror: enabled,
|
||||
..self
|
||||
}
|
||||
}
|
||||
|
||||
pub fn out_format<T>(self, format: T) -> Self
|
||||
where
|
||||
String: From<T>,
|
||||
{
|
||||
Self {
|
||||
out_format: Some(From::from(format)),
|
||||
..self
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: make this generic over sources & path types
|
||||
pub fn to_cmd(&self, output: &Path, sources: &[&Path]) -> Command {
|
||||
let mut cmd = self.to_common_cmd();
|
||||
|
||||
cmd
|
||||
.arg("-o")
|
||||
.arg(output)
|
||||
.args(sources);
|
||||
|
||||
cmd
|
||||
}
|
||||
|
||||
fn to_common_cmd(&self) -> Command {
|
||||
let mut cmd = Command::new(&self.bin_path);
|
||||
|
||||
if let Some(format) = self.out_format.as_ref() {
|
||||
cmd.arg("-f").arg(format);
|
||||
}
|
||||
|
||||
for include in self.includes.iter() {
|
||||
let mut buf = OsString::new();
|
||||
buf.push("-I");
|
||||
buf.push(include);
|
||||
cmd.arg(buf);
|
||||
}
|
||||
|
||||
for warning in self.warnings.iter() {
|
||||
let mut buf = OsString::new();
|
||||
buf.push("-w+");
|
||||
buf.push(warning);
|
||||
cmd.arg(buf);
|
||||
}
|
||||
|
||||
if self.werror {
|
||||
cmd.arg("-werror");
|
||||
}
|
||||
|
||||
cmd
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue