blob: e7321e7e0b4cd69917a12a8fed031080280d3d7c [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 Dunbar469e8ca2010-05-19 21:26:48 +000024 extra_configure_args=[], use_pty_in_tests=False):
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000025 # Don't use in-dir builds with a two stage build process.
Daniel Dunbar3efb7822010-02-26 19:20:00 +000026 inDir = not outOfDir and not useTwoStage
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000027 if inDir:
28 llvm_srcdir = "llvm"
29 llvm_1_objdir = "llvm"
Daniel Dunbar9870de32010-03-28 22:25:31 +000030 if always_install:
31 llvm_1_installdir = "llvm.install"
32 else:
33 llvm_1_installdir = None
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000034 else:
35 llvm_srcdir = "llvm.src"
36 llvm_1_objdir = "llvm.obj"
37 llvm_1_installdir = "llvm.install.1"
38 llvm_2_objdir = "llvm.obj.2"
Daniel Dunbar22d594a2010-07-31 05:29:16 +000039 llvm_2_installdir = "llvm.install"
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000040
Daniel Dunbar235aa412009-07-18 07:16:15 +000041 f = buildbot.process.factory.BuildFactory()
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000042
43 # Determine the build directory.
44 f.addStep(buildbot.steps.shell.SetProperty(name="get_builddir",
45 command=["pwd"],
46 property="builddir",
47 description="set build dir",
48 workdir="."))
49
Daniel Dunbar06b20f12010-04-08 18:29:38 +000050 # Blow away completely, if requested.
51 if completely_clean:
52 f.addStep(ShellCommand(name="rm-llvm.src",
53 command=["rm", "-rf", llvm_srcdir],
54 haltOnFailure=True,
55 description=["rm src dir", "llvm"],
56 workdir="."))
57
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000058 # Checkout sources.
Daniel Dunbar235aa412009-07-18 07:16:15 +000059 f.addStep(SVN(name='svn-llvm',
60 mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
61 defaultBranch='trunk',
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000062 workdir=llvm_srcdir))
Daniel Dunbar235aa412009-07-18 07:16:15 +000063 f.addStep(SVN(name='svn-clang',
Daniel Dunbar7e959c82009-09-28 04:01:19 +000064 mode='update', baseURL='http://llvm.org/svn/llvm-project/cfe/',
Daniel Dunbar235aa412009-07-18 07:16:15 +000065 defaultBranch='trunk',
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000066 workdir='%s/tools/clang' % llvm_srcdir))
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000067
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000068 # Clean up llvm (stage 1); unless in-dir.
69 if clean and llvm_srcdir != llvm_1_objdir:
70 f.addStep(ShellCommand(name="rm-llvm.obj.stage1",
71 command=["rm", "-rf", llvm_1_objdir],
72 haltOnFailure=True,
73 description=["rm build dir", "llvm"],
74 workdir="."))
75
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000076 # Force without llvm-gcc so we don't run afoul of Frontend test failures.
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000077 base_configure_args = [WithProperties("%%(builddir)s/%s/configure" % llvm_srcdir),
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000078 '--disable-bindings']
79 base_configure_args += extra_configure_args
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000080 if triple:
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000081 base_configure_args += ['--build=%s' % triple,
82 '--host=%s' % triple,
83 '--target=%s' % triple]
84 args = base_configure_args + ["--without-llvmgcc", "--without-llvmgxx"]
Daniel Dunbar3efb7822010-02-26 19:20:00 +000085 args.append(WithProperties("--prefix=%%(builddir)s/%s" % llvm_1_installdir))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000086 args += getConfigArgs(stage1_config)
87 f.addStep(Configure(command=args,
88 workdir=llvm_1_objdir,
89 description=['configuring',stage1_config],
90 descriptionDone=['configure',stage1_config]))
91
92 # Make clean if using in-dir builds.
93 if clean and llvm_srcdir == llvm_1_objdir:
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000094 f.addStep(WarningCountingShellCommand(name="clean-llvm",
Daniel Dunbard20468a2009-11-24 18:27:23 +000095 command=[make, "clean"],
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000096 haltOnFailure=True,
97 description="cleaning llvm",
98 descriptionDone="clean llvm",
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000099 workdir=llvm_1_objdir))
100
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000101 f.addStep(WarningCountingShellCommand(name="compile",
Daniel Dunbard20468a2009-11-24 18:27:23 +0000102 command=['nice', '-n', '10',
103 make, WithProperties("-j%s" % jobs)],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000104 haltOnFailure=True,
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000105 description=["compiling", stage1_config],
106 descriptionDone=["compile", stage1_config],
107 workdir=llvm_1_objdir))
Daniel Dunbar256fed42009-11-25 21:11:08 +0000108
109 if examples:
110 f.addStep(WarningCountingShellCommand(name="compile.examples",
111 command=['nice', '-n', '10',
112 make, WithProperties("-j%s" % jobs),
113 "BUILD_EXAMPLES=1"],
114 haltOnFailure=True,
115 description=["compilinge", stage1_config, "examples"],
116 descriptionDone=["compile", stage1_config, "examples"],
117 workdir=llvm_1_objdir))
118
Daniel Dunbar93f828a2010-06-23 17:42:14 +0000119 clangTestArgs = llvmTestArgs = '-v -j %s' % jobs
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000120 if valgrind:
Daniel Dunbar89184b92010-04-18 19:09:32 +0000121 clangTestArgs += ' --vg'
Daniel Dunbara1bebce2010-03-21 01:24:00 +0000122 if valgrindLeakCheck:
123 clangTestArgs += ' --vg-leak'
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000124 clangTestArgs += ' --vg-arg --suppressions=%(builddir)s/llvm/tools/clang/utils/valgrind/x86_64-pc-linux-gnu_gcc-4.3.3.supp'
125 extraTestDirs = ''
126 if run_cxx_tests:
127 extraTestDirs += '%(builddir)s/llvm/tools/clang/utils/C++Tests'
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000128 if test:
129 f.addStep(ClangTestCommand(name='test-llvm',
Daniel Dunbar93f828a2010-06-23 17:42:14 +0000130 command=[make, "check-lit", "VERBOSE=1",
131 WithProperties("LIT_ARGS=%s" % llvmTestArgs)],
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000132 description=["testing", "llvm"],
133 descriptionDone=["test", "llvm"],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000134 workdir=llvm_1_objdir,
135 usePTY=use_pty_in_tests))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000136 f.addStep(ClangTestCommand(name='test-clang',
Daniel Dunbard20468a2009-11-24 18:27:23 +0000137 command=[make, 'test', WithProperties('TESTARGS=%s' % clangTestArgs),
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000138 WithProperties('EXTRA_TESTDIRS=%s' % extraTestDirs)],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000139 workdir='%s/tools/clang' % llvm_1_objdir,
140 usePTY=use_pty_in_tests))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000141
142 # Install llvm and clang.
143 if llvm_1_installdir:
Daniel Dunbar9870de32010-03-28 22:25:31 +0000144 f.addStep(ShellCommand(name="rm-install.clang.stage1",
145 command=["rm", "-rf", llvm_1_installdir],
146 haltOnFailure=True,
147 description=["rm install dir", "clang"],
148 workdir="."))
149 f.addStep(WarningCountingShellCommand(name="install.clang.stage1",
150 command = ['nice', '-n', '10',
151 make, 'install-clang'],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000152 haltOnFailure=True,
Daniel Dunbar9870de32010-03-28 22:25:31 +0000153 description=["install", "clang",
154 stage1_config],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000155 workdir=llvm_1_objdir))
156
157 if not useTwoStage:
158 return f
159
160 # Clean up llvm (stage 2).
161 if clean:
162 f.addStep(ShellCommand(name="rm-llvm.obj.stage2",
163 command=["rm", "-rf", llvm_2_objdir],
164 haltOnFailure=True,
165 description=["rm build dir", "llvm", "(stage 2)"],
166 workdir="."))
167
168 # Configure llvm (stage 2).
169 args = base_configure_args + ["--without-llvmgcc", "--without-llvmgxx"]
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000170 args.append(WithProperties("--prefix=%(builddir)s/" + llvm_2_installdir))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000171 args += getConfigArgs(stage2_config)
172 f.addStep(Configure(name="configure.llvm.stage2",
173 command=args,
174 env={'CC' : WithProperties("%%(builddir)s/%s/bin/clang" % llvm_1_installdir),
175 'CXX' : WithProperties("%%(builddir)s/%s/bin/clang++" % llvm_1_installdir),},
176 haltOnFailure=True,
177 workdir=llvm_2_objdir,
178 description=["configure", "llvm", "(stage 2)",
179 stage2_config]))
180
181 # Build llvm (stage 2).
182 f.addStep(WarningCountingShellCommand(name="compile.llvm.stage2",
183 command=['nice', '-n', '10',
184 make, WithProperties("-j%s" % jobs)],
185 haltOnFailure=True,
186 description=["compiling", "(stage 2)",
187 stage2_config],
188 descriptionDone=["compile", "(stage 2)",
189 stage2_config],
190 workdir=llvm_2_objdir))
191
192 if test:
193 f.addStep(ClangTestCommand(name='test-llvm',
Daniel Dunbar93f828a2010-06-23 17:42:14 +0000194 command=[make, "check-lit", "VERBOSE=1",
195 WithProperties("LIT_ARGS=%s" % llvmTestArgs)],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000196 description=["testing", "llvm"],
197 descriptionDone=["test", "llvm"],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000198 workdir=llvm_2_objdir,
199 usePTY=use_pty_in_tests))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000200 f.addStep(ClangTestCommand(name='test-clang',
201 command=[make, 'test', WithProperties('TESTARGS=%s' % clangTestArgs),
202 WithProperties('EXTRA_TESTDIRS=%s' % extraTestDirs)],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000203 workdir='%s/tools/clang' % llvm_2_objdir,
204 usePTY=use_pty_in_tests))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000205
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000206 # Install clang (stage 2).
Daniel Dunbar9870de32010-03-28 22:25:31 +0000207 f.addStep(ShellCommand(name="rm-install.clang.stage2",
208 command=["rm", "-rf", llvm_2_installdir],
209 haltOnFailure=True,
210 description=["rm install dir", "clang"],
211 workdir="."))
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000212 f.addStep(WarningCountingShellCommand(name="install.clang.stage2",
213 command = ['nice', '-n', '10',
214 make, 'install-clang'],
215 haltOnFailure=True,
216 description=["install", "clang",
217 "(stage 2)"],
218 workdir=llvm_2_objdir))
219
220 if package_dst:
221 name = WithProperties(
222 "%(builddir)s/" + llvm_2_objdir +
223 "/clang-r%(got_revision)s-b%(buildnumber)s.tgz")
224 f.addStep(ShellCommand(name='pkg.tar',
225 description="tar root",
226 command=["tar", "zcvf", name, "./"],
227 workdir=llvm_2_installdir,
228 warnOnFailure=True,
229 flunkOnFailure=False,
230 haltOnFailure=False))
231 f.addStep(ShellCommand(name='pkg.upload',
232 description="upload root",
233 command=["scp", name,
234 WithProperties(
235 package_dst + "/%(buildername)s")],
236 workdir=".",
237 warnOnFailure=True,
238 flunkOnFailure=False,
239 haltOnFailure=False))
240
Daniel Dunbar235aa412009-07-18 07:16:15 +0000241 return f
Daniel Dunbar44abe742009-07-19 01:59:03 +0000242
Daniel Dunbar06b20f12010-04-08 18:29:38 +0000243def getClangMSVCBuildFactory(update=True, clean=True, vcDrive='c', jobs=1,
244 cmake=r"c:\Program Files\CMake 2.6\bin\cmake"):
Daniel Dunbar44abe742009-07-19 01:59:03 +0000245 f = buildbot.process.factory.BuildFactory()
246
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000247 if update:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000248 f.addStep(SVN(name='svn-llvm',
249 mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
250 defaultBranch='trunk',
251 workdir='llvm'))
252
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000253 if update:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000254 f.addStep(SVN(name='svn-clang',
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000255 mode='update', baseURL='http://llvm.org/svn/llvm-project/cfe/',
Daniel Dunbar44abe742009-07-19 01:59:03 +0000256 defaultBranch='trunk',
257 workdir='llvm/tools/clang'))
258
259 # Full & fast clean.
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000260 if clean:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000261 f.addStep(ShellCommand(name='clean-1',
262 command=['del','/s/q','build'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000263 warnOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000264 description='cleaning',
265 descriptionDone='clean',
266 workdir='llvm'))
267 f.addStep(ShellCommand(name='clean-2',
268 command=['rmdir','/s/q','build'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000269 warnOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000270 description='cleaning',
271 descriptionDone='clean',
272 workdir='llvm'))
273
274 # Create the project files.
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000275
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000276 # Use batch files instead of ShellCommand directly, Windows quoting is
277 # borked. FIXME: See buildbot ticket #595 and buildbot ticket #377.
278 f.addStep(BatchFileDownload(name='cmakegen',
Daniel Dunbar06b20f12010-04-08 18:29:38 +0000279 command=[cmake,
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000280 "-DLLVM_TARGETS_TO_BUILD:=X86",
281 "-G",
282 "Visual Studio 9 2008",
283 ".."],
284 workdir="llvm\\build"))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000285 f.addStep(ShellCommand(name='cmake',
286 command=['cmakegen.bat'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000287 haltOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000288 description='cmake gen',
289 workdir='llvm\\build'))
290
291 # Build it.
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000292 f.addStep(BatchFileDownload(name='vcbuild',
293 command=[vcDrive + r""":\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages\vcbuild.exe""",
294 "/M%d" % jobs,
295 "LLVM.sln",
296 "Debug|Win32"],
297 workdir="llvm\\build"))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000298 f.addStep(WarningCountingShellCommand(name='vcbuild',
299 command=['vcbuild.bat'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000300 haltOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000301 description='vcbuild',
302 workdir='llvm\\build',
303 warningPattern=" warning C.*:"))
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000304
305 # Build clang-test project.
306 f.addStep(BatchFileDownload(name='vcbuild_test',
307 command=[vcDrive + r""":\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages\vcbuild.exe""",
308 "clang-test.vcproj",
309 "Debug|Win32"],
310 workdir="llvm\\build\\tools\\clang\\test"))
311 f.addStep(ClangTestCommand(name='test-clang',
312 command=["vcbuild_test.bat"],
313 workdir="llvm\\build\\tools\\clang\\test"))
314
Daniel Dunbar44abe742009-07-19 01:59:03 +0000315 return f
Daniel Dunbar22d594a2010-07-31 05:29:16 +0000316
317def addClangTests(f, ignores={}):
318 make_vars = [WithProperties(
319 'CC_UNDER_TEST=%(builddir)s/llvm.install/bin/clang'),
320 WithProperties(
321 'CXX_UNDER_TEST=%(builddir)s/llvm.install/bin/clang++')]
322 f.addStep(SVN(name='svn-clang-tests', mode='update',
323 baseURL='http://llvm.org/svn/llvm-project/clang-tests/',
324 defaultBranch='trunk', workdir='clang-tests'))
325 gcc_dg_ignores = ignores.get('gcc-4_2-testsuite', {})
326 for lang in ('gcc', 'g++', 'objc', 'obj-c++'):
327 f.addStep(DejaGNUCommand.DejaGNUCommand(
328 name='test-gcc-4_2-testsuite-%s' % lang,
329 command=["make", "-k", "check-%s" % lang] + make_vars,
330 description="gcc-4_2-testsuite (%s)" % lang,
331 workdir='clang-tests/gcc-4_2-testsuite',
332 logfiles={ 'dg.sum' : 'obj/%s/%s.sum' % (lang, lang) },
333 ignore=gcc_dg_ignores.get(lang, [])))