blob: 43d5862c06d85cc159577c44db0dbbd8c1e57709 [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
Galina Kistanova49cbd602017-04-14 23:46:03 +000019from zorg.buildbot.conditions.FileConditions import FileDoesNotExist
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000020
Galina Kistanovaf4d79352011-10-20 20:46:52 +000021def getClangBuildFactory(
22 triple=None,
23 clean=True,
24 test=True,
25 package_dst=None,
26 run_cxx_tests=False,
27 examples=False,
28 valgrind=False,
29 valgrindLeakCheck=False,
Galina Kistanovaf4d79352011-10-20 20:46:52 +000030 useTwoStage=False,
31 completely_clean=False,
Galina Kistanovaf4d79352011-10-20 20:46:52 +000032 make='make',
33 jobs="%(jobs)s",
34 stage1_config='Debug+Asserts',
35 stage2_config='Release+Asserts',
36 env={}, # Environmental variables for all steps.
37 extra_configure_args=[],
Vassil Vassilev5a9b9ed2016-05-25 17:10:03 +000038 stage2_extra_configure_args=[],
Galina Kistanovaf4d79352011-10-20 20:46:52 +000039 use_pty_in_tests=False,
Peter Collingbourned49ac282011-10-25 14:38:45 +000040 trunk_revision=None,
41 force_checkout=False,
Peter Collingbourne7a95b0c2011-10-26 16:40:17 +000042 extra_clean_step=None,
David Blaikiea76da842012-08-13 22:24:46 +000043 checkout_compiler_rt=False,
Galina Kistanova2ab1e2d2016-11-22 00:23:43 +000044 checkout_lld=False,
David Blaikiea76da842012-08-13 22:24:46 +000045 run_gdb=False,
David Blaikiedad03d52012-11-16 22:37:12 +000046 run_modern_gdb=False,
Vassil Vassilev0c647ef2016-06-30 21:16:45 +000047 run_gcc=False):
Galina Kistanovaf4d79352011-10-20 20:46:52 +000048 # Prepare environmental variables. Set here all env we want everywhere.
49 merged_env = {
50 'TERM' : 'dumb' # Make sure Clang doesn't use color escape sequences.
51 }
52 if env is not None:
53 # Overwrite pre-set items with the given ones, so user can set anything.
54 merged_env.update(env)
David Blaikie2f7eb282012-08-24 18:37:00 +000055
Jonathan Roelofs62415e52015-02-28 00:03:17 +000056 llvm_srcdir = "llvm.src"
57 llvm_1_objdir = "llvm.obj"
58 llvm_1_installdir = "llvm.install.1"
59 llvm_2_objdir = "llvm.obj.2"
60 llvm_2_installdir = "llvm.install"
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000061
Daniel Dunbar235aa412009-07-18 07:16:15 +000062 f = buildbot.process.factory.BuildFactory()
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000063
64 # Determine the build directory.
65 f.addStep(buildbot.steps.shell.SetProperty(name="get_builddir",
66 command=["pwd"],
67 property="builddir",
68 description="set build dir",
Galina Kistanovaf4d79352011-10-20 20:46:52 +000069 workdir=".",
70 env=merged_env))
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000071
Daniel Dunbar06b20f12010-04-08 18:29:38 +000072 # Blow away completely, if requested.
73 if completely_clean:
74 f.addStep(ShellCommand(name="rm-llvm.src",
75 command=["rm", "-rf", llvm_srcdir],
76 haltOnFailure=True,
77 description=["rm src dir", "llvm"],
Galina Kistanovaf4d79352011-10-20 20:46:52 +000078 workdir=".",
79 env=merged_env))
Daniel Dunbar06b20f12010-04-08 18:29:38 +000080
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000081 # Checkout sources.
Peter Collingbourned49ac282011-10-25 14:38:45 +000082 if trunk_revision:
83 # The SVN build step provides no mechanism to check out a specific revision
84 # based on a property, so just run the commands directly here.
85 svn_co = ['svn', 'checkout']
86 if force_checkout:
87 svn_co += ['--force']
88 svn_co += ['--revision', WithProperties(trunk_revision)]
89
90 svn_co_llvm = svn_co + \
91 [WithProperties('http://llvm.org/svn/llvm-project/llvm/trunk@%s' %
92 trunk_revision),
93 llvm_srcdir]
94 svn_co_clang = svn_co + \
95 [WithProperties('http://llvm.org/svn/llvm-project/cfe/trunk@%s' %
96 trunk_revision),
97 '%s/tools/clang' % llvm_srcdir]
David Blaikie845ae0d2012-08-10 00:51:38 +000098 svn_co_clang_tools_extra = svn_co + \
99 [WithProperties('http://llvm.org/svn/llvm-project/clang-tools-extra/trunk@%s' %
100 trunk_revision),
101 '%s/tools/clang/tools/extra' % llvm_srcdir]
Peter Collingbourned49ac282011-10-25 14:38:45 +0000102
103 f.addStep(ShellCommand(name='svn-llvm',
104 command=svn_co_llvm,
105 haltOnFailure=True,
106 workdir='.'))
107 f.addStep(ShellCommand(name='svn-clang',
108 command=svn_co_clang,
109 haltOnFailure=True,
110 workdir='.'))
David Blaikie845ae0d2012-08-10 00:51:38 +0000111 f.addStep(ShellCommand(name='svn-clang-tools-extra',
112 command=svn_co_clang_tools_extra,
113 haltOnFailure=True,
114 workdir='.'))
Peter Collingbourned49ac282011-10-25 14:38:45 +0000115 else:
116 f.addStep(SVN(name='svn-llvm',
Daniel Dunbarf4e23eb2010-09-20 21:13:02 +0000117 mode='update',
Peter Collingbourned49ac282011-10-25 14:38:45 +0000118 baseURL='http://llvm.org/svn/llvm-project/llvm/',
Daniel Dunbarf4e23eb2010-09-20 21:13:02 +0000119 defaultBranch='trunk',
Peter Collingbourned49ac282011-10-25 14:38:45 +0000120 workdir=llvm_srcdir))
121 f.addStep(SVN(name='svn-clang',
122 mode='update',
123 baseURL='http://llvm.org/svn/llvm-project/cfe/',
124 defaultBranch='trunk',
125 workdir='%s/tools/clang' % llvm_srcdir))
David Blaikie845ae0d2012-08-10 00:51:38 +0000126 f.addStep(SVN(name='svn-clang-tools-extra',
127 mode='update',
128 baseURL='http://llvm.org/svn/llvm-project/clang-tools-extra/',
129 defaultBranch='trunk',
130 workdir='%s/tools/clang/tools/extra' % llvm_srcdir))
Peter Collingbourned49ac282011-10-25 14:38:45 +0000131 if checkout_compiler_rt:
132 f.addStep(SVN(name='svn-compiler-rt',
133 mode='update',
134 baseURL='http://llvm.org/svn/llvm-project/compiler-rt/',
135 defaultBranch='trunk',
136 workdir='%s/projects/compiler-rt' % llvm_srcdir))
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000137
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000138 # Clean up llvm (stage 1); unless in-dir.
139 if clean and llvm_srcdir != llvm_1_objdir:
140 f.addStep(ShellCommand(name="rm-llvm.obj.stage1",
141 command=["rm", "-rf", llvm_1_objdir],
142 haltOnFailure=True,
143 description=["rm build dir", "llvm"],
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000144 workdir=".",
145 env=merged_env))
Andrew Trick70fa9d22011-08-25 23:38:51 +0000146
David Blaikie8cbf62f2013-01-12 21:32:31 +0000147 if not clean:
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000148 expected_makefile = 'Makefile'
David Blaikie8cbf62f2013-01-12 21:32:31 +0000149 f.addStep(SetProperty(name="Makefile_isready",
150 workdir=llvm_1_objdir,
151 command=["sh", "-c",
Richard Smith02389162014-09-26 23:53:06 +0000152 "test -e %s && echo OK || echo Missing" % expected_makefile],
David Blaikie8cbf62f2013-01-12 21:32:31 +0000153 flunkOnFailure=False,
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000154 property="exists_Makefile"))
Richard Smith02389162014-09-26 23:53:06 +0000155
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000156 cmake_triple_arg = []
157 if triple:
158 cmake_triple_arg = ['-DLLVM_HOST_TRIPLE=%s' % triple]
159 f.addStep(ShellCommand(name='cmake',
160 command=['cmake',
161 '-DLLVM_BUILD_TESTS=ON',
162 '-DCMAKE_BUILD_TYPE=%s' % stage1_config] +
163 cmake_triple_arg +
164 extra_configure_args +
165 ["../" + llvm_srcdir],
166 description='cmake stage1',
167 workdir=llvm_1_objdir,
168 env=merged_env,
169 doStepIf=lambda step: step.build.getProperty("exists_Makefile") != "OK"))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000170
171 # Make clean if using in-dir builds.
172 if clean and llvm_srcdir == llvm_1_objdir:
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000173 f.addStep(WarningCountingShellCommand(name="clean-llvm",
Daniel Dunbard20468a2009-11-24 18:27:23 +0000174 command=[make, "clean"],
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000175 haltOnFailure=True,
176 description="cleaning llvm",
177 descriptionDone="clean llvm",
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000178 workdir=llvm_1_objdir,
Peter Collingbourne7a95b0c2011-10-26 16:40:17 +0000179 doStepIf=clean,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000180 env=merged_env))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000181
Peter Collingbourne7a95b0c2011-10-26 16:40:17 +0000182 if extra_clean_step:
183 f.addStep(extra_clean_step)
184
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000185 f.addStep(WarningCountingShellCommand(name="compile",
Daniel Dunbard20468a2009-11-24 18:27:23 +0000186 command=['nice', '-n', '10',
187 make, WithProperties("-j%s" % jobs)],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000188 haltOnFailure=True,
David Blaikie05517332013-12-19 23:29:12 +0000189 flunkOnFailure=not run_gdb,
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000190 description=["compiling", stage1_config],
191 descriptionDone=["compile", stage1_config],
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000192 workdir=llvm_1_objdir,
193 env=merged_env))
Daniel Dunbar256fed42009-11-25 21:11:08 +0000194
195 if examples:
196 f.addStep(WarningCountingShellCommand(name="compile.examples",
197 command=['nice', '-n', '10',
198 make, WithProperties("-j%s" % jobs),
199 "BUILD_EXAMPLES=1"],
200 haltOnFailure=True,
Richard Smith65e6f5d2014-09-25 18:18:35 +0000201 description=["compiling", stage1_config, "examples"],
Daniel Dunbar256fed42009-11-25 21:11:08 +0000202 descriptionDone=["compile", stage1_config, "examples"],
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000203 workdir=llvm_1_objdir,
204 env=merged_env))
Daniel Dunbar256fed42009-11-25 21:11:08 +0000205
NAKAMURA Takumi1a4666b2013-01-19 03:39:07 +0000206 clangTestArgs = '-v -j %s' % jobs
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000207 if valgrind:
Daniel Dunbar89184b92010-04-18 19:09:32 +0000208 clangTestArgs += ' --vg'
Daniel Dunbara1bebce2010-03-21 01:24:00 +0000209 if valgrindLeakCheck:
210 clangTestArgs += ' --vg-leak'
Nick Lewycky8d26e472011-08-27 21:18:56 +0000211 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 +0000212 extraTestDirs = ''
213 if run_cxx_tests:
214 extraTestDirs += '%(builddir)s/llvm/tools/clang/utils/C++Tests'
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000215 if test:
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000216 f.addStep(lit_test_command.LitTestCommand(name='check-all',
David Blaikie7e6f8a12012-08-31 20:46:27 +0000217 command=[make, "check-all", "VERBOSE=1",
NAKAMURA Takumi1a4666b2013-01-19 03:39:07 +0000218 WithProperties("LIT_ARGS=%s" % clangTestArgs),
David Blaikiebc684012012-12-27 20:44:19 +0000219 WithProperties("EXTRA_TESTDIRS=%s" % extraTestDirs)],
David Blaikie05517332013-12-19 23:29:12 +0000220 flunkOnFailure=not run_gdb,
David Blaikie7e6f8a12012-08-31 20:46:27 +0000221 description=["checking"],
222 descriptionDone=["checked"],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000223 workdir=llvm_1_objdir,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000224 usePTY=use_pty_in_tests,
225 env=merged_env))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000226
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000227 # TODO: Install llvm and clang for stage1.
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000228
David Blaikiedad03d52012-11-16 22:37:12 +0000229 if run_gdb or run_gcc or run_modern_gdb:
David Blaikiea76da842012-08-13 22:24:46 +0000230 ignores = getClangTestsIgnoresFromPath(os.path.expanduser('~/public/clang-tests'), 'clang-x86_64-darwin10')
231 install_prefix = "%%(builddir)s/%s" % llvm_1_installdir
232 if run_gdb:
233 addClangGDBTests(f, ignores, install_prefix)
David Blaikiedad03d52012-11-16 22:37:12 +0000234 if run_modern_gdb:
David Blaikie41d09c32013-01-02 21:11:09 +0000235 addModernClangGDBTests(f, jobs, install_prefix)
David Blaikiea76da842012-08-13 22:24:46 +0000236 if run_gcc:
237 addClangGCCTests(f, ignores, install_prefix)
238
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000239 if not useTwoStage:
Daniel Dunbardedf6572010-11-13 00:23:34 +0000240 if package_dst:
241 name = WithProperties(
242 "%(builddir)s/" + llvm_1_objdir +
243 "/clang-r%(got_revision)s-b%(buildnumber)s.tgz")
244 f.addStep(ShellCommand(name='pkg.tar',
245 description="tar root",
246 command=["tar", "zcvf", name, "./"],
247 workdir=llvm_1_installdir,
248 warnOnFailure=True,
249 flunkOnFailure=False,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000250 haltOnFailure=False,
251 env=merged_env))
Daniel Dunbardedf6572010-11-13 00:23:34 +0000252 f.addStep(ShellCommand(name='pkg.upload',
Andrew Trick70fa9d22011-08-25 23:38:51 +0000253 description="upload root",
Daniel Dunbardedf6572010-11-13 00:23:34 +0000254 command=["scp", name,
255 WithProperties(
256 package_dst + "/%(buildername)s")],
257 workdir=".",
258 warnOnFailure=True,
259 flunkOnFailure=False,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000260 haltOnFailure=False,
261 env=merged_env))
Daniel Dunbardedf6572010-11-13 00:23:34 +0000262
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000263 return f
264
265 # Clean up llvm (stage 2).
Richard Smith02389162014-09-26 23:53:06 +0000266 #
Galina Kistanova79900972015-11-16 17:30:42 +0000267 # We always cleanly build the stage 2. If the compiler has been
268 # changed on the stage 1, we cannot trust any of the intermediate file
269 # from the old compiler. And if the stage 1 compiler is the same, we should
270 # not build in the first place.
271 f.addStep(ShellCommand(name="rm-llvm.obj.stage2",
272 command=["rm", "-rf", llvm_2_objdir],
273 haltOnFailure=True,
274 description=["rm build dir", "llvm", "(stage 2)"],
275 workdir=".",
276 env=merged_env))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000277
278 # Configure llvm (stage 2).
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000279 f.addStep(ShellCommand(name='cmake',
Vassil Vassilev5a9b9ed2016-05-25 17:10:03 +0000280 command=['cmake'] + stage2_extra_configure_args + [
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000281 '-DLLVM_BUILD_TESTS=ON',
282 WithProperties('-DCMAKE_C_COMPILER=%%(builddir)s/%s/bin/clang' % llvm_1_objdir), # FIXME use installdir
283 WithProperties('-DCMAKE_CXX_COMPILER=%%(builddir)s/%s/bin/clang++' % llvm_1_objdir),
284 '-DCMAKE_BUILD_TYPE=%s' % stage2_config,
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000285 "../" + llvm_srcdir],
286 description='cmake stage2',
287 workdir=llvm_2_objdir,
288 env=merged_env))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000289
290 # Build llvm (stage 2).
291 f.addStep(WarningCountingShellCommand(name="compile.llvm.stage2",
292 command=['nice', '-n', '10',
293 make, WithProperties("-j%s" % jobs)],
294 haltOnFailure=True,
295 description=["compiling", "(stage 2)",
296 stage2_config],
297 descriptionDone=["compile", "(stage 2)",
298 stage2_config],
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000299 workdir=llvm_2_objdir,
300 env=merged_env))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000301
302 if test:
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000303 f.addStep(lit_test_command.LitTestCommand(name='check-all',
David Blaikie7e6f8a12012-08-31 20:46:27 +0000304 command=[make, "check-all", "VERBOSE=1",
NAKAMURA Takumi1a4666b2013-01-19 03:39:07 +0000305 WithProperties("LIT_ARGS=%s" % clangTestArgs),
David Blaikiebc684012012-12-27 20:44:19 +0000306 WithProperties("EXTRA_TESTDIRS=%s" % extraTestDirs)],
David Blaikie7e6f8a12012-08-31 20:46:27 +0000307 description=["checking"],
308 descriptionDone=["checked"],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000309 workdir=llvm_2_objdir,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000310 usePTY=use_pty_in_tests,
311 env=merged_env))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000312
Galina Kistanovaa06e4c82016-04-14 21:41:30 +0000313 # TODO: Install llvm and clang for stage2.
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000314
315 if package_dst:
316 name = WithProperties(
317 "%(builddir)s/" + llvm_2_objdir +
318 "/clang-r%(got_revision)s-b%(buildnumber)s.tgz")
319 f.addStep(ShellCommand(name='pkg.tar',
320 description="tar root",
321 command=["tar", "zcvf", name, "./"],
322 workdir=llvm_2_installdir,
323 warnOnFailure=True,
324 flunkOnFailure=False,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000325 haltOnFailure=False,
326 env=merged_env))
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000327 f.addStep(ShellCommand(name='pkg.upload',
Andrew Trick70fa9d22011-08-25 23:38:51 +0000328 description="upload root",
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000329 command=["scp", name,
330 WithProperties(
331 package_dst + "/%(buildername)s")],
332 workdir=".",
333 warnOnFailure=True,
334 flunkOnFailure=False,
Galina Kistanovaf4d79352011-10-20 20:46:52 +0000335 haltOnFailure=False,
336 env=merged_env))
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000337
Daniel Dunbar235aa412009-07-18 07:16:15 +0000338 return f
Daniel Dunbar44abe742009-07-19 01:59:03 +0000339
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000340def addSVNUpdateSteps(f,
341 checkout_clang_tools_extra,
342 checkout_compiler_rt,
Renato Golin0bd2a532016-11-20 16:14:35 +0000343 checkout_test_suite,
Artem Belevich16fcd0e2016-12-21 21:15:56 +0000344 checkout_lld,
345 checkout_libcxx):
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000346 # We *must* checkout at least Clang+LLVM
347 f.addStep(SVN(name='svn-llvm',
348 mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
349 defaultBranch='trunk',
350 workdir='llvm'))
351 f.addStep(SVN(name='svn-clang',
352 mode='update', baseURL='http://llvm.org/svn/llvm-project/cfe/',
353 defaultBranch='trunk',
354 workdir='llvm/tools/clang'))
355
356 # Extra stuff that will be built/tested
357 if checkout_clang_tools_extra:
358 f.addStep(SVN(name='svn-clang-tools-extra',
359 mode='update', baseURL='http://llvm.org/svn/llvm-project/clang-tools-extra/',
360 defaultBranch='trunk',
361 workdir='llvm/tools/clang/tools/extra'))
362 if checkout_compiler_rt:
363 f.addStep(SVN(name='svn-compiler-rt',
364 mode='update', baseURL='http://llvm.org/svn/llvm-project/compiler-rt/',
365 defaultBranch='trunk',
366 workdir='llvm/projects/compiler-rt'))
367 if checkout_test_suite:
368 f.addStep(SVN(name='svn-lnt',
369 mode='update', baseURL='http://llvm.org/svn/llvm-project/lnt/',
370 defaultBranch='trunk',
371 workdir='test/lnt'))
372 f.addStep(SVN(name='svn-test-suite',
Galina Kistanovaa86d0c72018-04-04 00:54:30 +0000373 mode='update', baseURL='https://llvm.org/svn/llvm-project/test-suite/',
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000374 defaultBranch='trunk',
375 workdir='test/test-suite'))
Renato Golin0bd2a532016-11-20 16:14:35 +0000376 if checkout_lld:
377 f.addStep(SVN(name='svn-lld',
378 mode='update', baseURL='http://llvm.org/svn/llvm-project/lld/',
379 defaultBranch='trunk',
380 workdir='llvm/tools/lld'))
Artem Belevich16fcd0e2016-12-21 21:15:56 +0000381 if checkout_libcxx:
382 f.addStep(SVN(name='svn-libcxx',
383 mode='update',
384 baseURL='http://llvm.org/svn/llvm-project/libcxx/',
385 defaultBranch='trunk',
386 workdir='llvm/projects/libcxx'))
387 f.addStep(SVN(name='svn-libcxxabi',
388 mode='update',
389 baseURL='http://llvm.org/svn/llvm-project/libcxxabi/',
390 defaultBranch='trunk',
391 workdir='llvm/projects/libcxxabi'))
392 f.addStep(SVN(name='svn-libunwind',
393 mode='update',
394 baseURL='http://llvm.org/svn/llvm-project/libunwind/',
395 defaultBranch='trunk',
396 workdir='llvm/projects/libunwind'))
Renato Goline402f582014-09-04 19:25:24 +0000397
Daniel Sandersfa222332015-12-04 14:30:39 +0000398def addGCSUploadSteps(f, package_name, install_prefix, gcs_directory, env,
Leandro Nunes7b83ba42018-06-25 13:54:50 +0000399 gcs_url_property=None, use_pixz_compression=False,
400 xz_compression_factor=6):
Daniel Sandersfa222332015-12-04 14:30:39 +0000401 """
402 Add steps to upload to the Google Cloud Storage bucket.
403
404 f - The BuildFactory to modify.
405 package_name - The name of this package for the descriptions (e.g.
406 'stage 1')
407 install_prefix - The directory the build has been installed to.
408 gcs_directory - The subdirectory of the bucket root to upload to. This
409 should match the builder name.
410 env - The environment to use. Set BOTO_CONFIG to use a configuration file
411 in a non-standard location, and BUCKET to use a different GCS bucket.
412 gcs_url_property - Property to assign the GCS url to.
413 """
414
415 gcs_url_fmt = ('gs://%(gcs_bucket)s/%(gcs_directory)s/'
416 'clang-r%(got_revision)s-t%(now)s-b%(buildnumber)s.tar.xz')
417 time_fmt = '%Y-%m-%d_%H-%M-%S'
Leandro Nunes7b83ba42018-06-25 13:54:50 +0000418 output_file_name = '../install.tar.xz'
419
Daniel Sandersfa222332015-12-04 14:30:39 +0000420 gcs_url = \
421 WithProperties(
422 gcs_url_fmt,
423 gcs_bucket=lambda _: env.get('BUCKET', 'llvm-build-artifacts'),
424 gcs_directory=lambda _: gcs_directory,
425 now=lambda _: datetime.utcnow().strftime(time_fmt))
426
427 if gcs_url_property:
428 f.addStep(SetProperty(
429 name="record GCS url for " + package_name,
430 command=['echo', gcs_url],
431 property=gcs_url_property))
432
Leandro Nunes7b83ba42018-06-25 13:54:50 +0000433 if use_pixz_compression:
434 # tweak the xz compression level to generate packages faster
435 tar_command = ['tar', '-Ipixz', '-cvf', output_file_name, '.']
436 else:
437 xz_command = 'xz -{0}'.format(xz_compression_factor)
438 tar_command = ['tar', '-I', xz_command, '-cvf', output_file_name, '.']
439
Daniel Sandersfa222332015-12-04 14:30:39 +0000440 f.addStep(ShellCommand(name='package ' + package_name,
Leandro Nunes7b83ba42018-06-25 13:54:50 +0000441 command=tar_command,
Daniel Sandersfa222332015-12-04 14:30:39 +0000442 description='packaging ' + package_name + '...',
443 workdir=install_prefix,
444 env=env))
445
446 f.addStep(ShellCommand(
447 name='upload ' + package_name + ' to storage bucket',
448 command=['gsutil', 'cp', '../install.tar.xz', gcs_url],
449 description=('uploading ' + package_name +
450 'to storage bucket ...'),
451 workdir=install_prefix,
452 env=env))
453
454def getClangCMakeGCSBuildFactory(
455 clean=True,
456 test=True,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000457 cmake='cmake',
Daniel Sandersfa222332015-12-04 14:30:39 +0000458 jobs=None,
459
460 # VS tools environment variable if using MSVC. For example,
461 # %VS120COMNTOOLS% selects the 2013 toolchain.
462 vs=None,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000463 vs_target_arch='x86',
Stella Stamenova61f2e262018-10-25 20:30:08 +0000464 autodetectVS=False,
Daniel Sandersfa222332015-12-04 14:30:39 +0000465
466 # Multi-stage compilation
467 useTwoStage=False,
468 testStage1=True,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000469 stage1_config='Release',
470 stage2_config='Release',
Daniel Sandersfa222332015-12-04 14:30:39 +0000471
472 # Test-suite
473 runTestSuite=False,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000474 nt_flags=[],
Kristof Beylsf4639b52017-08-10 08:53:52 +0000475 testsuite_flags=[],
Daniel Sandersfa222332015-12-04 14:30:39 +0000476 submitURL=None,
477 testerName=None,
478
479 # Environmental variables for all steps.
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000480 env={},
481 extra_cmake_args=[],
Daniel Sandersfa222332015-12-04 14:30:39 +0000482
483 # Extra repositories
484 checkout_clang_tools_extra=True,
485 checkout_compiler_rt=True,
Renato Golin0bd2a532016-11-20 16:14:35 +0000486 checkout_lld=True,
Leandro Nunes7b83ba42018-06-25 13:54:50 +0000487 checkout_libcxx=False,
Daniel Sandersfa222332015-12-04 14:30:39 +0000488
489 # Upload artifacts to Google Cloud Storage (for the llvmbisect tool)
490 stage1_upload_directory=None,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000491
Leandro Nunes7b83ba42018-06-25 13:54:50 +0000492 # Use a lower compression level to generate the build-cache package faster.
493 # defuault is 6 according to xz documentation
494 xz_compression_factor=6,
495 use_pixz_compression=False,
496
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000497 # Triggers
498 trigger_after_stage1=[]):
Daniel Sandersfa222332015-12-04 14:30:39 +0000499 return _getClangCMakeBuildFactory(
Stella Stamenova61f2e262018-10-25 20:30:08 +0000500 clean=clean, test=test, cmake=cmake, jobs=jobs,
501 vs=vs, vs_target_arch=vs_target_arch, autodetectVS=autodetectVS,
502 useTwoStage=useTwoStage,
Daniel Sandersfa222332015-12-04 14:30:39 +0000503 testStage1=testStage1, stage1_config=stage1_config,
504 stage2_config=stage2_config, runTestSuite=runTestSuite,
Kristof Beylsf4639b52017-08-10 08:53:52 +0000505 nt_flags=nt_flags, testsuite_flags=testsuite_flags,
506 submitURL=submitURL, testerName=testerName,
Daniel Sandersfa222332015-12-04 14:30:39 +0000507 env=env, extra_cmake_args=extra_cmake_args,
508 checkout_clang_tools_extra=checkout_clang_tools_extra,
509 checkout_compiler_rt=checkout_compiler_rt,
Renato Golin0bd2a532016-11-20 16:14:35 +0000510 checkout_lld=checkout_lld,
Leandro Nunes7b83ba42018-06-25 13:54:50 +0000511 checkout_libcxx=checkout_libcxx,
Daniel Sandersfa222332015-12-04 14:30:39 +0000512 stage1_upload_directory=stage1_upload_directory,
Leandro Nunes7b83ba42018-06-25 13:54:50 +0000513 xz_compression_factor=xz_compression_factor,
514 use_pixz_compression=use_pixz_compression,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000515 trigger_after_stage1=trigger_after_stage1)
Reid Kleckner25a26b02015-03-09 22:30:25 +0000516
517def getClangCMakeBuildFactory(
518 clean=True,
519 test=True,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000520 cmake='cmake',
Reid Kleckner25a26b02015-03-09 22:30:25 +0000521 jobs=None,
522
523 # VS tools environment variable if using MSVC. For example,
524 # %VS120COMNTOOLS% selects the 2013 toolchain.
525 vs=None,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000526 vs_target_arch='x86',
Stella Stamenova61f2e262018-10-25 20:30:08 +0000527 autodetectVS=False,
Reid Kleckner25a26b02015-03-09 22:30:25 +0000528
529 # Multi-stage compilation
530 useTwoStage=False,
531 testStage1=True,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000532 stage1_config='Release',
533 stage2_config='Release',
Reid Kleckner25a26b02015-03-09 22:30:25 +0000534
Renato Golin61aed7f2015-06-17 19:12:50 +0000535 # Test-suite
536 runTestSuite=False,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000537 nt_flags=[],
Kristof Beylsf4639b52017-08-10 08:53:52 +0000538 testsuite_flags=[],
Renato Golin61aed7f2015-06-17 19:12:50 +0000539 submitURL=None,
540 testerName=None,
541
Reid Kleckner25a26b02015-03-09 22:30:25 +0000542 # Environmental variables for all steps.
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000543 env={},
544 extra_cmake_args=[],
Reid Kleckner25a26b02015-03-09 22:30:25 +0000545
546 # Extra repositories
547 checkout_clang_tools_extra=True,
Renato Golin0bd2a532016-11-20 16:14:35 +0000548 checkout_compiler_rt=True,
Artem Belevich16fcd0e2016-12-21 21:15:56 +0000549 checkout_lld=True,
550 checkout_libcxx=False,
551 checkout_test_suite=False):
Daniel Sandersfa222332015-12-04 14:30:39 +0000552 return _getClangCMakeBuildFactory(
Stella Stamenova61f2e262018-10-25 20:30:08 +0000553 clean=clean, test=test, cmake=cmake, jobs=jobs,
554 vs=vs, vs_target_arch=vs_target_arch, autodetectVS=autodetectVS,
555 useTwoStage=useTwoStage,
Daniel Sandersfa222332015-12-04 14:30:39 +0000556 testStage1=testStage1, stage1_config=stage1_config,
557 stage2_config=stage2_config, runTestSuite=runTestSuite,
Kristof Beylsf4639b52017-08-10 08:53:52 +0000558 nt_flags=nt_flags, testsuite_flags=testsuite_flags,
559 submitURL=submitURL, testerName=testerName,
Daniel Sandersfa222332015-12-04 14:30:39 +0000560 env=env, extra_cmake_args=extra_cmake_args,
561 checkout_clang_tools_extra=checkout_clang_tools_extra,
Renato Golin0bd2a532016-11-20 16:14:35 +0000562 checkout_lld=checkout_lld,
Artem Belevich16fcd0e2016-12-21 21:15:56 +0000563 checkout_compiler_rt=checkout_compiler_rt,
564 checkout_libcxx=checkout_libcxx,
565 checkout_test_suite=checkout_test_suite)
Daniel Sandersfa222332015-12-04 14:30:39 +0000566
567def _getClangCMakeBuildFactory(
568 clean=True,
569 test=True,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000570 cmake='cmake',
Daniel Sandersfa222332015-12-04 14:30:39 +0000571 jobs=None,
572
573 # VS tools environment variable if using MSVC. For example,
574 # %VS120COMNTOOLS% selects the 2013 toolchain.
575 vs=None,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000576 vs_target_arch='x86',
Stella Stamenova61f2e262018-10-25 20:30:08 +0000577 autodetectVS=False,
Daniel Sandersfa222332015-12-04 14:30:39 +0000578
579 # Multi-stage compilation
580 useTwoStage=False,
581 testStage1=True,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000582 stage1_config='Release',
583 stage2_config='Release',
Daniel Sandersfa222332015-12-04 14:30:39 +0000584
585 # Test-suite
586 runTestSuite=False,
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000587 nt_flags=[],
Kristof Beylsf4639b52017-08-10 08:53:52 +0000588 testsuite_flags=[],
Daniel Sandersfa222332015-12-04 14:30:39 +0000589 submitURL=None,
590 testerName=None,
591
592 # Environmental variables for all steps.
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000593 env={},
594 extra_cmake_args=[],
Daniel Sandersfa222332015-12-04 14:30:39 +0000595
596 # Extra repositories
597 checkout_clang_tools_extra=True,
598 checkout_compiler_rt=True,
Renato Golin0bd2a532016-11-20 16:14:35 +0000599 checkout_lld=True,
Artem Belevich16fcd0e2016-12-21 21:15:56 +0000600 checkout_libcxx=False,
601 checkout_test_suite=False,
Daniel Sandersfa222332015-12-04 14:30:39 +0000602
603 # Upload artifacts to Google Cloud Storage (for the llvmbisect tool)
604 stage1_upload_directory=None,
605
Leandro Nunes7b83ba42018-06-25 13:54:50 +0000606 # Use a lower compression level to generate the build-cache package faster
607 # default is 6 according to documentation
608 xz_compression_factor=6,
609 use_pixz_compression=False,
610
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000611 # Triggers
612 trigger_after_stage1=[]):
Reid Kleckner25a26b02015-03-09 22:30:25 +0000613
614 ############# PREPARING
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000615 f = buildbot.process.factory.BuildFactory()
Reid Kleckner25a26b02015-03-09 22:30:25 +0000616
Galina Kistanova49cbd602017-04-14 23:46:03 +0000617 clean_build_requested = lambda step: clean or step.build.getProperty("clean")
618
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000619 addSVNUpdateSteps(f,
620 checkout_clang_tools_extra=checkout_clang_tools_extra,
621 checkout_compiler_rt=checkout_compiler_rt,
Renato Golin0bd2a532016-11-20 16:14:35 +0000622 checkout_lld=checkout_lld,
Artem Belevich16fcd0e2016-12-21 21:15:56 +0000623 checkout_test_suite=runTestSuite or checkout_test_suite,
624 checkout_libcxx=checkout_libcxx)
Reid Kleckner25a26b02015-03-09 22:30:25 +0000625
Renato Goline402f582014-09-04 19:25:24 +0000626 # If jobs not defined, Ninja will choose a suitable value
Renato Golincc83db32015-06-17 19:23:40 +0000627 jobs_cmd = []
628 lit_args = "'-v"
Renato Goline402f582014-09-04 19:25:24 +0000629 if jobs is not None:
Renato Golincc83db32015-06-17 19:23:40 +0000630 jobs_cmd = ["-j"+str(jobs)]
631 lit_args += " -j"+str(jobs)+"'"
Renato Goline402f582014-09-04 19:25:24 +0000632 else:
Renato Golincc83db32015-06-17 19:23:40 +0000633 lit_args += "'"
634 ninja_cmd = ['ninja'] + jobs_cmd
635 ninja_install_cmd = ['ninja', 'install'] + jobs_cmd
636 ninja_check_cmd = ['ninja', 'check-all'] + jobs_cmd
Renato Goline402f582014-09-04 19:25:24 +0000637
638 # Global configurations
Renato Golincc83db32015-06-17 19:23:40 +0000639 stage1_build = 'stage1'
640 stage1_install = 'stage1.install'
641 stage2_build = 'stage2'
642 stage2_install = 'stage2.install'
Renato Goline402f582014-09-04 19:25:24 +0000643
Reid Kleckner25a26b02015-03-09 22:30:25 +0000644 # Set up VS environment, if appropriate.
Stella Stamenova61f2e262018-10-25 20:30:08 +0000645 if vs or autodetectVS:
Reid Kleckner25a26b02015-03-09 22:30:25 +0000646 f.addStep(SetProperty(
Stella Stamenova61f2e262018-10-25 20:30:08 +0000647 command=builders_util.getVisualStudioEnvironment(vs, vs_target_arch, autodetectVS),
Reid Kleckner25a26b02015-03-09 22:30:25 +0000648 extract_fn=builders_util.extractSlaveEnvironment))
649 assert not env, "Can't have custom builder env vars with VS"
650 env = Property('slave_env')
651
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000652
Renato Goline402f582014-09-04 19:25:24 +0000653 ############# CLEANING
Galina Kistanova49cbd602017-04-14 23:46:03 +0000654 f.addStep(ShellCommand(name='clean stage 1',
655 command=['rm','-rf',stage1_build],
656 warnOnFailure=True,
657 haltOnFailure=False,
658 flunkOnFailure=False,
659 description='cleaning stage 1',
660 descriptionDone='clean',
661 workdir='.',
662 doStepIf=clean_build_requested))
Renato Goline402f582014-09-04 19:25:24 +0000663
664
665 ############# STAGE 1
666 f.addStep(ShellCommand(name='cmake stage 1',
667 command=[cmake, "-G", "Ninja", "../llvm",
668 "-DCMAKE_BUILD_TYPE="+stage1_config,
669 "-DLLVM_ENABLE_ASSERTIONS=True",
670 "-DLLVM_LIT_ARGS="+lit_args,
671 "-DCMAKE_INSTALL_PREFIX=../"+stage1_install]
672 + extra_cmake_args,
673 haltOnFailure=True,
674 description='cmake stage 1',
675 workdir=stage1_build,
Galina Kistanova49cbd602017-04-14 23:46:03 +0000676 doStepIf=FileDoesNotExist("build.ninja"),
Renato Goline402f582014-09-04 19:25:24 +0000677 env=env))
678
679 f.addStep(WarningCountingShellCommand(name='build stage 1',
680 command=ninja_cmd,
681 haltOnFailure=True,
682 description='ninja all',
683 workdir=stage1_build,
684 env=env))
685
686 if test and testStage1:
Renato Golind1c46742015-08-06 18:05:34 +0000687 haltOnStage1Check = not useTwoStage and not runTestSuite
Renato Golincfbd5702014-09-06 19:09:16 +0000688 f.addStep(lit_test_command.LitTestCommand(name='ninja check 1',
689 command=ninja_check_cmd,
Renato Golind1c46742015-08-06 18:05:34 +0000690 haltOnFailure=haltOnStage1Check,
Renato Golincfbd5702014-09-06 19:09:16 +0000691 description=["checking stage 1"],
692 descriptionDone=["stage 1 checked"],
693 workdir=stage1_build,
694 env=env))
Renato Goline402f582014-09-04 19:25:24 +0000695
Daniel Sandersfa222332015-12-04 14:30:39 +0000696 if useTwoStage or runTestSuite or stage1_upload_directory:
Galina Kistanova49cbd602017-04-14 23:46:03 +0000697 f.addStep(ShellCommand(name='clean stage 1 install',
698 command=['rm','-rf',stage1_install],
699 warnOnFailure=True,
700 haltOnFailure=False,
701 flunkOnFailure=False,
702 description='cleaning stage 1 install',
703 descriptionDone='clean',
704 workdir='.'))
Renato Golin61aed7f2015-06-17 19:12:50 +0000705 f.addStep(ShellCommand(name='install stage 1',
706 command=ninja_install_cmd,
707 description='ninja install',
708 workdir=stage1_build,
Renato Goline402f582014-09-04 19:25:24 +0000709 env=env))
Renato Goline402f582014-09-04 19:25:24 +0000710
Daniel Sandersfa222332015-12-04 14:30:39 +0000711 if stage1_upload_directory:
712 addGCSUploadSteps(f, 'stage 1', stage1_install, stage1_upload_directory,
Leandro Nunes7b83ba42018-06-25 13:54:50 +0000713 env, gcs_url_property='stage1_package_gcs_url',
714 use_pixz_compression=use_pixz_compression,
715 xz_compression_factor=xz_compression_factor)
Daniel Sandersfa222332015-12-04 14:30:39 +0000716
Reid Kleckner25a26b02015-03-09 22:30:25 +0000717 # Compute the cmake define flag to set the C and C++ compiler to clang. Use
718 # clang-cl if we used MSVC for stage1.
719 if not vs:
720 cc = 'clang'
721 cxx = 'clang++'
722 else:
723 cc = 'clang-cl.exe'
724 cxx = 'clang-cl.exe'
725
Galina Kistanovaff5e78a2016-09-06 17:44:53 +0000726
Renato Golin61aed7f2015-06-17 19:12:50 +0000727 ############# STAGE 2
728 if useTwoStage:
Galina Kistanova79900972015-11-16 17:30:42 +0000729 # We always cleanly build the stage 2. If the compiler has been
730 # changed on the stage 1, we cannot trust any of the intermediate file
731 # from the old compiler. And if the stage 1 compiler is the same, we
732 # should not build in the first place.
733 f.addStep(ShellCommand(name='clean stage 2',
734 command=['rm','-rf',stage2_build],
735 warnOnFailure=True,
736 description='cleaning stage 2',
737 descriptionDone='clean',
Galina Kistanova49cbd602017-04-14 23:46:03 +0000738 workdir='.'))
Reid Kleckner25a26b02015-03-09 22:30:25 +0000739
Renato Golin61aed7f2015-06-17 19:12:50 +0000740 # Set the compiler using the CC and CXX environment variables to work around
741 # backslash string escaping bugs somewhere between buildbot and cmake. The
742 # env.exe helper is required to run the tests, so hopefully it's already on
743 # PATH.
744 cmake_cmd2 = ['env',
745 WithProperties('CC=%(workdir)s/'+stage1_install+'/bin/'+cc),
746 WithProperties('CXX=%(workdir)s/'+stage1_install+'/bin/'+cxx),
747 cmake, "-G", "Ninja", "../llvm",
748 "-DCMAKE_BUILD_TYPE="+stage2_config,
749 "-DLLVM_ENABLE_ASSERTIONS=True",
750 "-DLLVM_LIT_ARGS="+lit_args,
751 "-DCMAKE_INSTALL_PREFIX=../"+stage2_install] + extra_cmake_args
Reid Kleckner25a26b02015-03-09 22:30:25 +0000752
Renato Golin61aed7f2015-06-17 19:12:50 +0000753 f.addStep(ShellCommand(name='cmake stage 2',
754 command=cmake_cmd2,
755 haltOnFailure=True,
756 description='cmake stage 2',
757 workdir=stage2_build,
Renato Golin61aed7f2015-06-17 19:12:50 +0000758 env=env))
759
760 f.addStep(WarningCountingShellCommand(name='build stage 2',
761 command=ninja_cmd,
762 haltOnFailure=True,
763 description='ninja all',
764 workdir=stage2_build,
765 env=env))
766
767 if test:
768 f.addStep(lit_test_command.LitTestCommand(name='ninja check 2',
769 command=ninja_check_cmd,
770 haltOnFailure=not runTestSuite,
771 description=["checking stage 2"],
772 descriptionDone=["stage 2 checked"],
773 workdir=stage2_build,
774 env=env))
775
776 ############# TEST SUITE
777 ## Test-Suite (stage 2 if built, stage 1 otherwise)
778 if runTestSuite:
779 compiler_path = stage1_install
780 if useTwoStage:
781 compiler_path=stage2_install
Galina Kistanova49cbd602017-04-14 23:46:03 +0000782 f.addStep(ShellCommand(name='clean stage 2 install',
783 command=['rm','-rf',stage2_install],
784 warnOnFailure=True,
785 description='cleaning stage 2 install',
786 descriptionDone='clean',
787 workdir='.'))
Renato Golin61aed7f2015-06-17 19:12:50 +0000788 f.addStep(ShellCommand(name='install stage 2',
789 command=ninja_install_cmd,
790 description='ninja install 2',
Renato Golincfbd5702014-09-06 19:09:16 +0000791 workdir=stage2_build,
792 env=env))
Renato Goline402f582014-09-04 19:25:24 +0000793
Renato Golin61aed7f2015-06-17 19:12:50 +0000794 # Get generated python, lnt
795 python = WithProperties('%(workdir)s/test/sandbox/bin/python')
796 lnt = WithProperties('%(workdir)s/test/sandbox/bin/lnt')
797 lnt_setup = WithProperties('%(workdir)s/test/lnt/setup.py')
798
799 # Paths
800 sandbox = WithProperties('%(workdir)s/test/sandbox')
801 test_suite_dir = WithProperties('%(workdir)s/test/test-suite')
802
803 # Get latest built Clang (stage1 or stage2)
804 cc = WithProperties('%(workdir)s/'+compiler_path+'/bin/'+cc)
805 cxx = WithProperties('%(workdir)s/'+compiler_path+'/bin/'+cxx)
806
Renato Golin593e0d62016-09-21 17:24:56 +0000807 # LNT Command line (don't pass -jN. Users need to pass both --threads
Kristof Beylsf4639b52017-08-10 08:53:52 +0000808 # and --build-threads in nt_flags/test_suite_flags to get the same effect)
809 use_runtest_testsuite = len(nt_flags) == 0
810 if not use_runtest_testsuite:
811 test_suite_cmd = [python, lnt, 'runtest', 'nt',
812 '--no-timestamp',
813 '--sandbox', sandbox,
814 '--test-suite', test_suite_dir,
815 '--cc', cc,
816 '--cxx', cxx]
817 # Append any option provided by the user
818 test_suite_cmd.extend(nt_flags)
819 else:
820 lit = WithProperties('%(workdir)s/'+stage1_build+'/bin/llvm-lit')
821 test_suite_cmd = [python, lnt, 'runtest', 'test-suite',
822 '--no-timestamp',
823 '--sandbox', sandbox,
824 '--test-suite', test_suite_dir,
825 '--cc', cc,
826 '--cxx', cxx,
827 '--use-lit', lit]
828 # Append any option provided by the user
829 test_suite_cmd.extend(testsuite_flags)
830
Renato Golin61aed7f2015-06-17 19:12:50 +0000831 # Only submit if a URL has been specified
832 if submitURL is not None:
833 if not isinstance(submitURL, list):
834 submitURL = [submitURL]
835 for url in submitURL:
836 test_suite_cmd.extend(['--submit', url])
Kristof Beylsf4639b52017-08-10 08:53:52 +0000837 # lnt runtest test-suite doesn't understand --no-machdep-info:
838 if testerName and not use_runtest_testsuite:
Renato Golin61aed7f2015-06-17 19:12:50 +0000839 test_suite_cmd.extend(['--no-machdep-info', testerName])
840 # CC and CXX are needed as env for build-tools
Renato Goline6c1b3b2015-07-01 15:52:22 +0000841 test_suite_env = copy.deepcopy(env)
Renato Golin61aed7f2015-06-17 19:12:50 +0000842 test_suite_env['CC'] = cc
843 test_suite_env['CXX'] = cxx
844
845 # Steps to prepare, build and run LNT
846 f.addStep(ShellCommand(name='clean sandbox',
847 command=['rm', '-rf', 'sandbox'],
848 haltOnFailure=True,
849 description='removing sandbox directory',
850 workdir='test',
851 env=env))
852 f.addStep(ShellCommand(name='recreate sandbox',
853 command=['virtualenv', 'sandbox'],
854 haltOnFailure=True,
855 description='recreating sandbox',
856 workdir='test',
857 env=env))
858 f.addStep(ShellCommand(name='setup lit',
859 command=[python, lnt_setup, 'develop'],
860 haltOnFailure=True,
861 description='setting up LNT in sandbox',
862 workdir='test/sandbox',
863 env=env))
864 f.addStep(commands.LitTestCommand.LitTestCommand(
865 name='test-suite',
866 command=test_suite_cmd,
867 haltOnFailure=True,
868 description=['running the test suite'],
869 workdir='test/sandbox',
870 logfiles={'configure.log' : 'build/configure.log',
871 'build-tools.log' : 'build/build-tools.log',
872 'test.log' : 'build/test.log',
873 'report.json' : 'build/report.json'},
874 env=test_suite_env))
875
Renato Goline402f582014-09-04 19:25:24 +0000876 return f
877
Daniel Dunbar7363d032011-02-27 03:22:35 +0000878def addClangGCCTests(f, ignores={}, install_prefix="%(builddir)s/llvm.install",
879 languages = ('gcc', 'g++', 'objc', 'obj-c++')):
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000880 make_vars = [WithProperties(
Daniel Dunbar2b67e8f2011-02-11 21:03:41 +0000881 'CC_UNDER_TEST=%s/bin/clang' % install_prefix),
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000882 WithProperties(
Daniel Dunbar2b67e8f2011-02-11 21:03:41 +0000883 'CXX_UNDER_TEST=%s/bin/clang++' % install_prefix)]
David Blaikie05517332013-12-19 23:29:12 +0000884 f.addStep(SVN(name='svn-clang-gcc-tests', mode='update',
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000885 baseURL='http://llvm.org/svn/llvm-project/clang-tests/',
886 defaultBranch='trunk', workdir='clang-tests'))
887 gcc_dg_ignores = ignores.get('gcc-4_2-testsuite', {})
Daniel Dunbar2b67e8f2011-02-11 21:03:41 +0000888 for lang in languages:
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000889 f.addStep(commands.SuppressionDejaGNUCommand.SuppressionDejaGNUCommand(
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000890 name='test-gcc-4_2-testsuite-%s' % lang,
891 command=["make", "-k", "check-%s" % lang] + make_vars,
892 description="gcc-4_2-testsuite (%s)" % lang,
893 workdir='clang-tests/gcc-4_2-testsuite',
David Dean2bd0c3a2011-10-18 16:36:28 +0000894 logfiles={ 'dg.sum' : 'obj/%s/%s.sum' % (lang, lang),
895 '%s.log' % lang : 'obj/%s/%s.log' % (lang, lang)},
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000896 ignore=gcc_dg_ignores.get(lang, [])))
Daniel Dunbar2b67e8f2011-02-11 21:03:41 +0000897
Daniel Dunbar7363d032011-02-27 03:22:35 +0000898def addClangGDBTests(f, ignores={}, install_prefix="%(builddir)s/llvm.install"):
899 make_vars = [WithProperties(
900 'CC_UNDER_TEST=%s/bin/clang' % install_prefix),
901 WithProperties(
902 'CXX_UNDER_TEST=%s/bin/clang++' % install_prefix)]
David Blaikie05517332013-12-19 23:29:12 +0000903 f.addStep(SVN(name='svn-clang-gdb-tests', mode='update',
Daniel Dunbar7363d032011-02-27 03:22:35 +0000904 baseURL='http://llvm.org/svn/llvm-project/clang-tests/',
905 defaultBranch='trunk', workdir='clang-tests'))
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000906 f.addStep(commands.SuppressionDejaGNUCommand.SuppressionDejaGNUCommand(
Daniel Dunbar7363d032011-02-27 03:22:35 +0000907 name='test-gdb-1472-testsuite',
908 command=["make", "-k", "check"] + make_vars,
909 description="gdb-1472-testsuite",
910 workdir='clang-tests/gdb-1472-testsuite',
David Blaikie7ec695f2012-10-09 22:17:09 +0000911 logfiles={ 'dg.sum' : 'obj/filtered.gdb.sum',
David Blaikie624f4392012-11-05 22:34:35 +0000912 'gdb.log' : 'obj/gdb.log' }))
Daniel Dunbar7363d032011-02-27 03:22:35 +0000913
David Blaikie41d09c32013-01-02 21:11:09 +0000914def addModernClangGDBTests(f, jobs, install_prefix):
David Blaikie1bc5c372012-12-05 05:29:12 +0000915 make_vars = [WithProperties('RUNTESTFLAGS=CC_FOR_TARGET=\'{0}/bin/clang\' '
916 'CXX_FOR_TARGET=\'{0}/bin/clang++\' '
David Blaikie759bb752013-04-18 23:13:11 +0000917 'CFLAGS_FOR_TARGET=\'-w -fno-limit-debug-info\''
David Blaikief89877b2013-01-29 23:46:26 +0000918 .format(install_prefix))]
David Blaikie05517332013-12-19 23:29:12 +0000919 f.addStep(SVN(name='svn-clang-modern-gdb-tests', mode='update',
David Blaikief3f300b2012-11-17 01:13:41 +0000920 svnurl='http://llvm.org/svn/llvm-project/clang-tests-external/trunk/gdb/7.5',
David Blaikiedad03d52012-11-16 22:37:12 +0000921 workdir='clang-tests/src'))
David Blaikieb83bfdf2012-12-05 04:33:42 +0000922 f.addStep(Configure(command='../src/configure',
David Blaikief3f300b2012-11-17 01:13:41 +0000923 workdir='clang-tests/build/'))
David Blaikieb83bfdf2012-12-05 04:33:42 +0000924 f.addStep(WarningCountingShellCommand(name='gdb-75-build',
925 command=['make', WithProperties('-j%s' % jobs)],
926 haltOnFailure=True,
927 workdir='clang-tests/build'))
Michael Gottesmana6b5be82013-06-28 21:57:20 +0000928 f.addStep(commands.DejaGNUCommand.DejaGNUCommand(
David Blaikiedad03d52012-11-16 22:37:12 +0000929 name='gdb-75-check',
David Blaikieb83bfdf2012-12-05 04:33:42 +0000930 command=['make', '-k', WithProperties('-j%s' % jobs), 'check'] + make_vars,
David Blaikiedad03d52012-11-16 22:37:12 +0000931 workdir='clang-tests/build',
David Blaikie1bc5c372012-12-05 05:29:12 +0000932 logfiles={'dg.sum':'gdb/testsuite/gdb.sum',
933 'gdb.log':'gdb/testsuite/gdb.log'}))
David Blaikiedad03d52012-11-16 22:37:12 +0000934
935
936
Daniel Dunbar7363d032011-02-27 03:22:35 +0000937# FIXME: Deprecated.
938addClangTests = addClangGCCTests
939
Daniel Dunbar2b67e8f2011-02-11 21:03:41 +0000940def getClangTestsIgnoresFromPath(path, key):
941 def readList(path):
942 if not os.path.exists(path):
943 return []
944
945 f = open(path)
946 lines = [ln.strip() for ln in f]
947 f.close()
948 return lines
949
950 ignores = {}
951
952 gcc_dg_ignores = {}
953 for lang in ('gcc', 'g++', 'objc', 'obj-c++'):
954 lang_path = os.path.join(path, 'gcc-4_2-testsuite', 'expected_results',
955 key, lang)
956 gcc_dg_ignores[lang] = (
957 readList(os.path.join(lang_path, 'FAIL.txt')) +
958 readList(os.path.join(lang_path, 'UNRESOLVED.txt')) +
959 readList(os.path.join(lang_path, 'XPASS.txt')))
960 ignores['gcc-4_2-testsuite' ] = gcc_dg_ignores
961
Daniel Dunbar7363d032011-02-27 03:22:35 +0000962 ignores_path = os.path.join(path, 'gdb-1472-testsuite', 'expected_results',
963 key)
964 gdb_dg_ignores = (
965 readList(os.path.join(ignores_path, 'FAIL.txt')) +
966 readList(os.path.join(ignores_path, 'UNRESOLVED.txt')) +
967 readList(os.path.join(ignores_path, 'XPASS.txt')))
968 ignores['gdb-1472-testsuite' ] = gdb_dg_ignores
969
Daniel Dunbar2b67e8f2011-02-11 21:03:41 +0000970 return ignores