Last active 6 months ago

Basic Make Job Server with Named Pipes

main.rs Raw
1use std::error::Error;
2use std::num::NonZeroUsize;
3use std::process::Command;
4use std::thread::available_parallelism;
5
6use lexopt::{Arg, Parser, ValueExt};
7use jobslot::Client;
8
9fn main() -> Result<(), Box<dyn Error>> {
10 let mut command = None;
11 let mut jobs = available_parallelism().map_or(4, NonZeroUsize::get);
12
13 let mut parser = Parser::from_env();
14 while let Some(arg) = parser.next()? {
15 match arg {
16 Arg::Short('j') | Arg::Long("jobs") => {
17 jobs = parser.value()?.parse()?;
18 }
19 Arg::Short(_) | Arg::Long(_) => {
20 println!("Usage: build-server [-j|--jobs=JOBS] <command>");
21 return Ok(());
22 }
23 Arg::Value(cmd) => {
24 command = Some(cmd);
25 }
26 }
27
28 if command.is_some() {
29 break;
30 }
31 }
32
33 let Some(command) = command else {
34 println!("Usage: build-server [-j|--jobs=JOBS] <command>");
35 return Ok(());
36 };
37
38 let mut cmd = Command::new(command);
39
40 for arg in parser.raw_args()? {
41 cmd.arg(arg);
42 }
43
44 let client = Client::new_with_fifo(jobs)?;
45 let status = client.configure_make_and_run_with_fifo(&mut cmd, |cmd| cmd.status())?;
46
47 if status.success() {
48 Ok(())
49 } else {
50 Err("Error occurred while running command".into())
51 }
52}