1# Copyright 2014 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5
6# pylint: disable=W0201
7
8
9"""Default flavor utils class, used for desktop builders."""
10
11
12import json
13
14
15WIN_TOOLCHAIN_DIR = 't'
16
17
18class DeviceDirs(object):
19  def __init__(self,
20               dm_dir,
21               perf_data_dir,
22               resource_dir,
23               images_dir,
24               skp_dir,
25               svg_dir,
26               tmp_dir):
27    self._dm_dir = dm_dir
28    self._perf_data_dir = perf_data_dir
29    self._resource_dir = resource_dir
30    self._images_dir = images_dir
31    self._skp_dir = skp_dir
32    self._svg_dir = svg_dir
33    self._tmp_dir = tmp_dir
34
35  @property
36  def dm_dir(self):
37    """Where DM writes."""
38    return self._dm_dir
39
40  @property
41  def perf_data_dir(self):
42    return self._perf_data_dir
43
44  @property
45  def resource_dir(self):
46    return self._resource_dir
47
48  @property
49  def images_dir(self):
50    return self._images_dir
51
52  @property
53  def skp_dir(self):
54    """Holds SKP files that are consumed by RenderSKPs and BenchPictures."""
55    return self._skp_dir
56
57  @property
58  def svg_dir(self):
59    return self._svg_dir
60
61  @property
62  def tmp_dir(self):
63    return self._tmp_dir
64
65
66class DefaultFlavorUtils(object):
67  """Utilities to be used by build steps.
68
69  The methods in this class define how certain high-level functions should
70  work. Each build step flavor should correspond to a subclass of
71  DefaultFlavorUtils which may override any of these functions as appropriate
72  for that flavor.
73
74  For example, the AndroidFlavorUtils will override the functions for
75  copying files between the host and Android device, as well as the
76  'step' function, so that commands may be run through ADB.
77  """
78  def __init__(self, m):
79    self.m = m
80    self._chrome_path = None
81    self._win_toolchain_dir = self.m.vars.slave_dir.join(WIN_TOOLCHAIN_DIR)
82    win_toolchain_asset_path = self.m.vars.infrabots_dir.join(
83        'assets', 'win_toolchain', 'VERSION')
84    if not self.m.path.exists(win_toolchain_asset_path):
85      self._win_toolchain_dir = self.m.vars.slave_dir
86
87  def copy_extra_build_products(self, swarming_out_dir):
88    pass
89
90  @property
91  def out_dir(self):
92    """Flavor-specific out directory."""
93    return self.m.vars.skia_out.join(self.m.vars.configuration)
94
95  def device_path_join(self, *args):
96    """Like os.path.join(), but for paths on a connected device."""
97    return self.m.path.join(*args)
98
99  def copy_directory_contents_to_device(self, host_dir, device_dir):
100    """Like shutil.copytree(), but for copying to a connected device."""
101    # For "normal" builders who don't have an attached device, we expect
102    # host_dir and device_dir to be the same.
103    if str(host_dir) != str(device_dir):
104      raise ValueError('For builders who do not have attached devices, copying '
105                       'from host to device is undefined and only allowed if '
106                       'host_path and device_path are the same (%s vs %s).' % (
107                       str(host_dir), str(device_dir)))  # pragma: no cover
108
109  def copy_directory_contents_to_host(self, device_dir, host_dir):
110    """Like shutil.copytree(), but for copying from a connected device."""
111    # For "normal" builders who don't have an attached device, we expect
112    # host_dir and device_dir to be the same.
113    if str(host_dir) != str(device_dir):
114      raise ValueError('For builders who do not have attached devices, copying '
115                       'from device to host is undefined and only allowed if '
116                       'host_path and device_path are the same (%s vs %s).' % (
117                       str(host_dir), str(device_dir)))  # pragma: no cover
118
119  def copy_file_to_device(self, host_path, device_path):
120    """Like shutil.copyfile, but for copying to a connected device."""
121    # For "normal" builders who don't have an attached device, we expect
122    # host_dir and device_dir to be the same.
123    if str(host_path) != str(device_path):  # pragma: no cover
124      raise ValueError('For builders who do not have attached devices, copying '
125                       'from host to device is undefined and only allowed if '
126                       'host_path and device_path are the same (%s vs %s).' % (
127                       str(host_path), str(device_path)))
128
129  def create_clean_device_dir(self, path):
130    """Like shutil.rmtree() + os.makedirs(), but on a connected device."""
131    self.create_clean_host_dir(path)
132
133  def create_clean_host_dir(self, path):
134    """Convenience function for creating a clean directory."""
135    self.m.run.rmtree(path)
136    self.m.file.makedirs(
137        self.m.path.basename(path), path, infra_step=True)
138
139  def install(self):
140    """Run device-specific installation steps."""
141    self.device_dirs = DeviceDirs(
142        dm_dir=self.m.vars.dm_dir,
143        perf_data_dir=self.m.vars.perf_data_dir,
144        resource_dir=self.m.vars.resource_dir,
145        images_dir=self.m.vars.images_dir,
146        skp_dir=self.m.vars.local_skp_dir,
147        svg_dir=self.m.vars.local_svg_dir,
148        tmp_dir=self.m.vars.tmp_dir)
149
150  def cleanup_steps(self):
151    """Run any device-specific cleanup steps."""
152    pass
153