#!/usr/bin/env python
#
# Copyright 2016 Google Inc.
#
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import os
import subprocess
import sys
from flavor import android_flavor
from flavor import chromeos_flavor
from flavor import cmake_flavor
from flavor import coverage_flavor
from flavor import default_flavor
from flavor import ios_flavor
from flavor import valgrind_flavor
from flavor import xsan_flavor
CONFIG_COVERAGE = 'Coverage'
CONFIG_DEBUG = 'Debug'
CONFIG_RELEASE = 'Release'
VALID_CONFIGS = (CONFIG_COVERAGE, CONFIG_DEBUG, CONFIG_RELEASE)
GM_ACTUAL_FILENAME = 'actual-results.json'
GM_EXPECTATIONS_FILENAME = 'expected-results.json'
GM_IGNORE_TESTS_FILENAME = 'ignored-tests.txt'
GS_GM_BUCKET = 'chromium-skia-gm'
GS_SUMMARIES_BUCKET = 'chromium-skia-gm-summaries'
SKIA_REPO = 'https://skia.googlesource.com/skia.git'
INFRA_REPO = 'https://skia.googlesource.com/buildbot.git'
SERVICE_ACCOUNT_FILE = 'service-account-skia.json'
SERVICE_ACCOUNT_INTERNAL_FILE = 'service-account-skia-internal.json'
def is_android(bot_cfg):
"""Determine whether the given bot is an Android bot."""
return ('Android' in bot_cfg.get('extra_config', '') or
bot_cfg.get('os') == 'Android')
def is_chromeos(bot_cfg):
return ('CrOS' in bot_cfg.get('extra_config', '') or
bot_cfg.get('os') == 'ChromeOS')
def is_cmake(bot_cfg):
return 'CMake' in bot_cfg.get('extra_config', '')
def is_ios(bot_cfg):
return ('iOS' in bot_cfg.get('extra_config', '') or
bot_cfg.get('os') == 'iOS')
def is_valgrind(bot_cfg):
return 'Valgrind' in bot_cfg.get('extra_config', '')
def is_xsan(bot_cfg):
return (bot_cfg.get('extra_config') == 'ASAN' or
bot_cfg.get('extra_config') == 'MSAN' or
bot_cfg.get('extra_config') == 'TSAN')
class BotInfo(object):
def __init__(self, bot_name, slave_name, out_dir):
"""Initialize the bot, given its name.
Assumes that CWD is the directory containing this file.
"""
self.name = bot_name
self.slave_name = slave_name
self.skia_dir = os.path.abspath(os.path.join(
os.path.dirname(os.path.realpath(__file__)),
os.pardir, os.pardir))
os.chdir(self.skia_dir)
self.build_dir = os.path.abspath(os.path.join(self.skia_dir, os.pardir))
self.out_dir = out_dir
self.spec = self.get_bot_spec(bot_name)
self.configuration = self.spec['configuration']
self.default_env = {
'SKIA_OUT': self.out_dir,
'BUILDTYPE': self.configuration,
'PATH': os.environ['PATH'],
}
self.default_env.update(self.spec['env'])
self.build_targets = [str(t) for t in self.spec['build_targets']]
self.bot_cfg = self.spec['builder_cfg']
self.is_trybot = self.bot_cfg['is_trybot']
self.upload_dm_results = self.spec['upload_dm_results']
self.upload_perf_results = self.spec['upload_perf_results']
self.dm_flags = self.spec['dm_flags']
self.nanobench_flags = self.spec['nanobench_flags']
self._ccache = None
self._checked_for_ccache = False
self.flavor = self.get_flavor(self.bot_cfg)
@property
def ccache(self):
if not self._checked_for_ccache:
self._checked_for_ccache = True
if sys.platform != 'win32':
try:
result = subprocess.check_output(['which', 'ccache'])
self._ccache = result.rstrip()
except subprocess.CalledProcessError:
pass
return self._ccache
def get_bot_spec(self, bot_name):
"""Retrieve the bot spec for this bot."""
sys.path.append(self.skia_dir)
from tools import buildbot_spec
return buildbot_spec.get_builder_spec(bot_name)
def get_flavor(self, bot_cfg):
"""Return a flavor utils object specific to the given bot."""
if is_android(bot_cfg):
return android_flavor.AndroidFlavorUtils(self)
elif is_chromeos(bot_cfg):
return chromeos_flavor.ChromeOSFlavorUtils(self)
elif is_cmake(bot_cfg):
return cmake_flavor.CMakeFlavorUtils(self)
elif is_ios(bot_cfg):
return ios_flavor.iOSFlavorUtils(self)
elif is_valgrind(bot_cfg):
return valgrind_flavor.ValgrindFlavorUtils(self)
elif is_xsan(bot_cfg):
return xsan_flavor.XSanFlavorUtils(self)
elif bot_cfg.get('configuration') == CONFIG_COVERAGE:
return coverage_flavor.CoverageFlavorUtils(self)
else:
return default_flavor.DefaultFlavorUtils(self)
def run(self, cmd, env=None, cwd=None):
_env = {}
_env.update(self.default_env)
_env.update(env or {})
cwd = cwd or self.skia_dir
print '============'
print 'CMD: %s' % cmd
print 'CWD: %s' % cwd
print 'ENV: %s' % _env
print '============'
subprocess.check_call(cmd, env=_env, cwd=cwd)