Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Tetragramm
GitHub Repository: Tetragramm/opencv
Path: blob/master/modules/ts/misc/run_utils.py
16339 views
1
#!/usr/bin/env python
2
import sys
3
import os
4
import platform
5
import re
6
import tempfile
7
import glob
8
import logging
9
import shutil
10
from subprocess import check_call, check_output, CalledProcessError, STDOUT
11
12
13
def initLogger():
14
logger = logging.getLogger("run.py")
15
logger.setLevel(logging.DEBUG)
16
ch = logging.StreamHandler(sys.stderr)
17
ch.setFormatter(logging.Formatter("%(message)s"))
18
logger.addHandler(ch)
19
return logger
20
21
22
log = initLogger()
23
hostos = os.name # 'nt', 'posix'
24
25
26
class Err(Exception):
27
def __init__(self, msg, *args):
28
self.msg = msg % args
29
30
31
def execute(cmd, silent=False, cwd=".", env=None):
32
try:
33
log.debug("Run: %s", cmd)
34
if env is not None:
35
for k in env:
36
log.debug(" Environ: %s=%s", k, env[k])
37
new_env = os.environ.copy()
38
new_env.update(env)
39
env = new_env
40
if silent:
41
return check_output(cmd, stderr=STDOUT, cwd=cwd, env=env).decode("latin-1")
42
else:
43
return check_call(cmd, cwd=cwd, env=env)
44
except CalledProcessError as e:
45
if silent:
46
log.debug("Process returned: %d", e.returncode)
47
return e.output.decode("latin-1")
48
else:
49
log.error("Process returned: %d", e.returncode)
50
return e.returncode
51
52
53
def isColorEnabled(args):
54
usercolor = [a for a in args if a.startswith("--gtest_color=")]
55
return len(usercolor) == 0 and sys.stdout.isatty() and hostos != "nt"
56
57
58
def getPlatformVersion():
59
mv = platform.mac_ver()
60
if mv[0]:
61
return "Darwin" + mv[0]
62
else:
63
wv = platform.win32_ver()
64
if wv[0]:
65
return "Windows" + wv[0]
66
else:
67
lv = platform.linux_distribution()
68
if lv[0]:
69
return lv[0] + lv[1]
70
return None
71
72
73
parse_patterns = (
74
{'name': "cmake_home", 'default': None, 'pattern': re.compile(r"^CMAKE_HOME_DIRECTORY:\w+=(.+)$")},
75
{'name': "opencv_home", 'default': None, 'pattern': re.compile(r"^OpenCV_SOURCE_DIR:\w+=(.+)$")},
76
{'name': "opencv_build", 'default': None, 'pattern': re.compile(r"^OpenCV_BINARY_DIR:\w+=(.+)$")},
77
{'name': "tests_dir", 'default': None, 'pattern': re.compile(r"^EXECUTABLE_OUTPUT_PATH:\w+=(.+)$")},
78
{'name': "build_type", 'default': "Release", 'pattern': re.compile(r"^CMAKE_BUILD_TYPE:\w+=(.*)$")},
79
{'name': "android_abi", 'default': None, 'pattern': re.compile(r"^ANDROID_ABI:\w+=(.*)$")},
80
{'name': "android_executable", 'default': None, 'pattern': re.compile(r"^ANDROID_EXECUTABLE:\w+=(.*android.*)$")},
81
{'name': "ant_executable", 'default': None, 'pattern': re.compile(r"^ANT_EXECUTABLE:\w+=(.*ant.*)$")},
82
{'name': "java_test_dir", 'default': None, 'pattern': re.compile(r"^OPENCV_JAVA_TEST_DIR:\w+=(.*)$")},
83
{'name': "is_x64", 'default': "OFF", 'pattern': re.compile(r"^CUDA_64_BIT_DEVICE_CODE:\w+=(ON)$")},
84
{'name': "cmake_generator", 'default': None, 'pattern': re.compile(r"^CMAKE_GENERATOR:\w+=(.+)$")},
85
{'name': "python2", 'default': None, 'pattern': re.compile(r"^BUILD_opencv_python2:\w+=(.*)$")},
86
{'name': "python3", 'default': None, 'pattern': re.compile(r"^BUILD_opencv_python3:\w+=(.*)$")},
87
)
88
89
90
class CMakeCache:
91
def __init__(self, cfg=None):
92
self.setDefaultAttrs()
93
self.main_modules = []
94
if cfg:
95
self.build_type = cfg
96
97
def setDummy(self, path):
98
self.tests_dir = os.path.normpath(path)
99
100
def read(self, path, fname):
101
rx = re.compile(r'^OPENCV_MODULE_opencv_(\w+)_LOCATION:INTERNAL=(.*)$')
102
module_paths = {} # name -> path
103
with open(fname, "rt") as cachefile:
104
for l in cachefile.readlines():
105
ll = l.strip()
106
if not ll or ll.startswith("#"):
107
continue
108
for p in parse_patterns:
109
match = p["pattern"].match(ll)
110
if match:
111
value = match.groups()[0]
112
if value and not value.endswith("-NOTFOUND"):
113
setattr(self, p["name"], value)
114
# log.debug("cache value: %s = %s", p["name"], value)
115
116
match = rx.search(ll)
117
if match:
118
module_paths[match.group(1)] = match.group(2)
119
120
if not self.tests_dir:
121
self.tests_dir = path
122
else:
123
rel = os.path.relpath(self.tests_dir, self.opencv_build)
124
self.tests_dir = os.path.join(path, rel)
125
self.tests_dir = os.path.normpath(self.tests_dir)
126
127
# fix VS test binary path (add Debug or Release)
128
if "Visual Studio" in self.cmake_generator:
129
self.tests_dir = os.path.join(self.tests_dir, self.build_type)
130
131
for module, path in module_paths.items():
132
rel = os.path.relpath(path, self.opencv_home)
133
if ".." not in rel:
134
self.main_modules.append(module)
135
136
def setDefaultAttrs(self):
137
for p in parse_patterns:
138
setattr(self, p["name"], p["default"])
139
140
def gatherTests(self, mask, isGood=None):
141
if self.tests_dir and os.path.isdir(self.tests_dir):
142
d = os.path.abspath(self.tests_dir)
143
files = glob.glob(os.path.join(d, mask))
144
if not self.getOS() == "android" and self.withJava():
145
files.append("java")
146
if self.withPython2():
147
files.append("python2")
148
if self.withPython3():
149
files.append("python3")
150
return [f for f in files if isGood(f)]
151
return []
152
153
def isMainModule(self, name):
154
return name in self.main_modules + ['python2', 'python3']
155
156
def withJava(self):
157
return self.ant_executable and self.java_test_dir and os.path.exists(self.java_test_dir)
158
159
def withPython2(self):
160
return self.python2 == 'ON'
161
162
def withPython3(self):
163
return self.python3 == 'ON'
164
165
def getOS(self):
166
if self.android_executable:
167
return "android"
168
else:
169
return hostos
170
171
172
class TempEnvDir:
173
def __init__(self, envname, prefix):
174
self.envname = envname
175
self.prefix = prefix
176
self.saved_name = None
177
self.new_name = None
178
179
def init(self):
180
self.saved_name = os.environ.get(self.envname)
181
self.new_name = tempfile.mkdtemp(prefix=self.prefix, dir=self.saved_name or None)
182
os.environ[self.envname] = self.new_name
183
184
def clean(self):
185
if self.saved_name:
186
os.environ[self.envname] = self.saved_name
187
else:
188
del os.environ[self.envname]
189
try:
190
shutil.rmtree(self.new_name)
191
except:
192
pass
193
194
195
if __name__ == "__main__":
196
log.error("This is utility file, please execute run.py script")
197
198