|
| 1 | +from __future__ import annotations |
1 | 2 |
|
2 | 3 | import glob |
3 | 4 | import os |
4 | 5 | import shutil |
5 | 6 | import subprocess |
6 | 7 | import sys |
| 8 | +from typing import List, Tuple |
7 | 9 |
|
8 | | -def cleanup(out): |
9 | | - ret = '' |
10 | | - for s in out.decode('utf-8').split('\n'): |
11 | | - if len(s) > 1 and s[0] == '#': |
| 10 | + |
| 11 | +def cleanup(out: str) -> str: |
| 12 | + parts = [] |
| 13 | + for line in out.decode('utf-8').splitlines(): |
| 14 | + if len(line) > 1 and line[0] == '#': |
12 | 15 | continue |
13 | | - s = "".join(s.split()) |
14 | | - ret = ret + s |
15 | | - return ret |
| 16 | + parts.append("".join(line.split())) |
| 17 | + return "".join(parts) |
16 | 18 |
|
17 | 19 |
|
18 | 20 | # Check for required compilers and exit if any are missing |
@@ -93,15 +95,22 @@ def cleanup(out): |
93 | 95 | ] |
94 | 96 |
|
95 | 97 |
|
96 | | -def run(compiler_executable, compiler_args): |
97 | | - """Execute a compiler command and capture its output.""" |
98 | | - compiler_cmd = [compiler_executable] |
99 | | - compiler_cmd.extend(compiler_args) |
100 | | - p = subprocess.Popen(compiler_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) |
101 | | - comm = p.communicate() |
102 | | - exit_code = p.returncode |
103 | | - output = cleanup(comm[0]) |
104 | | - error = comm[0].decode('utf-8').strip() |
| 98 | +def run(compiler_executable: str, compiler_args: List[str]) -> Tuple[int, str, str]: |
| 99 | + """Execute a compiler command and capture its exit code, stdout, and stderr.""" |
| 100 | + cmd = [compiler_executable, *compiler_args] |
| 101 | + |
| 102 | + try: |
| 103 | + with subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) as process: |
| 104 | + stdout, stderr = process.communicate() |
| 105 | + exit_code = process.returncode |
| 106 | + except FileNotFoundError as e: |
| 107 | + # Compiler not found |
| 108 | + return (127, "", f"{e}") |
| 109 | + except Exception as e: |
| 110 | + return (1, "", f"{e}") |
| 111 | + |
| 112 | + output = cleanup(stdout) # bytes -> str via cleanup |
| 113 | + error = (stderr or b"").decode("utf-8", errors="replace").strip() |
105 | 114 | return (exit_code, output, error) |
106 | 115 |
|
107 | 116 |
|
|
0 commit comments