| Index: infra/bots/recipe_modules/flavor/gn_android_flavor.py
|
| diff --git a/infra/bots/recipe_modules/flavor/gn_android_flavor.py b/infra/bots/recipe_modules/flavor/gn_android_flavor.py
|
| index 4cbaab38a6e10cfc6b1e1a89d863749a6db5d0e1..2142f10eabf62fa4922583c2a855d54b44177cd8 100644
|
| --- a/infra/bots/recipe_modules/flavor/gn_android_flavor.py
|
| +++ b/infra/bots/recipe_modules/flavor/gn_android_flavor.py
|
| @@ -3,16 +3,37 @@
|
| # found in the LICENSE file.
|
|
|
| import default_flavor
|
| +import subprocess
|
|
|
| """GN Android flavor utils, used for building Skia for Android with GN."""
|
| class GNAndroidFlavorUtils(default_flavor.DefaultFlavorUtils):
|
| + def __init__(self, m):
|
| + super(GNAndroidFlavorUtils, self).__init__(m)
|
| + self._ever_ran_adb = False
|
| +
|
| + prefix = '/data/local/tmp/'
|
| + self.device_dirs = default_flavor.DeviceDirs(
|
| + dm_dir = prefix + 'dm_out',
|
| + perf_data_dir = prefix + 'perf',
|
| + resource_dir = prefix + 'resources',
|
| + images_dir = prefix + 'images',
|
| + skp_dir = prefix + 'skps',
|
| + svg_dir = prefix + 'svgs',
|
| + tmp_dir = prefix + 'tmp')
|
| +
|
| def supported(self):
|
| return 'GN_Android' == self.m.vars.builder_cfg.get('extra_config', '')
|
|
|
| - def _run(self, title, cmd):
|
| - path = self.m.vars.default_env['PATH']
|
| - self.m.vars.default_env = {'PATH': path}
|
| - self.m.run(self.m.step, title, cmd=cmd, cwd=self.m.vars.skia_dir, env={})
|
| + def _run(self, title, *cmd, **kwargs):
|
| + self.m.vars.default_env = {k: v for (k,v)
|
| + in self.m.vars.default_env.iteritems()
|
| + if k in ['PATH']}
|
| + return self.m.run(self.m.step, title, cmd=list(cmd),
|
| + cwd=self.m.vars.skia_dir, env={}, **kwargs)
|
| +
|
| + def _adb(self, title, *cmd, **kwargs):
|
| + self._ever_ran_adb = True
|
| + return self._run(title, 'adb', *cmd, **kwargs)
|
|
|
| def compile(self, unused_target, **kwargs):
|
| compiler = self.m.vars.builder_cfg.get('compiler')
|
| @@ -31,6 +52,80 @@ class GNAndroidFlavorUtils(default_flavor.DefaultFlavorUtils):
|
| 'target_cpu': quote(target_arch),
|
| }.iteritems()))
|
|
|
| - self._run('fetch-gn', [self.m.vars.skia_dir.join('bin', 'fetch-gn')])
|
| - self._run('gn gen', ['gn', 'gen', self.out_dir, '--args=' + gn_args])
|
| - self._run('ninja', ['ninja', '-C', self.out_dir])
|
| + self._run('fetch-gn', self.m.vars.skia_dir.join('bin', 'fetch-gn'))
|
| + self._run('gn gen', 'gn', 'gen', self.out_dir, '--args=' + gn_args)
|
| + self._run('ninja', 'ninja', '-C', self.out_dir)
|
| +
|
| + def install(self):
|
| + self._adb('reboot', 'reboot')
|
| + self._adb('wait for device', 'wait-for-usb-device')
|
| + self._adb('TEMPORARY clear /data/local/tmp',
|
| + 'shell', 'rm', '-rf', '/data/local/tmp/*')
|
| + self._adb('mkdir /data/local/tmp/resources',
|
| + 'shell', 'mkdir', '-p', '/data/local/tmp/resources')
|
| +
|
| + def cleanup_steps(self):
|
| + if self._ever_ran_adb:
|
| + self._adb('TEMPORARY clear /data/local/tmp',
|
| + 'shell', 'rm', '-rf', '/data/local/tmp/*')
|
| + self._adb('TEMPORARY reboot', 'reboot')
|
| + self._adb('kill adb server', 'kill-server')
|
| +
|
| + def step(self, name, cmd, env=None, **kwargs):
|
| + app = self.m.vars.skia_out.join(self.m.vars.configuration, cmd[0])
|
| + self._adb('push %s' % cmd[0],
|
| + 'push', app, '/data/local/tmp')
|
| +
|
| + sh = '%s.sh' % cmd[0]
|
| + self.m.run.writefile(self.m.vars.tmp_dir.join(sh),
|
| + 'set -x; /data/local/tmp/%s; echo $? >/data/local/tmp/rc' %
|
| + subprocess.list2cmdline(map(str, cmd)))
|
| + self._adb('push %s' % sh,
|
| + 'push', self.m.vars.tmp_dir.join(sh), '/data/local/tmp')
|
| +
|
| + self._adb('clear log', 'logcat', '-c')
|
| + self._adb(cmd[0], 'shell', 'sh', '/data/local/tmp/' + sh)
|
| + self._adb('dump log ', 'logcat', '-d')
|
| +
|
| + self.m.python.inline('check %s rc' % cmd[0], """
|
| + import subprocess
|
| + import sys
|
| + sys.exit(int(subprocess.check_output(['adb', 'shell', 'cat',
|
| + '/data/local/tmp/rc'])))
|
| + """)
|
| +
|
| + def copy_file_to_device(self, host, device):
|
| + self._adb('push %s %s' % (host, device), 'push', host, device)
|
| +
|
| + def copy_directory_contents_to_device(self, host, device):
|
| + # Copy the tree, avoiding hidden directories and resolving symlinks.
|
| + self.m.python.inline('push %s/* %s' % (host, device), """
|
| + import os
|
| + import subprocess
|
| + import sys
|
| + host = sys.argv[1]
|
| + device = sys.argv[2]
|
| + for d, _, fs in os.walk(host):
|
| + p = os.path.relpath(d, host)
|
| + if p != '.' and p.startswith('.'):
|
| + continue
|
| + for f in fs:
|
| + print os.path.join(p,f)
|
| + subprocess.check_call(['adb', 'push',
|
| + os.path.realpath(os.path.join(host, p, f)),
|
| + os.path.join(device, p, f)])
|
| + """, args=[host, device], cwd=self.m.vars.skia_dir)
|
| +
|
| + def copy_directory_contents_to_host(self, device, host):
|
| + self._adb('pull %s %s' % (device, host), 'pull', device, host)
|
| +
|
| + def read_file_on_device(self, path):
|
| + return self._adb('read %s' % path,
|
| + 'shell', 'cat', path, stdout=self.m.raw_io.output()).stdout
|
| +
|
| + def remove_file_on_device(self, path):
|
| + self._adb('rm %s' % path, 'shell', 'rm', '-f', path)
|
| +
|
| + def create_clean_device_dir(self, path):
|
| + self._adb('rm %s' % path, 'shell', 'rm', '-rf', path)
|
| + self._adb('mkdir %s' % path, 'shell', 'mkdir', '-p', path)
|
|
|