# 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')