blob: 277fdcd56e8afd6ac6bea676bda632e11861daa7 [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 Dunbar235aa412009-07-18 07:16:15 +000013
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000014from Util import getConfigArgs
15
Daniel Dunbar3efb7822010-02-26 19:20:00 +000016def getClangBuildFactory(triple=None, clean=True, test=True, package_dst=None,
17 run_cxx_tests=False, examples=False, valgrind=False,
Daniel Dunbara1bebce2010-03-21 01:24:00 +000018 valgrindLeakCheck=False, outOfDir=False, useTwoStage=False,
Daniel Dunbar06b20f12010-04-08 18:29:38 +000019 completely_clean=False, always_install=False,
20 make='make', jobs="%(jobs)s",
Daniel Dunbar7e33e042010-07-14 20:34:16 +000021 stage1_config='Debug+Asserts',
22 stage2_config='Release+Asserts',
Daniel Dunbar469e8ca2010-05-19 21:26:48 +000023 extra_configure_args=[], use_pty_in_tests=False):
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000024 # Don't use in-dir builds with a two stage build process.
Daniel Dunbar3efb7822010-02-26 19:20:00 +000025 inDir = not outOfDir and not useTwoStage
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000026 if inDir:
27 llvm_srcdir = "llvm"
28 llvm_1_objdir = "llvm"
Daniel Dunbar9870de32010-03-28 22:25:31 +000029 if always_install:
30 llvm_1_installdir = "llvm.install"
31 else:
32 llvm_1_installdir = None
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000033 else:
34 llvm_srcdir = "llvm.src"
35 llvm_1_objdir = "llvm.obj"
36 llvm_1_installdir = "llvm.install.1"
37 llvm_2_objdir = "llvm.obj.2"
Daniel Dunbar3efb7822010-02-26 19:20:00 +000038 llvm_2_installdir = "llvm.install.2"
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000039
Daniel Dunbar235aa412009-07-18 07:16:15 +000040 f = buildbot.process.factory.BuildFactory()
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000041
42 # Determine the build directory.
43 f.addStep(buildbot.steps.shell.SetProperty(name="get_builddir",
44 command=["pwd"],
45 property="builddir",
46 description="set build dir",
47 workdir="."))
48
Daniel Dunbar06b20f12010-04-08 18:29:38 +000049 # Blow away completely, if requested.
50 if completely_clean:
51 f.addStep(ShellCommand(name="rm-llvm.src",
52 command=["rm", "-rf", llvm_srcdir],
53 haltOnFailure=True,
54 description=["rm src dir", "llvm"],
55 workdir="."))
56
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000057 # Checkout sources.
Daniel Dunbar235aa412009-07-18 07:16:15 +000058 f.addStep(SVN(name='svn-llvm',
59 mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
60 defaultBranch='trunk',
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000061 workdir=llvm_srcdir))
Daniel Dunbar235aa412009-07-18 07:16:15 +000062 f.addStep(SVN(name='svn-clang',
Daniel Dunbar7e959c82009-09-28 04:01:19 +000063 mode='update', baseURL='http://llvm.org/svn/llvm-project/cfe/',
Daniel Dunbar235aa412009-07-18 07:16:15 +000064 defaultBranch='trunk',
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000065 workdir='%s/tools/clang' % llvm_srcdir))
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000066
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000067 # Clean up llvm (stage 1); unless in-dir.
68 if clean and llvm_srcdir != llvm_1_objdir:
69 f.addStep(ShellCommand(name="rm-llvm.obj.stage1",
70 command=["rm", "-rf", llvm_1_objdir],
71 haltOnFailure=True,
72 description=["rm build dir", "llvm"],
73 workdir="."))
74
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000075 # Force without llvm-gcc so we don't run afoul of Frontend test failures.
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000076 base_configure_args = [WithProperties("%%(builddir)s/%s/configure" % llvm_srcdir),
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000077 '--disable-bindings']
78 base_configure_args += extra_configure_args
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000079 if triple:
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000080 base_configure_args += ['--build=%s' % triple,
81 '--host=%s' % triple,
82 '--target=%s' % triple]
83 args = base_configure_args + ["--without-llvmgcc", "--without-llvmgxx"]
Daniel Dunbar3efb7822010-02-26 19:20:00 +000084 args.append(WithProperties("--prefix=%%(builddir)s/%s" % llvm_1_installdir))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000085 args += getConfigArgs(stage1_config)
86 f.addStep(Configure(command=args,
87 workdir=llvm_1_objdir,
88 description=['configuring',stage1_config],
89 descriptionDone=['configure',stage1_config]))
90
91 # Make clean if using in-dir builds.
92 if clean and llvm_srcdir == llvm_1_objdir:
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000093 f.addStep(WarningCountingShellCommand(name="clean-llvm",
Daniel Dunbard20468a2009-11-24 18:27:23 +000094 command=[make, "clean"],
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000095 haltOnFailure=True,
96 description="cleaning llvm",
97 descriptionDone="clean llvm",
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000098 workdir=llvm_1_objdir))
99
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000100 f.addStep(WarningCountingShellCommand(name="compile",
Daniel Dunbard20468a2009-11-24 18:27:23 +0000101 command=['nice', '-n', '10',
102 make, WithProperties("-j%s" % jobs)],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000103 haltOnFailure=True,
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000104 description=["compiling", stage1_config],
105 descriptionDone=["compile", stage1_config],
106 workdir=llvm_1_objdir))
Daniel Dunbar256fed42009-11-25 21:11:08 +0000107
108 if examples:
109 f.addStep(WarningCountingShellCommand(name="compile.examples",
110 command=['nice', '-n', '10',
111 make, WithProperties("-j%s" % jobs),
112 "BUILD_EXAMPLES=1"],
113 haltOnFailure=True,
114 description=["compilinge", stage1_config, "examples"],
115 descriptionDone=["compile", stage1_config, "examples"],
116 workdir=llvm_1_objdir))
117
Daniel Dunbar93f828a2010-06-23 17:42:14 +0000118 clangTestArgs = llvmTestArgs = '-v -j %s' % jobs
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000119 if valgrind:
Daniel Dunbar89184b92010-04-18 19:09:32 +0000120 clangTestArgs += ' --vg'
Daniel Dunbara1bebce2010-03-21 01:24:00 +0000121 if valgrindLeakCheck:
122 clangTestArgs += ' --vg-leak'
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000123 clangTestArgs += ' --vg-arg --suppressions=%(builddir)s/llvm/tools/clang/utils/valgrind/x86_64-pc-linux-gnu_gcc-4.3.3.supp'
124 extraTestDirs = ''
125 if run_cxx_tests:
126 extraTestDirs += '%(builddir)s/llvm/tools/clang/utils/C++Tests'
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000127 if test:
128 f.addStep(ClangTestCommand(name='test-llvm',
Daniel Dunbar93f828a2010-06-23 17:42:14 +0000129 command=[make, "check-lit", "VERBOSE=1",
130 WithProperties("LIT_ARGS=%s" % llvmTestArgs)],
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000131 description=["testing", "llvm"],
132 descriptionDone=["test", "llvm"],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000133 workdir=llvm_1_objdir,
134 usePTY=use_pty_in_tests))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000135 f.addStep(ClangTestCommand(name='test-clang',
Daniel Dunbard20468a2009-11-24 18:27:23 +0000136 command=[make, 'test', WithProperties('TESTARGS=%s' % clangTestArgs),
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000137 WithProperties('EXTRA_TESTDIRS=%s' % extraTestDirs)],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000138 workdir='%s/tools/clang' % llvm_1_objdir,
139 usePTY=use_pty_in_tests))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000140
141 # Install llvm and clang.
142 if llvm_1_installdir:
Daniel Dunbar9870de32010-03-28 22:25:31 +0000143 f.addStep(ShellCommand(name="rm-install.clang.stage1",
144 command=["rm", "-rf", llvm_1_installdir],
145 haltOnFailure=True,
146 description=["rm install dir", "clang"],
147 workdir="."))
148 f.addStep(WarningCountingShellCommand(name="install.clang.stage1",
149 command = ['nice', '-n', '10',
150 make, 'install-clang'],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000151 haltOnFailure=True,
Daniel Dunbar9870de32010-03-28 22:25:31 +0000152 description=["install", "clang",
153 stage1_config],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000154 workdir=llvm_1_objdir))
155
156 if not useTwoStage:
157 return f
158
159 # Clean up llvm (stage 2).
160 if clean:
161 f.addStep(ShellCommand(name="rm-llvm.obj.stage2",
162 command=["rm", "-rf", llvm_2_objdir],
163 haltOnFailure=True,
164 description=["rm build dir", "llvm", "(stage 2)"],
165 workdir="."))
166
167 # Configure llvm (stage 2).
168 args = base_configure_args + ["--without-llvmgcc", "--without-llvmgxx"]
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000169 args.append(WithProperties("--prefix=%(builddir)s/" + llvm_2_installdir))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000170 args += getConfigArgs(stage2_config)
171 f.addStep(Configure(name="configure.llvm.stage2",
172 command=args,
173 env={'CC' : WithProperties("%%(builddir)s/%s/bin/clang" % llvm_1_installdir),
174 'CXX' : WithProperties("%%(builddir)s/%s/bin/clang++" % llvm_1_installdir),},
175 haltOnFailure=True,
176 workdir=llvm_2_objdir,
177 description=["configure", "llvm", "(stage 2)",
178 stage2_config]))
179
180 # Build llvm (stage 2).
181 f.addStep(WarningCountingShellCommand(name="compile.llvm.stage2",
182 command=['nice', '-n', '10',
183 make, WithProperties("-j%s" % jobs)],
184 haltOnFailure=True,
185 description=["compiling", "(stage 2)",
186 stage2_config],
187 descriptionDone=["compile", "(stage 2)",
188 stage2_config],
189 workdir=llvm_2_objdir))
190
191 if test:
192 f.addStep(ClangTestCommand(name='test-llvm',
Daniel Dunbar93f828a2010-06-23 17:42:14 +0000193 command=[make, "check-lit", "VERBOSE=1",
194 WithProperties("LIT_ARGS=%s" % llvmTestArgs)],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000195 description=["testing", "llvm"],
196 descriptionDone=["test", "llvm"],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000197 workdir=llvm_2_objdir,
198 usePTY=use_pty_in_tests))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000199 f.addStep(ClangTestCommand(name='test-clang',
200 command=[make, 'test', WithProperties('TESTARGS=%s' % clangTestArgs),
201 WithProperties('EXTRA_TESTDIRS=%s' % extraTestDirs)],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000202 workdir='%s/tools/clang' % llvm_2_objdir,
203 usePTY=use_pty_in_tests))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000204
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000205 # Install clang (stage 2).
Daniel Dunbar9870de32010-03-28 22:25:31 +0000206 f.addStep(ShellCommand(name="rm-install.clang.stage2",
207 command=["rm", "-rf", llvm_2_installdir],
208 haltOnFailure=True,
209 description=["rm install dir", "clang"],
210 workdir="."))
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000211 f.addStep(WarningCountingShellCommand(name="install.clang.stage2",
212 command = ['nice', '-n', '10',
213 make, 'install-clang'],
214 haltOnFailure=True,
215 description=["install", "clang",
216 "(stage 2)"],
217 workdir=llvm_2_objdir))
218
219 if package_dst:
220 name = WithProperties(
221 "%(builddir)s/" + llvm_2_objdir +
222 "/clang-r%(got_revision)s-b%(buildnumber)s.tgz")
223 f.addStep(ShellCommand(name='pkg.tar',
224 description="tar root",
225 command=["tar", "zcvf", name, "./"],
226 workdir=llvm_2_installdir,
227 warnOnFailure=True,
228 flunkOnFailure=False,
229 haltOnFailure=False))
230 f.addStep(ShellCommand(name='pkg.upload',
231 description="upload root",
232 command=["scp", name,
233 WithProperties(
234 package_dst + "/%(buildername)s")],
235 workdir=".",
236 warnOnFailure=True,
237 flunkOnFailure=False,
238 haltOnFailure=False))
239
Daniel Dunbar235aa412009-07-18 07:16:15 +0000240 return f
Daniel Dunbar44abe742009-07-19 01:59:03 +0000241
Daniel Dunbar06b20f12010-04-08 18:29:38 +0000242def getClangMSVCBuildFactory(update=True, clean=True, vcDrive='c', jobs=1,
243 cmake=r"c:\Program Files\CMake 2.6\bin\cmake"):
Daniel Dunbar44abe742009-07-19 01:59:03 +0000244 f = buildbot.process.factory.BuildFactory()
245
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000246 if update:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000247 f.addStep(SVN(name='svn-llvm',
248 mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
249 defaultBranch='trunk',
250 workdir='llvm'))
251
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000252 if update:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000253 f.addStep(SVN(name='svn-clang',
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000254 mode='update', baseURL='http://llvm.org/svn/llvm-project/cfe/',
Daniel Dunbar44abe742009-07-19 01:59:03 +0000255 defaultBranch='trunk',
256 workdir='llvm/tools/clang'))
257
258 # Full & fast clean.
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000259 if clean:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000260 f.addStep(ShellCommand(name='clean-1',
261 command=['del','/s/q','build'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000262 warnOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000263 description='cleaning',
264 descriptionDone='clean',
265 workdir='llvm'))
266 f.addStep(ShellCommand(name='clean-2',
267 command=['rmdir','/s/q','build'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000268 warnOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000269 description='cleaning',
270 descriptionDone='clean',
271 workdir='llvm'))
272
273 # Create the project files.
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000274
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000275 # Use batch files instead of ShellCommand directly, Windows quoting is
276 # borked. FIXME: See buildbot ticket #595 and buildbot ticket #377.
277 f.addStep(BatchFileDownload(name='cmakegen',
Daniel Dunbar06b20f12010-04-08 18:29:38 +0000278 command=[cmake,
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000279 "-DLLVM_TARGETS_TO_BUILD:=X86",
280 "-G",
281 "Visual Studio 9 2008",
282 ".."],
283 workdir="llvm\\build"))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000284 f.addStep(ShellCommand(name='cmake',
285 command=['cmakegen.bat'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000286 haltOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000287 description='cmake gen',
288 workdir='llvm\\build'))
289
290 # Build it.
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000291 f.addStep(BatchFileDownload(name='vcbuild',
292 command=[vcDrive + r""":\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages\vcbuild.exe""",
293 "/M%d" % jobs,
294 "LLVM.sln",
295 "Debug|Win32"],
296 workdir="llvm\\build"))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000297 f.addStep(WarningCountingShellCommand(name='vcbuild',
298 command=['vcbuild.bat'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000299 haltOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000300 description='vcbuild',
301 workdir='llvm\\build',
302 warningPattern=" warning C.*:"))
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000303
304 # Build clang-test project.
305 f.addStep(BatchFileDownload(name='vcbuild_test',
306 command=[vcDrive + r""":\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages\vcbuild.exe""",
307 "clang-test.vcproj",
308 "Debug|Win32"],
309 workdir="llvm\\build\\tools\\clang\\test"))
310 f.addStep(ClangTestCommand(name='test-clang',
311 command=["vcbuild_test.bat"],
312 workdir="llvm\\build\\tools\\clang\\test"))
313
Daniel Dunbar44abe742009-07-19 01:59:03 +0000314 return f