Last active 6 months ago

Basic Make Job Server with Named Pipes

redfire's Avatar redfire revised this gist 6 months ago. Go to revision

1 file changed, 52 insertions

main.rs(file created)

@@ -0,0 +1,52 @@
1 + use std::error::Error;
2 + use std::num::NonZeroUsize;
3 + use std::process::Command;
4 + use std::thread::available_parallelism;
5 +
6 + use lexopt::{Arg, Parser, ValueExt};
7 + use jobslot::Client;
8 +
9 + fn 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 + }
Newer Older