blob: e03d2b9e4be8dcd27f4436708c3d12d87b4f91c3 [file] [log] [blame]
Daniel Dunbar235aa412009-07-18 07:16:15 +00001import buildbot
2import buildbot.process.factory
Renato Goline6c1b3b2015-07-01 15:52:22 +00003import copy
David Deanf8b35442012-12-11 00:35:12 +00004import os
Daniel Sandersfa222332015-12-04 14:30:39 +00005from datetime import datetime
David Deanf8b35442012-12-11 00:35:12 +00006
Reid Kleckner25a26b02015-03-09 22:30:25 +00007from buildbot.process.properties import WithProperties, Property
David Blaikie8cbf62f2013-01-12 21:32:31 +00008from buildbot.steps.shell import Configure, ShellCommand, SetProperty
Daniel Dunbar44abe742009-07-19 01:59:03 +00009from buildbot.steps.shell import WarningCountingShellCommand
David Deanf8b35442012-12-11 00:35:12 +000010from buildbot.steps.source import SVN
Daniel Dunbar44abe742009-07-19 01:59:03 +000011from buildbot.steps.transfer import FileDownload
Michael Gottesmana6b5be82013-06-28 21:57:20 +000012
Michael Gottesman960bcfa2013-08-30 05:46:15 +000013import zorg.buildbot.util.artifacts as artifacts
Michael Gottesmana6b5be82013-06-28 21:57:20 +000014import zorg.buildbot.builders.Util as builders_util
Michael Gottesmandc771a02013-08-30 05:46:22 +000015import zorg.buildbot.util.phasedbuilderutils as phasedbuilderutils
Michael Gottesmana6b5be82013-06-28 21:57:20 +000016import zorg.buildbot.commands as commands
17import zorg.buildbot.commands.BatchFileDownload as batch_file_download
18import zorg.buildbot.commands.LitTestCommand as lit_test_command
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000019
Galina Kistanovaf4d79352011-10-20 20:46:52 +000020def getClangBuildFactory(
21 triple=None,
22 clean=True,
23 test=True,
24 package_dst=None,
25 run_cxx_tests=False,
26 examples=False,
27 valgrind=False,
28 valgrindLeakCheck=False,
Galina Kistanovaf4d79352011-10-20 20:46:52 +000029 useTwoStage=False,
30 completely_clean=False,
Galina Kistanovaf4d79352011-10-20 20:46:52 +000031 make='make',
32 jobs="%(jobs)s",
33 stage1_config='Debug+Asserts',
34 stage2_config='Release+Asserts',
35 env={}, # Environmental variables for all steps.
36 extra_configure_args=[],
Vassil Vassilev5a9b9ed2016-05-25 17:10:03 +000037 stage2_extra_configure_args=[],
Galina Kistanovaf4d79352011-10-20 20:46:52 +000038 use_pty_in_tests=False,
Peter Collingbourned49ac282011-10-25 14:38:45 +000039 trunk_revision=None,
40 force_checkout=False,
Peter Collingbourne7a95b0c2011-10-26 16:40:17 +000041 extra_clean_step=None,
David Blaikiea76da842012-08-13 22:24:46 +000042 checkout_compiler_rt=False,
Galina Kistanova2ab1e2d2016-11-22 00:23:43 +000043 checkout_lld=False,
David Blaikiea76da842012-08-13 22:24:46 +000044 run_gdb=False,
David Blaikiedad03d52012-11-16 22:37:12 +000045 run_modern_gdb=False,
Vassil Vassilev0c647ef2016-06-30 21:16:45 +000046 run_gcc=False):
Galina Kistanovaf4d79352011-10-20 20:46:52 +000047 # Prepare environmental variables. Set here all env we want everywhere.
48 merged_env = {
49 'TERM' : 'dumb' # Make sure Clang doesn't use color escape sequences.
50 }
51 if env is not None:
52 # Overwrite pre-set items with the given ones, so user can set anything.
53 merged_env.update(env)
David Blaikie2f7eb282012-08-24 18:37:00 +000054
Jonathan Roelofs62415e52015-02-28 00:03:17 +000055 llvm_srcdir = "llvm.src"
56 llvm_1_objdir = "llvm.obj"
57 llvm_1_installdir = "llvm.install.1"
58 llvm_2_objdir = "llvm.obj.2"
59 llvm_2_installdir = "llvm.install"
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000060
Daniel Dunbar235aa412009-07-18 07:16:15 +000061 f = buildbot.process.factory.BuildFactory()
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000062
63 # Determine the build directory.
64 f.addStep(buildbot.steps.shell.SetProperty(name="get_builddir",
65 command=["pwd"],
66 property="builddir",
67 description="set build dir",
Galina Kistanovaf4d79352011-10-20 20:46:52 +000068 workdir=".",
69 env=merged_env))
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000070
Daniel Dunbar06b20f12010-04-08 18:29:38 +000071 # Blow away completely, if requested.
72 if completely_clean:
73 f.addStep(ShellCommand(name="rm-llvm.src",
74 command=["rm", "-rf", llvm_srcdir],
75 haltOnFailure=True,
76 description=["rm src dir", "llvm"],
Galina Kistanovaf4d79352011-10-20 20:46:52 +000077 workdir=".",
78 env=merged_env))
Daniel Dunbar06b20f12010-04-08 18:29:38 +000079
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000080 # Checkout sources.
Peter Collingbourned49ac282011-10-25 14:38:45 +000081 if trunk_revision:
82 # The SVN build step provides no mechanism to check out a specific revision
83 # based on a property, so just run the commands directly here.
84 svn_co = ['svn', 'checkout']
85 if force_checkout:
86 svn_co += ['--force']
87 svn_co += ['--revision', WithProperties(trunk_revision)]
88
89 svn_co_llvm = svn_co + \
90 [WithProperties('http://llvm.org/svn/llvm-project/llvm/trunk@%s' %
91 trunk_revision),
92 llvm_srcdir]
93 svn_co_clang = svn_co + \
94 [WithProperties('http://llvm.org/svn/llvm-project/cfe/trunk@%s' %
95 trunk_revision),
96 '%s/tools/clang' % llvm_srcdir]
David Blaikie845ae0d2012-08-10 00:51:38 +000097 svn_co_clang_tools_extra = svn_co + \
98 [WithProperties('http://llvm.org/svn/llvm-project/clang-tools-extra/trunk@%s' %
99 trunk_revision),
100 '%s/tools/clang/tools/extra' % llvm_srcdir]
Peter Collingbourned49ac282011-10-25 14:38:45 +0000101
102 f.addStep(ShellCommand(name='svn-llvm',
103 command=svn_co_llvm,
104 haltOnFailure=True,
105 workdir='.'))
106 f.addStep(ShellCommand(name='svn-clang',
107 command=svn_co_clang,
108 haltOnFailure=True,
109 workdir='.'))
David Blaikie845ae0d2012-08-10 00:51:38 +0000110 f.addStep(ShellCommand(name='svn-clang-tools-extra',
111 command=svn_co_clang_tools_extra,
112 haltOnFailure=True,
113 workdir='.'))
Peter Collingbourned49ac282011-10-25 14:38:45 +0000114 else:
115 f.addStep(SVN(name='svn-llvm',
Daniel Dunbarf4e23eb2010-09-20 21:13:02 +0000116 mode='update',
Peter Collingbourned49ac282011-10-25 14:38:45 +0000117 baseURL='http://llvm.org/svn/llvm-project/llvm/',
Daniel Dunbarf4e23eb2010-09-20 21:13:02 +0000118 defaultBranch='trunk',
Peter Collingbourned49ac282011-10-25 14:38:45 +0000119 workdir=llvm_srcdir))
120 f.addStep(SVN(name='svn-clang',
121 mode='update',
122 baseURL='http://llvm.org/svn/llvm-project/cfe/',
123 defaultBranch='trunk',
124 workdir='%s/tools/clang' % llvm_srcdir))
David Blaikie845ae0d2012-08-10 00:51:38 +0000125 f.addStep(SVN(name='svn-clang-tools-extra',
126 mode='update',
127 baseURL='http://llvm.org/svn/llvm-project/clang-tools-extra/',
128 defaultBranch='trunk',
129 workdir='%s/tools/clang/tools/extra' % llvm_srcdir))
Peter Collingbourned49ac282011-10-25 14:38:45 +0000130 if checkout_compiler_rt:
131 f.addStep(SVN(name='svn-compiler-rt',
132 mode='update',
133 baseURL='http://llvm.org/svn/llvm-project/compiler-rt/',
134 defaultBranch='trunk',
135 workdir='%s/projects/compiler-rt' % llvm_srcdir))
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000136
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000137 # Clean up llvm (stage 1); unless in-dir.
138 if clean and llvm_srcdir != llvm_1_objdir:
139 f.addStep(ShellCommand(name="rm-llvm.obj.stage1",
140 command=["rm", "-rf", llvm_1_objdir],
141 haltOnFailure=True,
142 description=["rm build dir", "llvm"],
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000143 workdir=".",
144 env=merged_env))
Andrew Trick70fa9d22011-08-25 23:38:51 +0000145
David Blaikie8cbf62f2013-01-12 21:32:31 +0000146 if not clean:
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000147 expected_makefile = 'Makefile'
David Blaikie8cbf62f2013-01-12 21:32:31 +0000148 f.addStep(SetProperty(name="Makefile_isready",
149 workdir=llvm_1_objdir,
150 command=["sh", "-c",
Richard Smith02389162014-09-26 23:53:06 +0000151 "test -e %s && echo OK || echo Missing" % expected_makefile],
David Blaikie8cbf62f2013-01-12 21:32:31 +0000152 flunkOnFailure=False,
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000153 property="exists_Makefile"))
Richard Smith02389162014-09-26 23:53:06 +0000154
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000155 cmake_triple_arg = []
156 if triple:
157 cmake_triple_arg = ['-DLLVM_HOST_TRIPLE=%s' % triple]
158 f.addStep(ShellCommand(name='cmake',
159 command=['cmake',
160 '-DLLVM_BUILD_TESTS=ON',
161 '-DCMAKE_BUILD_TYPE=%s' % stage1_config] +
162 cmake_triple_arg +
163 extra_configure_args +
164 ["../" + llvm_srcdir],
165 description='cmake stage1',
166 workdir=llvm_1_objdir,
167 env=merged_env,
168 doStepIf=lambda step: step.build.getProperty("exists_Makefile") != "OK"))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000169
170 # Make clean if using in-dir builds.
171 if clean and llvm_srcdir == llvm_1_objdir:
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000172 f.addStep(WarningCountingShellCommand(name="clean-llvm",
Daniel Dunbard20468a2009-11-24 18:27:23 +0000173 command=[make, "clean"],
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000174 haltOnFailure=True,
175 description="cleaning llvm",
176 descriptionDone="clean llvm",
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000177 workdir=llvm_1_objdir,
Peter Collingbourne7a95b0c2011-10-26 16:40:17 +0000178 doStepIf=clean,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000179 env=merged_env))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000180
Peter Collingbourne7a95b0c2011-10-26 16:40:17 +0000181 if extra_clean_step:
182 f.addStep(extra_clean_step)
183
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000184 f.addStep(WarningCountingShellCommand(name="compile",
Daniel Dunbard20468a2009-11-24 18:27:23 +0000185 command=['nice', '-n', '10',
186 make, WithProperties("-j%s" % jobs)],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000187 haltOnFailure=True,
David Blaikie05517332013-12-19 23:29:12 +0000188 flunkOnFailure=not run_gdb,
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000189 description=["compiling", stage1_config],
190 descriptionDone=["compile", stage1_config],
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000191 workdir=llvm_1_objdir,
192 env=merged_env))
Daniel Dunbar256fed42009-11-25 21:11:08 +0000193
194 if examples:
195 f.addStep(WarningCountingShellCommand(name="compile.examples",
196 command=['nice', '-n', '10',
197 make, WithProperties("-j%s" % jobs),
198 "BUILD_EXAMPLES=1"],
199 haltOnFailure=True,
Richard Smith65e6f5d2014-09-25 18:18:35 +0000200 description=["compiling", stage1_config, "examples"],
Daniel Dunbar256fed42009-11-25 21:11:08 +0000201 descriptionDone=["compile", stage1_config, "examples"],
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000202 workdir=llvm_1_objdir,
203 env=merged_env))
Daniel Dunbar256fed42009-11-25 21:11:08 +0000204
NAKAMURA Takumi1a4666b2013-01-19 03:39:07 +0000205 clangTestArgs = '-v -j %s' % jobs
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000206 if valgrind:
Daniel Dunbar89184b92010-04-18 19:09:32 +0000207 clangTestArgs += ' --vg'
Daniel Dunbara1bebce2010-03-21 01:24:00 +0000208 if valgrindLeakCheck:
209 clangTestArgs += ' --vg-leak'
Nick Lewycky8d26e472011-08-27 21:18:56 +0000210 clangTestArgs += ' --vg-arg --suppressions=%(builddir)s/llvm/tools/clang/utils/valgrind/x86_64-pc-linux-gnu_gcc-4.3.3.supp --vg-arg --suppressions=%(builddir)s/llvm/utils/valgrind/x86_64-pc-linux-gnu.supp'
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000211 extraTestDirs = ''
212 if run_cxx_tests:
213 extraTestDirs += '%(builddir)s/llvm/tools/clang/utils/C++Tests'
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000214 if test:
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000215 f.addStep(lit_test_command.LitTestCommand(name='check-all',
David Blaikie7e6f8a12012-08-31 20:46:27 +0000216 command=[make, "check-all", "VERBOSE=1",
NAKAMURA Takumi1a4666b2013-01-19 03:39:07 +0000217 WithProperties("LIT_ARGS=%s" % clangTestArgs),
David Blaikiebc684012012-12-27 20:44:19 +0000218 WithProperties("EXTRA_TESTDIRS=%s" % extraTestDirs)],
David Blaikie05517332013-12-19 23:29:12 +0000219 flunkOnFailure=not run_gdb,
David Blaikie7e6f8a12012-08-31 20:46:27 +0000220 description=["checking"],
221 descriptionDone=["checked"],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000222 workdir=llvm_1_objdir,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000223 usePTY=use_pty_in_tests,
224 env=merged_env))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000225
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000226 # TODO: Install llvm and clang for stage1.
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000227
David Blaikiedad03d52012-11-16 22:37:12 +0000228 if run_gdb or run_gcc or run_modern_gdb:
David Blaikiea76da842012-08-13 22:24:46 +0000229 ignores = getClangTestsIgnoresFromPath(os.path.expanduser('~/public/clang-tests'), 'clang-x86_64-darwin10')
230 install_prefix = "%%(builddir)s/%s" % llvm_1_installdir
231 if run_gdb:
232 addClangGDBTests(f, ignores, install_prefix)
David Blaikiedad03d52012-11-16 22:37:12 +0000233 if run_modern_gdb:
David Blaikie41d09c32013-01-02 21:11:09 +0000234 addModernClangGDBTests(f, jobs, install_prefix)
David Blaikiea76da842012-08-13 22:24:46 +0000235 if run_gcc:
236 addClangGCCTests(f, ignores, install_prefix)
237
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000238 if not useTwoStage:
Daniel Dunbardedf6572010-11-13 00:23:34 +0000239 if package_dst:
240 name = WithProperties(
241 "%(builddir)s/" + llvm_1_objdir +
242 "/clang-r%(got_revision)s-b%(buildnumber)s.tgz")
243 f.addStep(ShellCommand(name='pkg.tar',
244 description="tar root",
245 command=["tar", "zcvf", name, "./"],
246 workdir=llvm_1_installdir,
247 warnOnFailure=True,
248 flunkOnFailure=False,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000249 haltOnFailure=False,
250 env=merged_env))
Daniel Dunbardedf6572010-11-13 00:23:34 +0000251 f.addStep(ShellCommand(name='pkg.upload',
Andrew Trick70fa9d22011-08-25 23:38:51 +0000252 description="upload root",
Daniel Dunbardedf6572010-11-13 00:23:34 +0000253 command=["scp", name,
254 WithProperties(
255 package_dst + "/%(buildername)s")],
256 workdir=".",
257 warnOnFailure=True,
258 flunkOnFailure=False,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000259 haltOnFailure=False,
260 env=merged_env))
Daniel Dunbardedf6572010-11-13 00:23:34 +0000261
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000262 return f
263
264 # Clean up llvm (stage 2).
Richard Smith02389162014-09-26 23:53:06 +0000265 #
Galina Kistanova79900972015-11-16 17:30:42 +0000266 # We always cleanly build the stage 2. If the compiler has been
267 # changed on the stage 1, we cannot trust any of the intermediate file
268 # from the old compiler. And if the stage 1 compiler is the same, we should
269 # not build in the first place.
270 f.addStep(ShellCommand(name="rm-llvm.obj.stage2",
271 command=["rm", "-rf", llvm_2_objdir],
272 haltOnFailure=True,
273 description=["rm build dir", "llvm", "(stage 2)"],
274 workdir=".",
275 env=merged_env))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000276
277 # Configure llvm (stage 2).
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000278 f.addStep(ShellCommand(name='cmake',
Vassil Vassilev5a9b9ed2016-05-25 17:10:03 +0000279 command=['cmake'] + stage2_extra_configure_args + [
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000280 '-DLLVM_BUILD_TESTS=ON',
281 WithProperties('-DCMAKE_C_COMPILER=%%(builddir)s/%s/bin/clang' % llvm_1_objdir), # FIXME use installdir
282 WithProperties('-DCMAKE_CXX_COMPILER=%%(builddir)s/%s/bin/clang++' % llvm_1_objdir),
283 '-DCMAKE_BUILD_TYPE=%s' % stage2_config,
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000284 "../" + llvm_srcdir],
285 description='cmake stage2',
286 workdir=llvm_2_objdir,
287 env=merged_env))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000288
289 # Build llvm (stage 2).
290 f.addStep(WarningCountingShellCommand(name="compile.llvm.stage2",
291 command=['nice', '-n', '10',
292 make, WithProperties("-j%s" % jobs)],
293 haltOnFailure=True,
294 description=["compiling", "(stage 2)",
295 stage2_config],
296 descriptionDone=["compile", "(stage 2)",
297 stage2_config],
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000298 workdir=llvm_2_objdir,
299 env=merged_env))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000300
301 if test:
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000302 f.addStep(lit_test_command.LitTestCommand(name='check-all',
David Blaikie7e6f8a12012-08-31 20:46:27 +0000303 command=[make, "check-all", "VERBOSE=1",
NAKAMURA Takumi1a4666b2013-01-19 03:39:07 +0000304 WithProperties("LIT_ARGS=%s" % clangTestArgs),
David Blaikiebc684012012-12-27 20:44:19 +0000305 WithProperties("EXTRA_TESTDIRS=%s" % extraTestDirs)],
David Blaikie7e6f8a12012-08-31 20:46:27 +0000306 description=["checking"],
307 descriptionDone=["checked"],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000308 workdir=llvm_2_objdir,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000309 usePTY=use_pty_in_tests,
310 env=merged_env))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000311
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000312 # TODO: Install llvm and clang for stage2.
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000313
314 if package_dst:
315 name = WithProperties(
316 "%(builddir)s/" + llvm_2_objdir +
317 "/clang-r%(got_revision)s-b%(buildnumber)s.tgz")
318 f.addStep(ShellCommand(name='pkg.tar',
319 description="tar root",
320 command=["tar", "zcvf", name, "./"],
321 workdir=llvm_2_installdir,
322 warnOnFailure=True,
323 flunkOnFailure=False,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000324 haltOnFailure=False,
325 env=merged_env))
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000326 f.addStep(ShellCommand(name='pkg.upload',
Andrew Trick70fa9d22011-08-25 23:38:51 +0000327 description="upload root",
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000328 command=["scp", name,
329 WithProperties(
330 package_dst + "/%(buildername)s")],
331 workdir=".",
332 warnOnFailure=True,
333 flunkOnFailure=False,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000334 haltOnFailure=False,
335 env=merged_env))
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000336
Daniel Dunbar235aa412009-07-18 07:16:15 +0000337 return f
Daniel Dunbar44abe742009-07-19 01:59:03 +0000338
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000339def addSVNUpdateSteps(f,
340 checkout_clang_tools_extra,
341 checkout_compiler_rt,
Renato Golin0bd2a532016-11-20 16:14:35 +0000342 checkout_test_suite,
Artem Belevich16fcd0e2016-12-21 21:15:56 +0000343 checkout_lld,
344 checkout_libcxx):
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000345 # We *must* checkout at least Clang+LLVM
346 f.addStep(SVN(name='svn-llvm',
347 mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
348 defaultBranch='trunk',
349 workdir='llvm'))
350 f.addStep(SVN(name='svn-clang',
351 mode='update', baseURL='http://llvm.org/svn/llvm-project/cfe/',
352 defaultBranch='trunk',
353 workdir='llvm/tools/clang'))
354
355 # Extra stuff that will be built/tested
356 if checkout_clang_tools_extra:
357 f.addStep(SVN(name='svn-clang-tools-extra',
358 mode='update', baseURL='http://llvm.org/svn/llvm-project/clang-tools-extra/',
359 defaultBranch='trunk',
360 workdir='llvm/tools/clang/tools/extra'))
361 if checkout_compiler_rt:
362 f.addStep(SVN(name='svn-compiler-rt',
363 mode='update', baseURL='http://llvm.org/svn/llvm-project/compiler-rt/',
364 defaultBranch='trunk',
365 workdir='llvm/projects/compiler-rt'))
366 if checkout_test_suite:
367 f.addStep(SVN(name='svn-lnt',
368 mode='update', baseURL='http://llvm.org/svn/llvm-project/lnt/',
369 defaultBranch='trunk',
370 workdir='test/lnt'))
371 f.addStep(SVN(name='svn-test-suite',
372 mode='update', baseURL='http://llvm.org/svn/llvm-project/test-suite/',
373 defaultBranch='trunk',
374 workdir='test/test-suite'))
Renato Golin0bd2a532016-11-20 16:14:35 +0000375 if checkout_lld:
376 f.addStep(SVN(name='svn-lld',
377 mode='update', baseURL='http://llvm.org/svn/llvm-project/lld/',
378 defaultBranch='trunk',
379 workdir='llvm/tools/lld'))
Artem Belevich16fcd0e2016-12-21 21:15:56 +0000380 if checkout_libcxx:
381 f.addStep(SVN(name='svn-libcxx',
382 mode='update',
383 baseURL='http://llvm.org/svn/llvm-project/libcxx/',
384 defaultBranch='trunk',
385 workdir='llvm/projects/libcxx'))
386 f.addStep(SVN(name='svn-libcxxabi',
387 mode='update',
388 baseURL='http://llvm.org/svn/llvm-project/libcxxabi/',
389 defaultBranch='trunk',
390 workdir='llvm/projects/libcxxabi'))
391 f.addStep(SVN(name='svn-libunwind',
392 mode='update',
393 baseURL='http://llvm.org/svn/llvm-project/libunwind/',
394 defaultBranch='trunk',
395 workdir='llvm/projects/libunwind'))
Renato Goline402f582014-09-04 19:25:24 +0000396
Daniel Sandersfa222332015-12-04 14:30:39 +0000397def addGCSUploadSteps(f, package_name, install_prefix, gcs_directory, env,
398 gcs_url_property=None):
399 """
400 Add steps to upload to the Google Cloud Storage bucket.
401
402 f - The BuildFactory to modify.
403 package_name - The name of this package for the descriptions (e.g.
404 'stage 1')
405 install_prefix - The directory the build has been installed to.
406 gcs_directory - The subdirectory of the bucket root to upload to. This
407 should match the builder name.
408 env - The environment to use. Set BOTO_CONFIG to use a configuration file
409 in a non-standard location, and BUCKET to use a different GCS bucket.
410 gcs_url_property - Property to assign the GCS url to.
411 """
412
413 gcs_url_fmt = ('gs://%(gcs_bucket)s/%(gcs_directory)s/'
414 'clang-r%(got_revision)s-t%(now)s-b%(buildnumber)s.tar.xz')
415 time_fmt = '%Y-%m-%d_%H-%M-%S'
416 gcs_url = \
417 WithProperties(
418 gcs_url_fmt,
419 gcs_bucket=lambda _: env.get('BUCKET', 'llvm-build-artifacts'),
420 gcs_directory=lambda _: gcs_directory,
421 now=lambda _: datetime.utcnow().strftime(time_fmt))
422
423 if gcs_url_property:
424 f.addStep(SetProperty(
425 name="record GCS url for " + package_name,
426 command=['echo', gcs_url],
427 property=gcs_url_property))
428
429 f.addStep(ShellCommand(name='package ' + package_name,
430 command=['tar', 'cvfJ', '../install.tar.xz', '.'],
431 description='packaging ' + package_name + '...',
432 workdir=install_prefix,
433 env=env))
434
435 f.addStep(ShellCommand(
436 name='upload ' + package_name + ' to storage bucket',
437 command=['gsutil', 'cp', '../install.tar.xz', gcs_url],
438 description=('uploading ' + package_name +
439 'to storage bucket ...'),
440 workdir=install_prefix,
441 env=env))
442
443def getClangCMakeGCSBuildFactory(
444 clean=True,
445 test=True,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000446 cmake='cmake',
Daniel Sandersfa222332015-12-04 14:30:39 +0000447 jobs=None,
448
449 # VS tools environment variable if using MSVC. For example,
450 # %VS120COMNTOOLS% selects the 2013 toolchain.
451 vs=None,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000452 vs_target_arch='x86',
Daniel Sandersfa222332015-12-04 14:30:39 +0000453
454 # Multi-stage compilation
455 useTwoStage=False,
456 testStage1=True,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000457 stage1_config='Release',
458 stage2_config='Release',
Daniel Sandersfa222332015-12-04 14:30:39 +0000459
460 # Test-suite
461 runTestSuite=False,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000462 nt_flags=[],
Daniel Sandersfa222332015-12-04 14:30:39 +0000463 submitURL=None,
464 testerName=None,
465
466 # Environmental variables for all steps.
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000467 env={},
468 extra_cmake_args=[],
Daniel Sandersfa222332015-12-04 14:30:39 +0000469
470 # Extra repositories
471 checkout_clang_tools_extra=True,
472 checkout_compiler_rt=True,
Renato Golin0bd2a532016-11-20 16:14:35 +0000473 checkout_lld=True,
Daniel Sandersfa222332015-12-04 14:30:39 +0000474
475 # Upload artifacts to Google Cloud Storage (for the llvmbisect tool)
476 stage1_upload_directory=None,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000477
478 # Triggers
479 trigger_after_stage1=[]):
Daniel Sandersfa222332015-12-04 14:30:39 +0000480 return _getClangCMakeBuildFactory(
481 clean=clean, test=test, cmake=cmake, jobs=jobs, vs=vs,
482 vs_target_arch=vs_target_arch, useTwoStage=useTwoStage,
483 testStage1=testStage1, stage1_config=stage1_config,
484 stage2_config=stage2_config, runTestSuite=runTestSuite,
485 nt_flags=nt_flags, submitURL=submitURL, testerName=testerName,
486 env=env, extra_cmake_args=extra_cmake_args,
487 checkout_clang_tools_extra=checkout_clang_tools_extra,
488 checkout_compiler_rt=checkout_compiler_rt,
Renato Golin0bd2a532016-11-20 16:14:35 +0000489 checkout_lld=checkout_lld,
Daniel Sandersfa222332015-12-04 14:30:39 +0000490 stage1_upload_directory=stage1_upload_directory,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000491 trigger_after_stage1=trigger_after_stage1)
Reid Kleckner25a26b02015-03-09 22:30:25 +0000492
493def getClangCMakeBuildFactory(
494 clean=True,
495 test=True,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000496 cmake='cmake',
Reid Kleckner25a26b02015-03-09 22:30:25 +0000497 jobs=None,
498
499 # VS tools environment variable if using MSVC. For example,
500 # %VS120COMNTOOLS% selects the 2013 toolchain.
501 vs=None,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000502 vs_target_arch='x86',
Reid Kleckner25a26b02015-03-09 22:30:25 +0000503
504 # Multi-stage compilation
505 useTwoStage=False,
506 testStage1=True,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000507 stage1_config='Release',
508 stage2_config='Release',
Reid Kleckner25a26b02015-03-09 22:30:25 +0000509
Renato Golin61aed7f2015-06-17 19:12:50 +0000510 # Test-suite
511 runTestSuite=False,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000512 nt_flags=[],
Renato Golin61aed7f2015-06-17 19:12:50 +0000513 submitURL=None,
514 testerName=None,
515
Reid Kleckner25a26b02015-03-09 22:30:25 +0000516 # Environmental variables for all steps.
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000517 env={},
518 extra_cmake_args=[],
Reid Kleckner25a26b02015-03-09 22:30:25 +0000519
520 # Extra repositories
521 checkout_clang_tools_extra=True,
Renato Golin0bd2a532016-11-20 16:14:35 +0000522 checkout_compiler_rt=True,
Artem Belevich16fcd0e2016-12-21 21:15:56 +0000523 checkout_lld=True,
524 checkout_libcxx=False,
525 checkout_test_suite=False):
Daniel Sandersfa222332015-12-04 14:30:39 +0000526 return _getClangCMakeBuildFactory(
527 clean=clean, test=test, cmake=cmake, jobs=jobs, vs=vs,
528 vs_target_arch=vs_target_arch, useTwoStage=useTwoStage,
529 testStage1=testStage1, stage1_config=stage1_config,
530 stage2_config=stage2_config, runTestSuite=runTestSuite,
531 nt_flags=nt_flags, submitURL=submitURL, testerName=testerName,
532 env=env, extra_cmake_args=extra_cmake_args,
533 checkout_clang_tools_extra=checkout_clang_tools_extra,
Renato Golin0bd2a532016-11-20 16:14:35 +0000534 checkout_lld=checkout_lld,
Artem Belevich16fcd0e2016-12-21 21:15:56 +0000535 checkout_compiler_rt=checkout_compiler_rt,
536 checkout_libcxx=checkout_libcxx,
537 checkout_test_suite=checkout_test_suite)
Daniel Sandersfa222332015-12-04 14:30:39 +0000538
539def _getClangCMakeBuildFactory(
540 clean=True,
541 test=True,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000542 cmake='cmake',
Daniel Sandersfa222332015-12-04 14:30:39 +0000543 jobs=None,
544
545 # VS tools environment variable if using MSVC. For example,
546 # %VS120COMNTOOLS% selects the 2013 toolchain.
547 vs=None,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000548 vs_target_arch='x86',
Daniel Sandersfa222332015-12-04 14:30:39 +0000549
550 # Multi-stage compilation
551 useTwoStage=False,
552 testStage1=True,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000553 stage1_config='Release',
554 stage2_config='Release',
Daniel Sandersfa222332015-12-04 14:30:39 +0000555
556 # Test-suite
557 runTestSuite=False,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000558 nt_flags=[],
Daniel Sandersfa222332015-12-04 14:30:39 +0000559 submitURL=None,
560 testerName=None,
561
562 # Environmental variables for all steps.
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000563 env={},
564 extra_cmake_args=[],
Daniel Sandersfa222332015-12-04 14:30:39 +0000565
566 # Extra repositories
567 checkout_clang_tools_extra=True,
568 checkout_compiler_rt=True,
Renato Golin0bd2a532016-11-20 16:14:35 +0000569 checkout_lld=True,
Artem Belevich16fcd0e2016-12-21 21:15:56 +0000570 checkout_libcxx=False,
571 checkout_test_suite=False,
Daniel Sandersfa222332015-12-04 14:30:39 +0000572
573 # Upload artifacts to Google Cloud Storage (for the llvmbisect tool)
574 stage1_upload_directory=None,
575
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000576 # Triggers
577 trigger_after_stage1=[]):
Reid Kleckner25a26b02015-03-09 22:30:25 +0000578
579 ############# PREPARING
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000580 f = buildbot.process.factory.BuildFactory()
Reid Kleckner25a26b02015-03-09 22:30:25 +0000581
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000582 addSVNUpdateSteps(f,
583 checkout_clang_tools_extra=checkout_clang_tools_extra,
584 checkout_compiler_rt=checkout_compiler_rt,
Renato Golin0bd2a532016-11-20 16:14:35 +0000585 checkout_lld=checkout_lld,
Artem Belevich16fcd0e2016-12-21 21:15:56 +0000586 checkout_test_suite=runTestSuite or checkout_test_suite,
587 checkout_libcxx=checkout_libcxx)
Reid Kleckner25a26b02015-03-09 22:30:25 +0000588
Renato Goline402f582014-09-04 19:25:24 +0000589 # If jobs not defined, Ninja will choose a suitable value
Renato Golincc83db32015-06-17 19:23:40 +0000590 jobs_cmd = []
591 lit_args = "'-v"
Renato Goline402f582014-09-04 19:25:24 +0000592 if jobs is not None:
Renato Golincc83db32015-06-17 19:23:40 +0000593 jobs_cmd = ["-j"+str(jobs)]
594 lit_args += " -j"+str(jobs)+"'"
Renato Goline402f582014-09-04 19:25:24 +0000595 else:
Renato Golincc83db32015-06-17 19:23:40 +0000596 lit_args += "'"
597 ninja_cmd = ['ninja'] + jobs_cmd
598 ninja_install_cmd = ['ninja', 'install'] + jobs_cmd
599 ninja_check_cmd = ['ninja', 'check-all'] + jobs_cmd
Reid Kleckner25a26b02015-03-09 22:30:25 +0000600 check_build_cmd = ["sh", "-c",
601 "test -e build.ninja && echo OK || echo Missing"]
602 if vs:
603 check_build_cmd = ["cmd", "/c", "if exist build.ninja (echo OK) " +
604 " else (echo Missing & exit 1)"]
Renato Goline402f582014-09-04 19:25:24 +0000605
606 # Global configurations
Renato Golincc83db32015-06-17 19:23:40 +0000607 stage1_build = 'stage1'
608 stage1_install = 'stage1.install'
609 stage2_build = 'stage2'
610 stage2_install = 'stage2.install'
Renato Goline402f582014-09-04 19:25:24 +0000611
Reid Kleckner25a26b02015-03-09 22:30:25 +0000612 # Set up VS environment, if appropriate.
613 if vs:
614 f.addStep(SetProperty(
615 command=builders_util.getVisualStudioEnvironment(vs, vs_target_arch),
616 extract_fn=builders_util.extractSlaveEnvironment))
617 assert not env, "Can't have custom builder env vars with VS"
618 env = Property('slave_env')
619
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000620
Renato Goline402f582014-09-04 19:25:24 +0000621 ############# CLEANING
622 if clean:
623 f.addStep(ShellCommand(name='clean stage 1',
624 command=['rm','-rf',stage1_build],
625 warnOnFailure=True,
626 description='cleaning stage 1',
627 descriptionDone='clean',
628 workdir='.',
629 env=env))
630 else:
631 f.addStep(SetProperty(name="check ninja files 1",
632 workdir=stage1_build,
Reid Kleckner25a26b02015-03-09 22:30:25 +0000633 command=check_build_cmd,
Renato Goline402f582014-09-04 19:25:24 +0000634 flunkOnFailure=False,
635 property="exists_ninja_1"))
636
637
638 ############# STAGE 1
639 f.addStep(ShellCommand(name='cmake stage 1',
640 command=[cmake, "-G", "Ninja", "../llvm",
641 "-DCMAKE_BUILD_TYPE="+stage1_config,
642 "-DLLVM_ENABLE_ASSERTIONS=True",
643 "-DLLVM_LIT_ARGS="+lit_args,
644 "-DCMAKE_INSTALL_PREFIX=../"+stage1_install]
645 + extra_cmake_args,
646 haltOnFailure=True,
647 description='cmake stage 1',
648 workdir=stage1_build,
649 doStepIf=lambda step: step.build.getProperty("exists_ninja_1") != "OK",
650 env=env))
651
652 f.addStep(WarningCountingShellCommand(name='build stage 1',
653 command=ninja_cmd,
654 haltOnFailure=True,
655 description='ninja all',
656 workdir=stage1_build,
657 env=env))
658
659 if test and testStage1:
Renato Golind1c46742015-08-06 18:05:34 +0000660 haltOnStage1Check = not useTwoStage and not runTestSuite
Renato Golincfbd5702014-09-06 19:09:16 +0000661 f.addStep(lit_test_command.LitTestCommand(name='ninja check 1',
662 command=ninja_check_cmd,
Renato Golind1c46742015-08-06 18:05:34 +0000663 haltOnFailure=haltOnStage1Check,
Renato Golincfbd5702014-09-06 19:09:16 +0000664 description=["checking stage 1"],
665 descriptionDone=["stage 1 checked"],
666 workdir=stage1_build,
667 env=env))
Renato Goline402f582014-09-04 19:25:24 +0000668
Daniel Sandersfa222332015-12-04 14:30:39 +0000669 if useTwoStage or runTestSuite or stage1_upload_directory:
Renato Golin61aed7f2015-06-17 19:12:50 +0000670 f.addStep(ShellCommand(name='install stage 1',
671 command=ninja_install_cmd,
672 description='ninja install',
673 workdir=stage1_build,
Renato Goline402f582014-09-04 19:25:24 +0000674 env=env))
Renato Goline402f582014-09-04 19:25:24 +0000675
Daniel Sandersfa222332015-12-04 14:30:39 +0000676 if stage1_upload_directory:
677 addGCSUploadSteps(f, 'stage 1', stage1_install, stage1_upload_directory,
678 env, gcs_url_property='stage1_package_gcs_url')
679
Reid Kleckner25a26b02015-03-09 22:30:25 +0000680 # Compute the cmake define flag to set the C and C++ compiler to clang. Use
681 # clang-cl if we used MSVC for stage1.
682 if not vs:
683 cc = 'clang'
684 cxx = 'clang++'
685 else:
686 cc = 'clang-cl.exe'
687 cxx = 'clang-cl.exe'
688
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000689
Renato Golin61aed7f2015-06-17 19:12:50 +0000690 ############# STAGE 2
691 if useTwoStage:
Galina Kistanova79900972015-11-16 17:30:42 +0000692 # We always cleanly build the stage 2. If the compiler has been
693 # changed on the stage 1, we cannot trust any of the intermediate file
694 # from the old compiler. And if the stage 1 compiler is the same, we
695 # should not build in the first place.
696 f.addStep(ShellCommand(name='clean stage 2',
697 command=['rm','-rf',stage2_build],
698 warnOnFailure=True,
699 description='cleaning stage 2',
700 descriptionDone='clean',
701 workdir='.',
702 env=env))
Reid Kleckner25a26b02015-03-09 22:30:25 +0000703
Renato Golin61aed7f2015-06-17 19:12:50 +0000704 # Set the compiler using the CC and CXX environment variables to work around
705 # backslash string escaping bugs somewhere between buildbot and cmake. The
706 # env.exe helper is required to run the tests, so hopefully it's already on
707 # PATH.
708 cmake_cmd2 = ['env',
709 WithProperties('CC=%(workdir)s/'+stage1_install+'/bin/'+cc),
710 WithProperties('CXX=%(workdir)s/'+stage1_install+'/bin/'+cxx),
711 cmake, "-G", "Ninja", "../llvm",
712 "-DCMAKE_BUILD_TYPE="+stage2_config,
713 "-DLLVM_ENABLE_ASSERTIONS=True",
714 "-DLLVM_LIT_ARGS="+lit_args,
715 "-DCMAKE_INSTALL_PREFIX=../"+stage2_install] + extra_cmake_args
Reid Kleckner25a26b02015-03-09 22:30:25 +0000716
Renato Golin61aed7f2015-06-17 19:12:50 +0000717 f.addStep(ShellCommand(name='cmake stage 2',
718 command=cmake_cmd2,
719 haltOnFailure=True,
720 description='cmake stage 2',
721 workdir=stage2_build,
722 doStepIf=lambda step: step.build.getProperty("exists_ninja_2") != "OK",
723 env=env))
724
725 f.addStep(WarningCountingShellCommand(name='build stage 2',
726 command=ninja_cmd,
727 haltOnFailure=True,
728 description='ninja all',
729 workdir=stage2_build,
730 env=env))
731
732 if test:
733 f.addStep(lit_test_command.LitTestCommand(name='ninja check 2',
734 command=ninja_check_cmd,
735 haltOnFailure=not runTestSuite,
736 description=["checking stage 2"],
737 descriptionDone=["stage 2 checked"],
738 workdir=stage2_build,
739 env=env))
740
741 ############# TEST SUITE
742 ## Test-Suite (stage 2 if built, stage 1 otherwise)
743 if runTestSuite:
744 compiler_path = stage1_install
745 if useTwoStage:
746 compiler_path=stage2_install
747 f.addStep(ShellCommand(name='install stage 2',
748 command=ninja_install_cmd,
749 description='ninja install 2',
Renato Golincfbd5702014-09-06 19:09:16 +0000750 workdir=stage2_build,
751 env=env))
Renato Goline402f582014-09-04 19:25:24 +0000752
Renato Golin61aed7f2015-06-17 19:12:50 +0000753 # Get generated python, lnt
754 python = WithProperties('%(workdir)s/test/sandbox/bin/python')
755 lnt = WithProperties('%(workdir)s/test/sandbox/bin/lnt')
756 lnt_setup = WithProperties('%(workdir)s/test/lnt/setup.py')
757
758 # Paths
759 sandbox = WithProperties('%(workdir)s/test/sandbox')
760 test_suite_dir = WithProperties('%(workdir)s/test/test-suite')
761
762 # Get latest built Clang (stage1 or stage2)
763 cc = WithProperties('%(workdir)s/'+compiler_path+'/bin/'+cc)
764 cxx = WithProperties('%(workdir)s/'+compiler_path+'/bin/'+cxx)
765
Renato Golin593e0d62016-09-21 17:24:56 +0000766 # LNT Command line (don't pass -jN. Users need to pass both --threads
767 # and --build-threads in nt_flags to get the same effect)
Renato Golin61aed7f2015-06-17 19:12:50 +0000768 test_suite_cmd = [python, lnt, 'runtest', 'nt',
Renato Golin61aed7f2015-06-17 19:12:50 +0000769 '--no-timestamp',
770 '--sandbox', sandbox,
771 '--test-suite', test_suite_dir,
772 '--cc', cc,
773 '--cxx', cxx]
774 # Append any option provided by the user
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000775 test_suite_cmd.extend(nt_flags)
Renato Golin61aed7f2015-06-17 19:12:50 +0000776 # Only submit if a URL has been specified
777 if submitURL is not None:
778 if not isinstance(submitURL, list):
779 submitURL = [submitURL]
780 for url in submitURL:
781 test_suite_cmd.extend(['--submit', url])
782 if testerName:
783 test_suite_cmd.extend(['--no-machdep-info', testerName])
784 # CC and CXX are needed as env for build-tools
Renato Goline6c1b3b2015-07-01 15:52:22 +0000785 test_suite_env = copy.deepcopy(env)
Renato Golin61aed7f2015-06-17 19:12:50 +0000786 test_suite_env['CC'] = cc
787 test_suite_env['CXX'] = cxx
788
789 # Steps to prepare, build and run LNT
790 f.addStep(ShellCommand(name='clean sandbox',
791 command=['rm', '-rf', 'sandbox'],
792 haltOnFailure=True,
793 description='removing sandbox directory',
794 workdir='test',
795 env=env))
796 f.addStep(ShellCommand(name='recreate sandbox',
797 command=['virtualenv', 'sandbox'],
798 haltOnFailure=True,
799 description='recreating sandbox',
800 workdir='test',
801 env=env))
802 f.addStep(ShellCommand(name='setup lit',
803 command=[python, lnt_setup, 'develop'],
804 haltOnFailure=True,
805 description='setting up LNT in sandbox',
806 workdir='test/sandbox',
807 env=env))
808 f.addStep(commands.LitTestCommand.LitTestCommand(
809 name='test-suite',
810 command=test_suite_cmd,
811 haltOnFailure=True,
812 description=['running the test suite'],
813 workdir='test/sandbox',
814 logfiles={'configure.log' : 'build/configure.log',
815 'build-tools.log' : 'build/build-tools.log',
816 'test.log' : 'build/test.log',
817 'report.json' : 'build/report.json'},
818 env=test_suite_env))
819
Renato Goline402f582014-09-04 19:25:24 +0000820 return f
821
Daniel Dunbarc51a59e2010-09-23 14:57:45 +0000822def getClangMSVCBuildFactory(update=True, clean=True, vcDrive='c', jobs=1, cmake=r"cmake"):
Daniel Dunbar44abe742009-07-19 01:59:03 +0000823 f = buildbot.process.factory.BuildFactory()
824
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000825 if update:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000826 f.addStep(SVN(name='svn-llvm',
827 mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
828 defaultBranch='trunk',
829 workdir='llvm'))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000830 f.addStep(SVN(name='svn-clang',
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000831 mode='update', baseURL='http://llvm.org/svn/llvm-project/cfe/',
Daniel Dunbar44abe742009-07-19 01:59:03 +0000832 defaultBranch='trunk',
833 workdir='llvm/tools/clang'))
David Blaikie845ae0d2012-08-10 00:51:38 +0000834 f.addStep(SVN(name='svn-clang-tools-extra',
835 mode='update', baseURL='http://llvm.org/svn/llvm-project/clang-tools-extra/',
836 defaultBranch='trunk',
837 workdir='llvm/tools/clang/tools/extra'))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000838
839 # Full & fast clean.
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000840 if clean:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000841 f.addStep(ShellCommand(name='clean-1',
842 command=['del','/s/q','build'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000843 warnOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000844 description='cleaning',
845 descriptionDone='clean',
846 workdir='llvm'))
847 f.addStep(ShellCommand(name='clean-2',
848 command=['rmdir','/s/q','build'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000849 warnOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000850 description='cleaning',
851 descriptionDone='clean',
852 workdir='llvm'))
853
854 # Create the project files.
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000855
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000856 # Use batch files instead of ShellCommand directly, Windows quoting is
857 # borked. FIXME: See buildbot ticket #595 and buildbot ticket #377.
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000858 f.addStep(batch_file_download.BatchFileDownload(name='cmakegen',
Daniel Dunbar06b20f12010-04-08 18:29:38 +0000859 command=[cmake,
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000860 "-DLLVM_TARGETS_TO_BUILD:=X86",
Daniel Dunbar1ddedce2010-09-24 19:57:34 +0000861 "-DLLVM_INCLUDE_EXAMPLES:=OFF",
862 "-DLLVM_INCLUDE_TESTS:=OFF",
863 "-DLLVM_TARGETS_TO_BUILD:=X86",
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000864 "-G",
865 "Visual Studio 9 2008",
866 ".."],
867 workdir="llvm\\build"))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000868 f.addStep(ShellCommand(name='cmake',
869 command=['cmakegen.bat'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000870 haltOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000871 description='cmake gen',
872 workdir='llvm\\build'))
873
874 # Build it.
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000875 f.addStep(batch_file_download.BatchFileDownload(name='vcbuild',
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000876 command=[vcDrive + r""":\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages\vcbuild.exe""",
877 "/M%d" % jobs,
878 "LLVM.sln",
879 "Debug|Win32"],
880 workdir="llvm\\build"))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000881 f.addStep(WarningCountingShellCommand(name='vcbuild',
882 command=['vcbuild.bat'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000883 haltOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000884 description='vcbuild',
885 workdir='llvm\\build',
886 warningPattern=" warning C.*:"))
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000887
888 # Build clang-test project.
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000889 f.addStep(batch_file_download.BatchFileDownload(name='vcbuild_test',
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000890 command=[vcDrive + r""":\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages\vcbuild.exe""",
891 "clang-test.vcproj",
892 "Debug|Win32"],
893 workdir="llvm\\build\\tools\\clang\\test"))
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000894 f.addStep(lit_test_command.LitTestCommand(name='test-clang',
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000895 command=["vcbuild_test.bat"],
896 workdir="llvm\\build\\tools\\clang\\test"))
897
Daniel Dunbar44abe742009-07-19 01:59:03 +0000898 return f
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000899
Daniel Dunbar7363d032011-02-27 03:22:35 +0000900def addClangGCCTests(f, ignores={}, install_prefix="%(builddir)s/llvm.install",
901 languages = ('gcc', 'g++', 'objc', 'obj-c++')):
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000902 make_vars = [WithProperties(
Daniel Dunbar2b67e8f2011-02-11 21:03:41 +0000903 'CC_UNDER_TEST=%s/bin/clang' % install_prefix),
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000904 WithProperties(
Daniel Dunbar2b67e8f2011-02-11 21:03:41 +0000905 'CXX_UNDER_TEST=%s/bin/clang++' % install_prefix)]
David Blaikie05517332013-12-19 23:29:12 +0000906 f.addStep(SVN(name='svn-clang-gcc-tests', mode='update',
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000907 baseURL='http://llvm.org/svn/llvm-project/clang-tests/',
908 defaultBranch='trunk', workdir='clang-tests'))
909 gcc_dg_ignores = ignores.get('gcc-4_2-testsuite', {})
Daniel Dunbar2b67e8f2011-02-11 21:03:41 +0000910 for lang in languages:
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000911 f.addStep(commands.SuppressionDejaGNUCommand.SuppressionDejaGNUCommand(
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000912 name='test-gcc-4_2-testsuite-%s' % lang,
913 command=["make", "-k", "check-%s" % lang] + make_vars,
914 description="gcc-4_2-testsuite (%s)" % lang,
915 workdir='clang-tests/gcc-4_2-testsuite',
David Dean2bd0c3a2011-10-18 16:36:28 +0000916 logfiles={ 'dg.sum' : 'obj/%s/%s.sum' % (lang, lang),
917 '%s.log' % lang : 'obj/%s/%s.log' % (lang, lang)},
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000918 ignore=gcc_dg_ignores.get(lang, [])))
Daniel Dunbar2b67e8f2011-02-11 21:03:41 +0000919
Daniel Dunbar7363d032011-02-27 03:22:35 +0000920def addClangGDBTests(f, ignores={}, install_prefix="%(builddir)s/llvm.install"):
921 make_vars = [WithProperties(
922 'CC_UNDER_TEST=%s/bin/clang' % install_prefix),
923 WithProperties(
924 'CXX_UNDER_TEST=%s/bin/clang++' % install_prefix)]
David Blaikie05517332013-12-19 23:29:12 +0000925 f.addStep(SVN(name='svn-clang-gdb-tests', mode='update',
Daniel Dunbar7363d032011-02-27 03:22:35 +0000926 baseURL='http://llvm.org/svn/llvm-project/clang-tests/',
927 defaultBranch='trunk', workdir='clang-tests'))
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000928 f.addStep(commands.SuppressionDejaGNUCommand.SuppressionDejaGNUCommand(
Daniel Dunbar7363d032011-02-27 03:22:35 +0000929 name='test-gdb-1472-testsuite',
930 command=["make", "-k", "check"] + make_vars,
931 description="gdb-1472-testsuite",
932 workdir='clang-tests/gdb-1472-testsuite',
David Blaikie7ec695f2012-10-09 22:17:09 +0000933 logfiles={ 'dg.sum' : 'obj/filtered.gdb.sum',
David Blaikie624f4392012-11-05 22:34:35 +0000934 'gdb.log' : 'obj/gdb.log' }))
Daniel Dunbar7363d032011-02-27 03:22:35 +0000935
David Blaikie41d09c32013-01-02 21:11:09 +0000936def addModernClangGDBTests(f, jobs, install_prefix):
David Blaikie1bc5c372012-12-05 05:29:12 +0000937 make_vars = [WithProperties('RUNTESTFLAGS=CC_FOR_TARGET=\'{0}/bin/clang\' '
938 'CXX_FOR_TARGET=\'{0}/bin/clang++\' '
David Blaikie759bb752013-04-18 23:13:11 +0000939 'CFLAGS_FOR_TARGET=\'-w -fno-limit-debug-info\''
David Blaikief89877b2013-01-29 23:46:26 +0000940 .format(install_prefix))]
David Blaikie05517332013-12-19 23:29:12 +0000941 f.addStep(SVN(name='svn-clang-modern-gdb-tests', mode='update',
David Blaikief3f300b2012-11-17 01:13:41 +0000942 svnurl='http://llvm.org/svn/llvm-project/clang-tests-external/trunk/gdb/7.5',
David Blaikiedad03d52012-11-16 22:37:12 +0000943 workdir='clang-tests/src'))
David Blaikieb83bfdf2012-12-05 04:33:42 +0000944 f.addStep(Configure(command='../src/configure',
David Blaikief3f300b2012-11-17 01:13:41 +0000945 workdir='clang-tests/build/'))
David Blaikieb83bfdf2012-12-05 04:33:42 +0000946 f.addStep(WarningCountingShellCommand(name='gdb-75-build',
947 command=['make', WithProperties('-j%s' % jobs)],
948 haltOnFailure=True,
949 workdir='clang-tests/build'))
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000950 f.addStep(commands.DejaGNUCommand.DejaGNUCommand(
David Blaikiedad03d52012-11-16 22:37:12 +0000951 name='gdb-75-check',
David Blaikieb83bfdf2012-12-05 04:33:42 +0000952 command=['make', '-k', WithProperties('-j%s' % jobs), 'check'] + make_vars,
David Blaikiedad03d52012-11-16 22:37:12 +0000953 workdir='clang-tests/build',
David Blaikie1bc5c372012-12-05 05:29:12 +0000954 logfiles={'dg.sum':'gdb/testsuite/gdb.sum',
955 'gdb.log':'gdb/testsuite/gdb.log'}))
David Blaikiedad03d52012-11-16 22:37:12 +0000956
957
958
Daniel Dunbar7363d032011-02-27 03:22:35 +0000959# FIXME: Deprecated.
960addClangTests = addClangGCCTests
961
Daniel Dunbar2b67e8f2011-02-11 21:03:41 +0000962def getClangTestsIgnoresFromPath(path, key):
963 def readList(path):
964 if not os.path.exists(path):
965 return []
966
967 f = open(path)
968 lines = [ln.strip() for ln in f]
969 f.close()
970 return lines
971
972 ignores = {}
973
974 gcc_dg_ignores = {}
975 for lang in ('gcc', 'g++', 'objc', 'obj-c++'):
976 lang_path = os.path.join(path, 'gcc-4_2-testsuite', 'expected_results',
977 key, lang)
978 gcc_dg_ignores[lang] = (
979 readList(os.path.join(lang_path, 'FAIL.txt')) +
980 readList(os.path.join(lang_path, 'UNRESOLVED.txt')) +
981 readList(os.path.join(lang_path, 'XPASS.txt')))
982 ignores['gcc-4_2-testsuite' ] = gcc_dg_ignores
983
Daniel Dunbar7363d032011-02-27 03:22:35 +0000984 ignores_path = os.path.join(path, 'gdb-1472-testsuite', 'expected_results',
985 key)
986 gdb_dg_ignores = (
987 readList(os.path.join(ignores_path, 'FAIL.txt')) +
988 readList(os.path.join(ignores_path, 'UNRESOLVED.txt')) +
989 readList(os.path.join(ignores_path, 'XPASS.txt')))
990 ignores['gdb-1472-testsuite' ] = gdb_dg_ignores
991
Daniel Dunbar2b67e8f2011-02-11 21:03:41 +0000992 return ignores