-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathjobserver.py
executable file
·29 lines (23 loc) · 927 Bytes
/
jobserver.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python3
import argparse
import os
import subprocess
import tempfile
parser = argparse.ArgumentParser(description='Simple jobserver using FIFO')
parser.add_argument('jobs', type=int, help='Number of jobs')
parser.add_argument('command', help='Command to be run')
args = parser.parse_args()
with tempfile.TemporaryDirectory() as folder:
fifopath = os.path.join(folder, 'jobserver')
os.mkfifo(fifopath)
writefd = os.open(fifopath, os.O_RDWR)
written = os.write(writefd, b'+' * (args.jobs - 1))
assert written == args.jobs - 1
os.environ['MAKEFLAGS'] = f'--jobserver-auth=fifo:{fifopath}'
subprocess.run(args.command, shell=True)
readfd = os.open(fifopath, os.O_RDONLY | os.O_NONBLOCK)
read = os.read(readfd, args.jobs)
os.close(readfd)
os.close(writefd)
if len(read) != args.jobs - 1:
print(f'WARNING: expected {args.jobs - 1} tokens, got {len(read)}')