blob: 4e126e66b869fe18e793d2dcdf0f75a44ef86bf8 [file] [log] [blame]
George Karpenkovbf92c442017-10-24 23:52:48 +00001import os
George Karpenkovbf92c442017-10-24 23:52:48 +00002import sys
3
Valeriy Savchenko7cebfa42020-05-22 11:59:39 +03004from subprocess import CalledProcessError, check_call
5from typing import List, IO, Optional
George Karpenkovbf92c442017-10-24 23:52:48 +00006
Valeriy Savchenkoc98872e2020-05-14 13:31:01 +03007
Valeriy Savchenko7cebfa42020-05-22 11:59:39 +03008def which(command: str, paths: Optional[str] = None) -> Optional[str]:
George Karpenkovbf92c442017-10-24 23:52:48 +00009 """which(command, [paths]) - Look up the given command in the paths string
10 (or the PATH environment variable, if unspecified)."""
11
12 if paths is None:
13 paths = os.environ.get('PATH', '')
14
15 # Check for absolute match first.
16 if os.path.exists(command):
17 return command
18
19 # Would be nice if Python had a lib function for this.
20 if not paths:
21 paths = os.defpath
22
23 # Get suffixes to search.
24 # On Cygwin, 'PATHEXT' may exist but it should not be used.
25 if os.pathsep == ';':
26 pathext = os.environ.get('PATHEXT', '').split(';')
27 else:
28 pathext = ['']
29
30 # Search the paths...
31 for path in paths.split(os.pathsep):
32 for ext in pathext:
33 p = os.path.join(path, command + ext)
34 if os.path.exists(p):
35 return p
36
37 return None
38
39
Valeriy Savchenko7cebfa42020-05-22 11:59:39 +030040def has_no_extension(file_name: str) -> bool:
41 root, ext = os.path.splitext(file_name)
42 return ext == ""
George Karpenkovbf92c442017-10-24 23:52:48 +000043
44
Valeriy Savchenko7cebfa42020-05-22 11:59:39 +030045def is_valid_single_input_file(file_name: str) -> bool:
46 root, ext = os.path.splitext(file_name)
47 return ext in (".i", ".ii", ".c", ".cpp", ".m", "")
George Karpenkovbf92c442017-10-24 23:52:48 +000048
49
Valeriy Savchenko7cebfa42020-05-22 11:59:39 +030050def run_script(script_path: str, build_log_file: IO, cwd: str,
51 out=sys.stdout, err=sys.stderr, verbose: int = 0):
George Karpenkovbf92c442017-10-24 23:52:48 +000052 """
53 Run the provided script if it exists.
54 """
Valeriy Savchenko7cebfa42020-05-22 11:59:39 +030055 if os.path.exists(script_path):
George Karpenkovbf92c442017-10-24 23:52:48 +000056 try:
Valeriy Savchenko7cebfa42020-05-22 11:59:39 +030057 if verbose == 1:
58 out.write(f" Executing: {script_path}\n")
59
60 check_call(f"chmod +x '{script_path}'", cwd=cwd,
61 stderr=build_log_file,
62 stdout=build_log_file,
George Karpenkovbf92c442017-10-24 23:52:48 +000063 shell=True)
Valeriy Savchenko7cebfa42020-05-22 11:59:39 +030064
65 check_call(f"'{script_path}'", cwd=cwd,
66 stderr=build_log_file,
67 stdout=build_log_file,
George Karpenkovbf92c442017-10-24 23:52:48 +000068 shell=True)
Valeriy Savchenko7cebfa42020-05-22 11:59:39 +030069
70 except CalledProcessError:
71 err.write(f"Error: Running {script_path} failed. "
72 f"See {build_log_file.name} for details.\n")
George Karpenkovbf92c442017-10-24 23:52:48 +000073 sys.exit(-1)
74
75
Valeriy Savchenko7cebfa42020-05-22 11:59:39 +030076def is_comment_csv_line(entries: List[str]) -> bool:
George Karpenkovbf92c442017-10-24 23:52:48 +000077 """
78 Treat CSV lines starting with a '#' as a comment.
79 """
Valeriy Savchenko7cebfa42020-05-22 11:59:39 +030080 return len(entries) > 0 and entries[0].startswith("#")