168 lines
6.2 KiB
Python
168 lines
6.2 KiB
Python
# Copyright 2011 Google Inc. All Rights Reserved.
|
|
|
|
__author__ = 'kbaclawski@google.com (Krystian Baclawski)'
|
|
|
|
import os.path
|
|
import time
|
|
|
|
from automation.clients.helper import jobs
|
|
from automation.clients.helper import perforce
|
|
from automation.common import command as cmd
|
|
from automation.common import job
|
|
|
|
|
|
class JobsFactory(object):
|
|
|
|
def __init__(self):
|
|
self.commands = CommandsFactory()
|
|
|
|
def CheckoutCrosstool(self, target):
|
|
command = self.commands.CheckoutCrosstool()
|
|
new_job = jobs.CreateLinuxJob('CheckoutCrosstool(%s)' % target, command)
|
|
checkout_dir_dep = job.FolderDependency(new_job,
|
|
CommandsFactory.CHECKOUT_DIR)
|
|
manifests_dir_dep = job.FolderDependency(
|
|
new_job, os.path.join(self.commands.buildit_path, target), 'manifests')
|
|
return new_job, checkout_dir_dep, manifests_dir_dep
|
|
|
|
def BuildRelease(self, checkout_dir, target):
|
|
command = self.commands.BuildRelease(target)
|
|
new_job = jobs.CreateLinuxJob('BuildRelease(%s)' % target, command)
|
|
new_job.DependsOnFolder(checkout_dir)
|
|
build_tree_dep = job.FolderDependency(new_job,
|
|
self.commands.buildit_work_dir_path)
|
|
return new_job, build_tree_dep
|
|
|
|
def RunTests(self, checkout_dir, build_tree_dir, target, board, component):
|
|
command = self.commands.RunTests(target, board, component)
|
|
new_job = jobs.CreateLinuxJob('RunTests(%s, %s, %s)' %
|
|
(target, component, board), command)
|
|
new_job.DependsOnFolder(checkout_dir)
|
|
new_job.DependsOnFolder(build_tree_dir)
|
|
testrun_dir_dep = job.FolderDependency(
|
|
new_job, self.commands.dejagnu_output_path, board)
|
|
return new_job, testrun_dir_dep
|
|
|
|
def GenerateReport(self, testrun_dirs, manifests_dir, target, boards):
|
|
command = self.commands.GenerateReport(boards)
|
|
new_job = jobs.CreateLinuxJob('GenerateReport(%s)' % target, command)
|
|
new_job.DependsOnFolder(manifests_dir)
|
|
for testrun_dir in testrun_dirs:
|
|
new_job.DependsOnFolder(testrun_dir)
|
|
return new_job
|
|
|
|
|
|
class CommandsFactory(object):
|
|
CHECKOUT_DIR = 'crosstool-checkout-dir'
|
|
|
|
def __init__(self):
|
|
self.buildit_path = os.path.join(self.CHECKOUT_DIR, 'gcctools', 'crosstool',
|
|
'v15')
|
|
|
|
self.buildit_work_dir = 'buildit-tmp'
|
|
self.buildit_work_dir_path = os.path.join('$JOB_TMP', self.buildit_work_dir)
|
|
self.dejagnu_output_path = os.path.join(self.buildit_work_dir_path,
|
|
'dejagnu-output')
|
|
|
|
paths = {
|
|
'gcctools': [
|
|
'crosstool/v15/...', 'scripts/...'
|
|
],
|
|
'gcctools/google_vendor_src_branch': [
|
|
'binutils/binutils-2.21/...', 'gdb/gdb-7.2.x/...',
|
|
'zlib/zlib-1.2.3/...'
|
|
],
|
|
'gcctools/vendor_src': [
|
|
'gcc/google/gcc-4_6/...'
|
|
]
|
|
}
|
|
|
|
p4view = perforce.View('depot2',
|
|
perforce.PathMapping.ListFromPathDict(paths))
|
|
|
|
self.p4client = perforce.CommandsFactory(self.CHECKOUT_DIR, p4view)
|
|
|
|
def CheckoutCrosstool(self):
|
|
p4client = self.p4client
|
|
|
|
return p4client.SetupAndDo(p4client.Sync(),
|
|
p4client.SaveCurrentCLNumber('CLNUM'),
|
|
p4client.Remove())
|
|
|
|
def BuildRelease(self, target):
|
|
clnum_path = os.path.join('$JOB_TMP', self.CHECKOUT_DIR, 'CLNUM')
|
|
|
|
toolchain_root = os.path.join('/google/data/rw/projects/toolchains', target,
|
|
'unstable')
|
|
toolchain_path = os.path.join(toolchain_root, '${CLNUM}')
|
|
|
|
build_toolchain = cmd.Wrapper(
|
|
cmd.Chain(
|
|
cmd.MakeDir(toolchain_path),
|
|
cmd.Shell('buildit',
|
|
'--keep-work-dir',
|
|
'--build-type=release',
|
|
'--work-dir=%s' % self.buildit_work_dir_path,
|
|
'--results-dir=%s' % toolchain_path,
|
|
'--force-release=%s' % '${CLNUM}',
|
|
target,
|
|
path='.')),
|
|
cwd=self.buildit_path,
|
|
umask='0022',
|
|
env={'CLNUM': '$(< %s)' % clnum_path})
|
|
|
|
# remove all but 10 most recent directories
|
|
remove_old_toolchains_from_x20 = cmd.Wrapper(
|
|
cmd.Pipe(
|
|
cmd.Shell('ls', '-1', '-r'), cmd.Shell('sed', '-e', '1,10d'),
|
|
cmd.Shell('xargs', 'rm', '-r', '-f')),
|
|
cwd=toolchain_root)
|
|
|
|
return cmd.Chain(build_toolchain, remove_old_toolchains_from_x20)
|
|
|
|
def RunTests(self, target, board, component='gcc'):
|
|
dejagnu_flags = ['--outdir=%s' % self.dejagnu_output_path,
|
|
'--target_board=%s' % board]
|
|
|
|
# Look for {pandaboard,qemu}.exp files in
|
|
# //depot/google3/experimental/users/kbaclawski/dejagnu/boards
|
|
|
|
site_exp_file = os.path.join('/google/src/head/depot/google3',
|
|
'experimental/users/kbaclawski',
|
|
'dejagnu/site.exp')
|
|
|
|
build_dir_path = os.path.join(target, 'rpmbuild/BUILD/crosstool*-0.0',
|
|
'build-%s' % component)
|
|
|
|
run_dejagnu = cmd.Wrapper(
|
|
cmd.Chain(
|
|
cmd.MakeDir(self.dejagnu_output_path),
|
|
cmd.Shell('make',
|
|
'check',
|
|
'-k',
|
|
'-j $(grep -c processor /proc/cpuinfo)',
|
|
'RUNTESTFLAGS="%s"' % ' '.join(dejagnu_flags),
|
|
'DEJAGNU="%s"' % site_exp_file,
|
|
ignore_error=True)),
|
|
cwd=os.path.join(self.buildit_work_dir_path, build_dir_path),
|
|
env={'REMOTE_TMPDIR': 'job-$JOB_ID'})
|
|
|
|
save_results = cmd.Copy(self.dejagnu_output_path,
|
|
to_dir='$JOB_TMP/results',
|
|
recursive=True)
|
|
|
|
return cmd.Chain(run_dejagnu, save_results)
|
|
|
|
def GenerateReport(self, boards):
|
|
sumfiles = [os.path.join('$JOB_TMP', board, '*.sum') for board in boards]
|
|
|
|
return cmd.Wrapper(
|
|
cmd.Shell('dejagnu.sh',
|
|
'report',
|
|
'-m',
|
|
'$JOB_TMP/manifests/*.xfail',
|
|
'-o',
|
|
'$JOB_TMP/results/report.html',
|
|
*sumfiles,
|
|
path='.'),
|
|
cwd='$HOME/automation/clients/report')
|