9"""Default flavor, used for running code on desktop machines."""
15WIN_TOOLCHAIN_DIR =
't'
21DeviceDirs = collections.namedtuple(
22 'DeviceDirs', [
'bin_dir',
'dm_dir',
'perf_data_dir',
'resource_dir',
'images_dir',
'fonts_dir',
23 'lotties_dir',
'skp_dir',
'svg_dir',
'mskp_dir',
'tmp_dir',
'texttraces_dir'])
42 bin_dir=self.
m.vars.build_dir,
43 dm_dir=self.
m.vars.swarming_out_dir,
44 perf_data_dir=self.
m.vars.swarming_out_dir,
45 resource_dir=self.
m.path[
'start_dir'].join(
'skia',
'resources'),
46 images_dir=self.
m.path[
'start_dir'].join(
'skimage'),
47 fonts_dir=self.
m.path[
'start_dir'].join(
'googlefonts_testdata',
'data'),
48 lotties_dir=self.
m.path[
'start_dir'].join(
'lottie-samples'),
49 skp_dir=self.
m.path[
'start_dir'].join(
'skp'),
50 svg_dir=self.
m.path[
'start_dir'].join(
'svg'),
51 mskp_dir=self.
m.path[
'start_dir'].join(
'mskp'),
52 tmp_dir=self.
m.vars.tmp_dir,
53 texttraces_dir=self.
m.path[
'start_dir'].join(
'text_blob_traces'))
57 """Like os.path.join(), but for paths on a connected device."""
58 return self.
m.path.join(*args)
61 """Like shutil.copytree(), but for copying to a connected device."""
64 if str(host_dir) != str(device_dir):
65 raise ValueError(
'For builders who do not have attached devices, copying '
66 'from host to device is undefined and only allowed if '
67 'host_path and device_path are the same (%s vs %s).' % (
68 str(host_dir), str(device_dir)))
71 """Like shutil.copytree(), but for copying from a connected device."""
74 if str(host_dir) != str(device_dir):
75 raise ValueError(
'For builders who do not have attached devices, copying '
76 'from device to host is undefined and only allowed if '
77 'host_path and device_path are the same (%s vs %s).' % (
78 str(host_dir), str(device_dir)))
81 """Like shutil.copyfile, but for copying to a connected device."""
84 if str(host_path) != str(device_path):
85 raise ValueError(
'For builders who do not have attached devices, copying '
86 'from host to device is undefined and only allowed if '
87 'host_path and device_path are the same (%s vs %s).' % (
88 str(host_path), str(device_path)))
91 """Like shutil.rmtree() + os.makedirs(), but on a connected device."""
95 """Convenience function for creating a clean directory."""
96 self.
m.run.rmtree(path)
97 self.
m.file.ensure_directory(
98 'makedirs %s' % self.
m.path.basename(path), path)
101 """Reads the specified file."""
102 return self.
m.file.read_text(
'read %s' % path, path)
105 """Removes the specified file."""
106 return self.
m.file.remove(
'remove %s' % path, path)
109 """Run device-specific installation steps."""
113 """Run any device-specific cleanup steps."""
116 def _run(self, title, cmd, infra_step=False, **kwargs):
117 return self.m.
run(self.m.step, title, cmd=cmd,
118 infra_step=infra_step, **kwargs)
120 def _py(self, title, script, infra_step=True, args=()):
121 return self.
m.
run(self.
m.step, title, cmd=[
'python3', script]+args,
122 infra_step=infra_step)
124 def step(self, name, cmd, **unused_kwargs):
126 cmd = [app] + cmd[1:]
127 env = self.
m.context.env
131 workdir = self.
m.vars.workdir
132 clang_linux = workdir.join(
'clang_linux')
133 extra_tokens = self.
m.vars.extra_tokens
135 if self.
m.vars.is_linux:
136 if (self.
m.vars.builder_cfg.get(
'cpu_or_gpu',
'') ==
'GPU'
137 and 'Intel' in self.
m.vars.builder_cfg.get(
'cpu_or_gpu_value',
'')):
138 dri_path = workdir.join(
'mesa_intel_driver_linux')
139 if (
'IntelIrisXe' in self.
m.vars.builder_cfg.get(
'cpu_or_gpu_value',
'')):
140 dri_path = workdir.join(
'mesa_intel_driver_linux_22')
141 ld_library_path.append(dri_path)
142 env[
'LIBGL_DRIVERS_PATH'] = str(dri_path)
143 env[
'VK_ICD_FILENAMES'] = str(dri_path.join(
'intel_icd.x86_64.json'))
145 if 'Vulkan' in extra_tokens:
146 env[
'VULKAN_SDK'] = str(workdir.join(
'linux_vulkan_sdk'))
147 path.append(workdir.join(
'linux_vulkan_sdk',
'bin'))
148 ld_library_path.append(workdir.join(
'linux_vulkan_sdk',
'lib'))
153 if (self.
m.vars.builder_cfg.get(
'configuration',
'') !=
'Release' and
154 'ASAN' not in extra_tokens
and
155 'TSAN' not in extra_tokens):
156 env[
'VK_LAYER_PATH'] = str(workdir.join(
157 'linux_vulkan_sdk',
'etc',
'vulkan',
'explicit_layer.d'))
159 if 'SwiftShader' in extra_tokens:
160 ld_library_path.append(self.
host_dirs.bin_dir.join(
'swiftshader_out'))
163 if 'MSAN' in extra_tokens:
164 ld_library_path.append(clang_linux.join(
'msan'))
165 elif 'TSAN' in extra_tokens:
166 ld_library_path.append(clang_linux.join(
'tsan'))
168 if any(
'SAN' in t
for t
in extra_tokens):
170 path.append(clang_linux.join(
'bin'))
175 ld_library_path.append(clang_linux.join(
'lib',
'x86_64-unknown-linux-gnu'))
177 if 'ASAN' in extra_tokens:
178 os = self.
m.vars.builder_cfg.get(
'os',
'')
179 if 'Mac' in os
or 'Win' in os:
181 env[
'ASAN_OPTIONS'] =
'symbolize=1'
183 env[
'ASAN_OPTIONS'] =
'symbolize=1 detect_leaks=1'
184 env[
'ASAN_SYMBOLIZER_PATH'] = clang_linux.join(
'bin',
'llvm-symbolizer')
185 env[
'LSAN_OPTIONS'] =
'symbolize=1 print_suppressions=1'
186 env[
'UBSAN_OPTIONS'] =
'symbolize=1 print_stacktrace=1'
190 if name ==
'dm' and 'Vulkan' in extra_tokens:
191 env[
'ASAN_OPTIONS'] +=
' fast_unwind_on_malloc=0'
192 env[
'LSAN_OPTIONS'] +=
' fast_unwind_on_malloc=0'
194 if 'TSAN' in extra_tokens:
197 env[
'TSAN_OPTIONS'] =
'report_signal_unsafe=0'
199 if 'Coverage' in extra_tokens:
203 profname =
'%s.profraw' % self.
m.vars.builder_cfg.get(
'test_filter',
'o')
204 env[
'LLVM_PROFILE_FILE'] = self.
m.path.join(self.
m.vars.swarming_out_dir,
207 if 'DWriteCore' in extra_tokens:
208 path.append(workdir.join(
'dwritecore',
'bin'))
211 env[
'PATH'] = self.
m.path.pathsep.join(
212 [
'%(PATH)s'] + [
'%s' % p
for p
in path])
214 env[
'LD_LIBRARY_PATH'] = self.
m.path.pathsep.join(
215 '%s' % p
for p
in ld_library_path)
217 to_symbolize = [
'dm',
'nanobench']
218 if name
in to_symbolize
and self.
m.vars.is_linux:
221 args = [workdir] + [str(x)
for x
in cmd]
222 with self.
m.context(cwd=self.
m.path[
'start_dir'].join(
'skia'), env=env):
223 self.
_py(
'symbolized %s' % name,
224 self.
module.resource(
'symbolize_stack_trace.py'),
227 elif 'Win' in self.
m.vars.builder_cfg.get(
'os',
''):
228 with self.
m.context(env=env):
229 wrapped_cmd = [
'powershell',
'-ExecutionPolicy',
'Unrestricted',
231 self.
module.resource(
'win_run_and_check_log.ps1')] + cmd
232 self.
_run(name, wrapped_cmd)
234 with self.
m.context(env=env):
read_file_on_device(self, path, **kwargs)
create_clean_host_dir(self, path)
_py(self, title, script, infra_step=True, args=())
copy_directory_contents_to_device(self, host_dir, device_dir)
copy_directory_contents_to_host(self, device_dir, host_dir)
copy_file_to_device(self, host_path, device_path)
_run(self, title, cmd, infra_step=False, **kwargs)
device_path_join(self, *args)
__init__(self, module, app_name)
create_clean_device_dir(self, path)
step(self, name, cmd, **unused_kwargs)