blob: 80154b25a1f515a1ea3812d71a24000f49828752 [file] [log] [blame]
kbaclawski5023b002013-02-15 20:18:02 +00001# Copyright 2011 Google Inc. All Rights Reserved.
2
3__author__ = 'kbaclawski@google.com (Krystian Baclawski)'
4
5import os.path
kbaclawskia71f1c72013-02-15 21:28:26 +00006import time
kbaclawski5023b002013-02-15 20:18:02 +00007
kbaclawski5023b002013-02-15 20:18:02 +00008from automation.clients.helper import jobs
9from automation.clients.helper import perforce
kbaclawskicc113a42013-02-15 21:20:07 +000010from automation.common import command as cmd
11from automation.common import job
kbaclawski5023b002013-02-15 20:18:02 +000012
13
14class JobsFactory(object):
Luis Lozanof2a3ef42015-12-15 13:49:30 -080015
kbaclawskif81c60d2013-02-15 21:15:08 +000016 def __init__(self):
17 self.commands = CommandsFactory()
kbaclawski5023b002013-02-15 20:18:02 +000018
kbaclawski23b34d42013-02-15 22:48:52 +000019 def CheckoutCrosstool(self, target):
kbaclawski5023b002013-02-15 20:18:02 +000020 command = self.commands.CheckoutCrosstool()
kbaclawski23b34d42013-02-15 22:48:52 +000021 new_job = jobs.CreateLinuxJob('CheckoutCrosstool(%s)' % target, command)
Luis Lozanof2a3ef42015-12-15 13:49:30 -080022 checkout_dir_dep = job.FolderDependency(new_job,
23 CommandsFactory.CHECKOUT_DIR)
kbaclawski23b34d42013-02-15 22:48:52 +000024 manifests_dir_dep = job.FolderDependency(
25 new_job, os.path.join(self.commands.buildit_path, target), 'manifests')
26 return new_job, checkout_dir_dep, manifests_dir_dep
kbaclawski5023b002013-02-15 20:18:02 +000027
28 def BuildRelease(self, checkout_dir, target):
29 command = self.commands.BuildRelease(target)
kbaclawskif81c60d2013-02-15 21:15:08 +000030 new_job = jobs.CreateLinuxJob('BuildRelease(%s)' % target, command)
kbaclawski5023b002013-02-15 20:18:02 +000031 new_job.DependsOnFolder(checkout_dir)
Luis Lozanof2a3ef42015-12-15 13:49:30 -080032 build_tree_dep = job.FolderDependency(new_job,
33 self.commands.buildit_work_dir_path)
kbaclawski23b34d42013-02-15 22:48:52 +000034 return new_job, build_tree_dep
kbaclawski5023b002013-02-15 20:18:02 +000035
kbaclawski569534a2013-02-15 22:49:27 +000036 def RunTests(self, checkout_dir, build_tree_dir, target, board, component):
37 command = self.commands.RunTests(target, board, component)
Luis Lozanof2a3ef42015-12-15 13:49:30 -080038 new_job = jobs.CreateLinuxJob('RunTests(%s, %s, %s)' %
39 (target, component, board), command)
kbaclawski5023b002013-02-15 20:18:02 +000040 new_job.DependsOnFolder(checkout_dir)
41 new_job.DependsOnFolder(build_tree_dir)
kbaclawski23b34d42013-02-15 22:48:52 +000042 testrun_dir_dep = job.FolderDependency(
43 new_job, self.commands.dejagnu_output_path, board)
44 return new_job, testrun_dir_dep
kbaclawski5023b002013-02-15 20:18:02 +000045
kbaclawski23b34d42013-02-15 22:48:52 +000046 def GenerateReport(self, testrun_dirs, manifests_dir, target, boards):
47 command = self.commands.GenerateReport(boards)
kbaclawskie78cbd42013-02-15 21:20:04 +000048 new_job = jobs.CreateLinuxJob('GenerateReport(%s)' % target, command)
kbaclawski23b34d42013-02-15 22:48:52 +000049 new_job.DependsOnFolder(manifests_dir)
50 for testrun_dir in testrun_dirs:
51 new_job.DependsOnFolder(testrun_dir)
kbaclawskie78cbd42013-02-15 21:20:04 +000052 return new_job
kbaclawski5023b002013-02-15 20:18:02 +000053
kbaclawskicc113a42013-02-15 21:20:07 +000054
kbaclawski5023b002013-02-15 20:18:02 +000055class CommandsFactory(object):
56 CHECKOUT_DIR = 'crosstool-checkout-dir'
57
kbaclawskif81c60d2013-02-15 21:15:08 +000058 def __init__(self):
Luis Lozanof2a3ef42015-12-15 13:49:30 -080059 self.buildit_path = os.path.join(self.CHECKOUT_DIR, 'gcctools', 'crosstool',
60 'v15')
kbaclawski5023b002013-02-15 20:18:02 +000061
kbaclawskif81c60d2013-02-15 21:15:08 +000062 self.buildit_work_dir = 'buildit-tmp'
kbaclawski5023b002013-02-15 20:18:02 +000063 self.buildit_work_dir_path = os.path.join('$JOB_TMP', self.buildit_work_dir)
Luis Lozanof2a3ef42015-12-15 13:49:30 -080064 self.dejagnu_output_path = os.path.join(self.buildit_work_dir_path,
65 'dejagnu-output')
kbaclawski5023b002013-02-15 20:18:02 +000066
kbaclawski5023b002013-02-15 20:18:02 +000067 paths = {
68 'gcctools': [
Luis Lozanof2a3ef42015-12-15 13:49:30 -080069 'crosstool/v15/...', 'scripts/...'
70 ],
kbaclawski5023b002013-02-15 20:18:02 +000071 'gcctools/google_vendor_src_branch': [
Luis Lozanof2a3ef42015-12-15 13:49:30 -080072 'binutils/binutils-2.21/...', 'gdb/gdb-7.2.x/...',
73 'zlib/zlib-1.2.3/...'
74 ],
kbaclawski5023b002013-02-15 20:18:02 +000075 'gcctools/vendor_src': [
Luis Lozanof2a3ef42015-12-15 13:49:30 -080076 'gcc/google/gcc-4_6/...'
77 ]
78 }
kbaclawski5023b002013-02-15 20:18:02 +000079
kbaclawski1c5658c2013-02-15 20:23:41 +000080 p4view = perforce.View('depot2',
81 perforce.PathMapping.ListFromPathDict(paths))
kbaclawski5023b002013-02-15 20:18:02 +000082
kbaclawskif81c60d2013-02-15 21:15:08 +000083 self.p4client = perforce.CommandsFactory(self.CHECKOUT_DIR, p4view)
kbaclawski5023b002013-02-15 20:18:02 +000084
85 def CheckoutCrosstool(self):
kbaclawski085ff812013-02-15 20:44:50 +000086 p4client = self.p4client
87
88 return p4client.SetupAndDo(p4client.Sync(),
89 p4client.SaveCurrentCLNumber('CLNUM'),
90 p4client.Remove())
kbaclawski5023b002013-02-15 20:18:02 +000091
92 def BuildRelease(self, target):
kbaclawski23b34d42013-02-15 22:48:52 +000093 clnum_path = os.path.join('$JOB_TMP', self.CHECKOUT_DIR, 'CLNUM')
kbaclawski5023b002013-02-15 20:18:02 +000094
Luis Lozanof2a3ef42015-12-15 13:49:30 -080095 toolchain_root = os.path.join('/google/data/rw/projects/toolchains', target,
96 'unstable')
kbaclawski23b34d42013-02-15 22:48:52 +000097 toolchain_path = os.path.join(toolchain_root, '${CLNUM}')
kbaclawskia71f1c72013-02-15 21:28:26 +000098
kbaclawski4497d2d2013-02-15 21:28:38 +000099 build_toolchain = cmd.Wrapper(
100 cmd.Chain(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800101 cmd.MakeDir(toolchain_path),
102 cmd.Shell('buildit',
103 '--keep-work-dir',
104 '--build-type=release',
105 '--work-dir=%s' % self.buildit_work_dir_path,
106 '--results-dir=%s' % toolchain_path,
107 '--force-release=%s' % '${CLNUM}',
108 target,
109 path='.')),
kbaclawski23b34d42013-02-15 22:48:52 +0000110 cwd=self.buildit_path,
111 umask='0022',
112 env={'CLNUM': '$(< %s)' % clnum_path})
kbaclawskia71f1c72013-02-15 21:28:26 +0000113
kbaclawski23b34d42013-02-15 22:48:52 +0000114 # remove all but 10 most recent directories
kbaclawskia71f1c72013-02-15 21:28:26 +0000115 remove_old_toolchains_from_x20 = cmd.Wrapper(
116 cmd.Pipe(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800117 cmd.Shell('ls', '-1', '-r'), cmd.Shell('sed', '-e', '1,10d'),
kbaclawskia71f1c72013-02-15 21:28:26 +0000118 cmd.Shell('xargs', 'rm', '-r', '-f')),
119 cwd=toolchain_root)
120
kbaclawski4497d2d2013-02-15 21:28:38 +0000121 return cmd.Chain(build_toolchain, remove_old_toolchains_from_x20)
kbaclawskif81c60d2013-02-15 21:15:08 +0000122
kbaclawski569534a2013-02-15 22:49:27 +0000123 def RunTests(self, target, board, component='gcc'):
kbaclawski23b34d42013-02-15 22:48:52 +0000124 dejagnu_flags = ['--outdir=%s' % self.dejagnu_output_path,
kbaclawskief800012013-02-15 21:19:59 +0000125 '--target_board=%s' % board]
kbaclawskif81c60d2013-02-15 21:15:08 +0000126
kbaclawski6b970252013-02-15 21:20:39 +0000127 # Look for {pandaboard,qemu}.exp files in
128 # //depot/google3/experimental/users/kbaclawski/dejagnu/boards
129
kbaclawskif81c60d2013-02-15 21:15:08 +0000130 site_exp_file = os.path.join('/google/src/head/depot/google3',
131 'experimental/users/kbaclawski',
132 'dejagnu/site.exp')
133
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800134 build_dir_path = os.path.join(target, 'rpmbuild/BUILD/crosstool*-0.0',
135 'build-%s' % component)
kbaclawskif81c60d2013-02-15 21:15:08 +0000136
kbaclawskief800012013-02-15 21:19:59 +0000137 run_dejagnu = cmd.Wrapper(
kbaclawskif81c60d2013-02-15 21:15:08 +0000138 cmd.Chain(
kbaclawski23b34d42013-02-15 22:48:52 +0000139 cmd.MakeDir(self.dejagnu_output_path),
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800140 cmd.Shell('make',
141 'check',
142 '-k',
kbaclawskicc113a42013-02-15 21:20:07 +0000143 '-j $(grep -c processor /proc/cpuinfo)',
144 'RUNTESTFLAGS="%s"' % ' '.join(dejagnu_flags),
145 'DEJAGNU="%s"' % site_exp_file,
146 ignore_error=True)),
kbaclawski569534a2013-02-15 22:49:27 +0000147 cwd=os.path.join(self.buildit_work_dir_path, build_dir_path),
kbaclawski6b970252013-02-15 21:20:39 +0000148 env={'REMOTE_TMPDIR': 'job-$JOB_ID'})
kbaclawskief800012013-02-15 21:19:59 +0000149
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800150 save_results = cmd.Copy(self.dejagnu_output_path,
151 to_dir='$JOB_TMP/results',
152 recursive=True)
kbaclawskief800012013-02-15 21:19:59 +0000153
kbaclawskie78cbd42013-02-15 21:20:04 +0000154 return cmd.Chain(run_dejagnu, save_results)
155
kbaclawski23b34d42013-02-15 22:48:52 +0000156 def GenerateReport(self, boards):
157 sumfiles = [os.path.join('$JOB_TMP', board, '*.sum') for board in boards]
158
kbaclawskie78cbd42013-02-15 21:20:04 +0000159 return cmd.Wrapper(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800160 cmd.Shell('dejagnu.sh',
161 'report',
162 '-m',
163 '$JOB_TMP/manifests/*.xfail',
164 '-o',
165 '$JOB_TMP/results/report.html',
kbaclawski23b34d42013-02-15 22:48:52 +0000166 *sumfiles,
kbaclawskie78cbd42013-02-15 21:20:04 +0000167 path='.'),
168 cwd='$HOME/automation/clients/report')