blob: b8cf5e4bbf4c359a008b012ce8216fa7bde35e63 [file] [log] [blame]
Daniel Dunbar44abe742009-07-19 01:59:03 +00001import os
2
Daniel Dunbar235aa412009-07-18 07:16:15 +00003import buildbot
4import buildbot.process.factory
5from buildbot.steps.source import SVN
Daniel Dunbar44abe742009-07-19 01:59:03 +00006from buildbot.steps.shell import Configure, ShellCommand
7from buildbot.steps.shell import WarningCountingShellCommand
8from buildbot.steps.transfer import FileDownload
Daniel Dunbar235aa412009-07-18 07:16:15 +00009from buildbot.process.properties import WithProperties
10
Daniel Dunbar235aa412009-07-18 07:16:15 +000011from zorg.buildbot.commands.ClangTestCommand import ClangTestCommand
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000012from zorg.buildbot.commands.BatchFileDownload import BatchFileDownload
Daniel Dunbar22d594a2010-07-31 05:29:16 +000013from zorg.buildbot.commands import DejaGNUCommand
Daniel Dunbar235aa412009-07-18 07:16:15 +000014
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000015from Util import getConfigArgs
16
Daniel Dunbar3efb7822010-02-26 19:20:00 +000017def getClangBuildFactory(triple=None, clean=True, test=True, package_dst=None,
18 run_cxx_tests=False, examples=False, valgrind=False,
Daniel Dunbara1bebce2010-03-21 01:24:00 +000019 valgrindLeakCheck=False, outOfDir=False, useTwoStage=False,
Daniel Dunbar06b20f12010-04-08 18:29:38 +000020 completely_clean=False, always_install=False,
21 make='make', jobs="%(jobs)s",
Daniel Dunbar7e33e042010-07-14 20:34:16 +000022 stage1_config='Debug+Asserts',
23 stage2_config='Release+Asserts',
Daniel Dunbarf4e23eb2010-09-20 21:13:02 +000024 extra_configure_args=[], use_pty_in_tests=False,
25 checkout_compiler_rt=False):
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000026 # Don't use in-dir builds with a two stage build process.
Daniel Dunbar3efb7822010-02-26 19:20:00 +000027 inDir = not outOfDir and not useTwoStage
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000028 if inDir:
29 llvm_srcdir = "llvm"
30 llvm_1_objdir = "llvm"
Daniel Dunbar9870de32010-03-28 22:25:31 +000031 if always_install:
32 llvm_1_installdir = "llvm.install"
33 else:
34 llvm_1_installdir = None
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000035 else:
36 llvm_srcdir = "llvm.src"
37 llvm_1_objdir = "llvm.obj"
38 llvm_1_installdir = "llvm.install.1"
39 llvm_2_objdir = "llvm.obj.2"
Daniel Dunbar22d594a2010-07-31 05:29:16 +000040 llvm_2_installdir = "llvm.install"
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000041
Daniel Dunbar235aa412009-07-18 07:16:15 +000042 f = buildbot.process.factory.BuildFactory()
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000043
44 # Determine the build directory.
45 f.addStep(buildbot.steps.shell.SetProperty(name="get_builddir",
46 command=["pwd"],
47 property="builddir",
48 description="set build dir",
49 workdir="."))
50
Daniel Dunbar06b20f12010-04-08 18:29:38 +000051 # Blow away completely, if requested.
52 if completely_clean:
53 f.addStep(ShellCommand(name="rm-llvm.src",
54 command=["rm", "-rf", llvm_srcdir],
55 haltOnFailure=True,
56 description=["rm src dir", "llvm"],
57 workdir="."))
58
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000059 # Checkout sources.
Daniel Dunbar235aa412009-07-18 07:16:15 +000060 f.addStep(SVN(name='svn-llvm',
Daniel Dunbarf4e23eb2010-09-20 21:13:02 +000061 mode='update',
62 baseURL='http://llvm.org/svn/llvm-project/llvm/',
Daniel Dunbar235aa412009-07-18 07:16:15 +000063 defaultBranch='trunk',
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000064 workdir=llvm_srcdir))
Daniel Dunbar235aa412009-07-18 07:16:15 +000065 f.addStep(SVN(name='svn-clang',
Daniel Dunbarf4e23eb2010-09-20 21:13:02 +000066 mode='update',
67 baseURL='http://llvm.org/svn/llvm-project/cfe/',
Daniel Dunbar235aa412009-07-18 07:16:15 +000068 defaultBranch='trunk',
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000069 workdir='%s/tools/clang' % llvm_srcdir))
Daniel Dunbarf4e23eb2010-09-20 21:13:02 +000070 if checkout_compiler_rt:
71 f.addStep(SVN(name='svn-compiler-rt',
72 mode='update',
73 baseURL='http://llvm.org/svn/llvm-project/compiler-rt/',
74 defaultBranch='trunk',
Daniel Dunbareb68fd22010-09-21 05:00:06 +000075 workdir='%s/projects/compiler-rt' % llvm_srcdir))
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000076
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000077 # Clean up llvm (stage 1); unless in-dir.
78 if clean and llvm_srcdir != llvm_1_objdir:
79 f.addStep(ShellCommand(name="rm-llvm.obj.stage1",
80 command=["rm", "-rf", llvm_1_objdir],
81 haltOnFailure=True,
82 description=["rm build dir", "llvm"],
83 workdir="."))
84
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000085 # Force without llvm-gcc so we don't run afoul of Frontend test failures.
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000086 base_configure_args = [WithProperties("%%(builddir)s/%s/configure" % llvm_srcdir),
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000087 '--disable-bindings']
88 base_configure_args += extra_configure_args
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000089 if triple:
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000090 base_configure_args += ['--build=%s' % triple,
91 '--host=%s' % triple,
92 '--target=%s' % triple]
93 args = base_configure_args + ["--without-llvmgcc", "--without-llvmgxx"]
Daniel Dunbar3efb7822010-02-26 19:20:00 +000094 args.append(WithProperties("--prefix=%%(builddir)s/%s" % llvm_1_installdir))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000095 args += getConfigArgs(stage1_config)
96 f.addStep(Configure(command=args,
97 workdir=llvm_1_objdir,
98 description=['configuring',stage1_config],
99 descriptionDone=['configure',stage1_config]))
100
101 # Make clean if using in-dir builds.
102 if clean and llvm_srcdir == llvm_1_objdir:
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000103 f.addStep(WarningCountingShellCommand(name="clean-llvm",
Daniel Dunbard20468a2009-11-24 18:27:23 +0000104 command=[make, "clean"],
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000105 haltOnFailure=True,
106 description="cleaning llvm",
107 descriptionDone="clean llvm",
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000108 workdir=llvm_1_objdir))
109
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000110 f.addStep(WarningCountingShellCommand(name="compile",
Daniel Dunbard20468a2009-11-24 18:27:23 +0000111 command=['nice', '-n', '10',
112 make, WithProperties("-j%s" % jobs)],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000113 haltOnFailure=True,
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000114 description=["compiling", stage1_config],
115 descriptionDone=["compile", stage1_config],
116 workdir=llvm_1_objdir))
Daniel Dunbar256fed42009-11-25 21:11:08 +0000117
118 if examples:
119 f.addStep(WarningCountingShellCommand(name="compile.examples",
120 command=['nice', '-n', '10',
121 make, WithProperties("-j%s" % jobs),
122 "BUILD_EXAMPLES=1"],
123 haltOnFailure=True,
124 description=["compilinge", stage1_config, "examples"],
125 descriptionDone=["compile", stage1_config, "examples"],
126 workdir=llvm_1_objdir))
127
Daniel Dunbar93f828a2010-06-23 17:42:14 +0000128 clangTestArgs = llvmTestArgs = '-v -j %s' % jobs
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000129 if valgrind:
Daniel Dunbar89184b92010-04-18 19:09:32 +0000130 clangTestArgs += ' --vg'
Daniel Dunbara1bebce2010-03-21 01:24:00 +0000131 if valgrindLeakCheck:
132 clangTestArgs += ' --vg-leak'
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000133 clangTestArgs += ' --vg-arg --suppressions=%(builddir)s/llvm/tools/clang/utils/valgrind/x86_64-pc-linux-gnu_gcc-4.3.3.supp'
134 extraTestDirs = ''
135 if run_cxx_tests:
136 extraTestDirs += '%(builddir)s/llvm/tools/clang/utils/C++Tests'
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000137 if test:
138 f.addStep(ClangTestCommand(name='test-llvm',
Daniel Dunbar93f828a2010-06-23 17:42:14 +0000139 command=[make, "check-lit", "VERBOSE=1",
140 WithProperties("LIT_ARGS=%s" % llvmTestArgs)],
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000141 description=["testing", "llvm"],
142 descriptionDone=["test", "llvm"],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000143 workdir=llvm_1_objdir,
144 usePTY=use_pty_in_tests))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000145 f.addStep(ClangTestCommand(name='test-clang',
Daniel Dunbard20468a2009-11-24 18:27:23 +0000146 command=[make, 'test', WithProperties('TESTARGS=%s' % clangTestArgs),
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000147 WithProperties('EXTRA_TESTDIRS=%s' % extraTestDirs)],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000148 workdir='%s/tools/clang' % llvm_1_objdir,
149 usePTY=use_pty_in_tests))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000150
151 # Install llvm and clang.
152 if llvm_1_installdir:
Daniel Dunbar9870de32010-03-28 22:25:31 +0000153 f.addStep(ShellCommand(name="rm-install.clang.stage1",
154 command=["rm", "-rf", llvm_1_installdir],
155 haltOnFailure=True,
156 description=["rm install dir", "clang"],
157 workdir="."))
158 f.addStep(WarningCountingShellCommand(name="install.clang.stage1",
159 command = ['nice', '-n', '10',
160 make, 'install-clang'],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000161 haltOnFailure=True,
Daniel Dunbar9870de32010-03-28 22:25:31 +0000162 description=["install", "clang",
163 stage1_config],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000164 workdir=llvm_1_objdir))
165
166 if not useTwoStage:
Daniel Dunbardedf6572010-11-13 00:23:34 +0000167 if package_dst:
168 name = WithProperties(
169 "%(builddir)s/" + llvm_1_objdir +
170 "/clang-r%(got_revision)s-b%(buildnumber)s.tgz")
171 f.addStep(ShellCommand(name='pkg.tar',
172 description="tar root",
173 command=["tar", "zcvf", name, "./"],
174 workdir=llvm_1_installdir,
175 warnOnFailure=True,
176 flunkOnFailure=False,
177 haltOnFailure=False))
178 f.addStep(ShellCommand(name='pkg.upload',
179 description="upload root",
180 command=["scp", name,
181 WithProperties(
182 package_dst + "/%(buildername)s")],
183 workdir=".",
184 warnOnFailure=True,
185 flunkOnFailure=False,
186 haltOnFailure=False))
187
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000188 return f
189
190 # Clean up llvm (stage 2).
191 if clean:
192 f.addStep(ShellCommand(name="rm-llvm.obj.stage2",
193 command=["rm", "-rf", llvm_2_objdir],
194 haltOnFailure=True,
195 description=["rm build dir", "llvm", "(stage 2)"],
196 workdir="."))
197
198 # Configure llvm (stage 2).
199 args = base_configure_args + ["--without-llvmgcc", "--without-llvmgxx"]
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000200 args.append(WithProperties("--prefix=%(builddir)s/" + llvm_2_installdir))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000201 args += getConfigArgs(stage2_config)
202 f.addStep(Configure(name="configure.llvm.stage2",
203 command=args,
204 env={'CC' : WithProperties("%%(builddir)s/%s/bin/clang" % llvm_1_installdir),
205 'CXX' : WithProperties("%%(builddir)s/%s/bin/clang++" % llvm_1_installdir),},
206 haltOnFailure=True,
207 workdir=llvm_2_objdir,
208 description=["configure", "llvm", "(stage 2)",
209 stage2_config]))
210
211 # Build llvm (stage 2).
212 f.addStep(WarningCountingShellCommand(name="compile.llvm.stage2",
213 command=['nice', '-n', '10',
214 make, WithProperties("-j%s" % jobs)],
215 haltOnFailure=True,
216 description=["compiling", "(stage 2)",
217 stage2_config],
218 descriptionDone=["compile", "(stage 2)",
219 stage2_config],
220 workdir=llvm_2_objdir))
221
222 if test:
223 f.addStep(ClangTestCommand(name='test-llvm',
Daniel Dunbar93f828a2010-06-23 17:42:14 +0000224 command=[make, "check-lit", "VERBOSE=1",
225 WithProperties("LIT_ARGS=%s" % llvmTestArgs)],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000226 description=["testing", "llvm"],
227 descriptionDone=["test", "llvm"],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000228 workdir=llvm_2_objdir,
229 usePTY=use_pty_in_tests))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000230 f.addStep(ClangTestCommand(name='test-clang',
231 command=[make, 'test', WithProperties('TESTARGS=%s' % clangTestArgs),
232 WithProperties('EXTRA_TESTDIRS=%s' % extraTestDirs)],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000233 workdir='%s/tools/clang' % llvm_2_objdir,
234 usePTY=use_pty_in_tests))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000235
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000236 # Install clang (stage 2).
Daniel Dunbar9870de32010-03-28 22:25:31 +0000237 f.addStep(ShellCommand(name="rm-install.clang.stage2",
238 command=["rm", "-rf", llvm_2_installdir],
239 haltOnFailure=True,
240 description=["rm install dir", "clang"],
241 workdir="."))
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000242 f.addStep(WarningCountingShellCommand(name="install.clang.stage2",
243 command = ['nice', '-n', '10',
244 make, 'install-clang'],
245 haltOnFailure=True,
246 description=["install", "clang",
247 "(stage 2)"],
248 workdir=llvm_2_objdir))
249
250 if package_dst:
251 name = WithProperties(
252 "%(builddir)s/" + llvm_2_objdir +
253 "/clang-r%(got_revision)s-b%(buildnumber)s.tgz")
254 f.addStep(ShellCommand(name='pkg.tar',
255 description="tar root",
256 command=["tar", "zcvf", name, "./"],
257 workdir=llvm_2_installdir,
258 warnOnFailure=True,
259 flunkOnFailure=False,
260 haltOnFailure=False))
261 f.addStep(ShellCommand(name='pkg.upload',
262 description="upload root",
263 command=["scp", name,
264 WithProperties(
265 package_dst + "/%(buildername)s")],
266 workdir=".",
267 warnOnFailure=True,
268 flunkOnFailure=False,
269 haltOnFailure=False))
270
Daniel Dunbar235aa412009-07-18 07:16:15 +0000271 return f
Daniel Dunbar44abe742009-07-19 01:59:03 +0000272
Daniel Dunbarc51a59e2010-09-23 14:57:45 +0000273def getClangMSVCBuildFactory(update=True, clean=True, vcDrive='c', jobs=1, cmake=r"cmake"):
Daniel Dunbar44abe742009-07-19 01:59:03 +0000274 f = buildbot.process.factory.BuildFactory()
275
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000276 if update:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000277 f.addStep(SVN(name='svn-llvm',
278 mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
279 defaultBranch='trunk',
280 workdir='llvm'))
281
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000282 if update:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000283 f.addStep(SVN(name='svn-clang',
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000284 mode='update', baseURL='http://llvm.org/svn/llvm-project/cfe/',
Daniel Dunbar44abe742009-07-19 01:59:03 +0000285 defaultBranch='trunk',
286 workdir='llvm/tools/clang'))
287
288 # Full & fast clean.
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000289 if clean:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000290 f.addStep(ShellCommand(name='clean-1',
291 command=['del','/s/q','build'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000292 warnOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000293 description='cleaning',
294 descriptionDone='clean',
295 workdir='llvm'))
296 f.addStep(ShellCommand(name='clean-2',
297 command=['rmdir','/s/q','build'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000298 warnOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000299 description='cleaning',
300 descriptionDone='clean',
301 workdir='llvm'))
302
303 # Create the project files.
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000304
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000305 # Use batch files instead of ShellCommand directly, Windows quoting is
306 # borked. FIXME: See buildbot ticket #595 and buildbot ticket #377.
307 f.addStep(BatchFileDownload(name='cmakegen',
Daniel Dunbar06b20f12010-04-08 18:29:38 +0000308 command=[cmake,
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000309 "-DLLVM_TARGETS_TO_BUILD:=X86",
Daniel Dunbar1ddedce2010-09-24 19:57:34 +0000310 "-DLLVM_INCLUDE_EXAMPLES:=OFF",
311 "-DLLVM_INCLUDE_TESTS:=OFF",
312 "-DLLVM_TARGETS_TO_BUILD:=X86",
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000313 "-G",
314 "Visual Studio 9 2008",
315 ".."],
316 workdir="llvm\\build"))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000317 f.addStep(ShellCommand(name='cmake',
318 command=['cmakegen.bat'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000319 haltOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000320 description='cmake gen',
321 workdir='llvm\\build'))
322
323 # Build it.
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000324 f.addStep(BatchFileDownload(name='vcbuild',
325 command=[vcDrive + r""":\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages\vcbuild.exe""",
326 "/M%d" % jobs,
327 "LLVM.sln",
328 "Debug|Win32"],
329 workdir="llvm\\build"))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000330 f.addStep(WarningCountingShellCommand(name='vcbuild',
331 command=['vcbuild.bat'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000332 haltOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000333 description='vcbuild',
334 workdir='llvm\\build',
335 warningPattern=" warning C.*:"))
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000336
337 # Build clang-test project.
338 f.addStep(BatchFileDownload(name='vcbuild_test',
339 command=[vcDrive + r""":\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages\vcbuild.exe""",
340 "clang-test.vcproj",
341 "Debug|Win32"],
342 workdir="llvm\\build\\tools\\clang\\test"))
343 f.addStep(ClangTestCommand(name='test-clang',
344 command=["vcbuild_test.bat"],
345 workdir="llvm\\build\\tools\\clang\\test"))
346
Daniel Dunbar44abe742009-07-19 01:59:03 +0000347 return f
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000348
349def addClangTests(f, ignores={}):
350 make_vars = [WithProperties(
351 'CC_UNDER_TEST=%(builddir)s/llvm.install/bin/clang'),
352 WithProperties(
353 'CXX_UNDER_TEST=%(builddir)s/llvm.install/bin/clang++')]
354 f.addStep(SVN(name='svn-clang-tests', mode='update',
355 baseURL='http://llvm.org/svn/llvm-project/clang-tests/',
356 defaultBranch='trunk', workdir='clang-tests'))
357 gcc_dg_ignores = ignores.get('gcc-4_2-testsuite', {})
358 for lang in ('gcc', 'g++', 'objc', 'obj-c++'):
359 f.addStep(DejaGNUCommand.DejaGNUCommand(
360 name='test-gcc-4_2-testsuite-%s' % lang,
361 command=["make", "-k", "check-%s" % lang] + make_vars,
362 description="gcc-4_2-testsuite (%s)" % lang,
363 workdir='clang-tests/gcc-4_2-testsuite',
364 logfiles={ 'dg.sum' : 'obj/%s/%s.sum' % (lang, lang) },
365 ignore=gcc_dg_ignores.get(lang, [])))