blob: 5b53c3cf2a1cce875cb6edc828b48ca919224217 [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 Dunbar8a89a6f2009-11-25 04:27:32 +000021 stage1_config='Debug', stage2_config='Release',
Daniel Dunbar469e8ca2010-05-19 21:26:48 +000022 extra_configure_args=[], use_pty_in_tests=False):
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000023 # Don't use in-dir builds with a two stage build process.
Daniel Dunbar3efb7822010-02-26 19:20:00 +000024 inDir = not outOfDir and not useTwoStage
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000025 if inDir:
26 llvm_srcdir = "llvm"
27 llvm_1_objdir = "llvm"
Daniel Dunbar9870de32010-03-28 22:25:31 +000028 if always_install:
29 llvm_1_installdir = "llvm.install"
30 else:
31 llvm_1_installdir = None
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000032 else:
33 llvm_srcdir = "llvm.src"
34 llvm_1_objdir = "llvm.obj"
35 llvm_1_installdir = "llvm.install.1"
36 llvm_2_objdir = "llvm.obj.2"
Daniel Dunbar3efb7822010-02-26 19:20:00 +000037 llvm_2_installdir = "llvm.install.2"
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000038
Daniel Dunbar235aa412009-07-18 07:16:15 +000039 f = buildbot.process.factory.BuildFactory()
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000040
41 # Determine the build directory.
42 f.addStep(buildbot.steps.shell.SetProperty(name="get_builddir",
43 command=["pwd"],
44 property="builddir",
45 description="set build dir",
46 workdir="."))
47
Daniel Dunbar06b20f12010-04-08 18:29:38 +000048 # Blow away completely, if requested.
49 if completely_clean:
50 f.addStep(ShellCommand(name="rm-llvm.src",
51 command=["rm", "-rf", llvm_srcdir],
52 haltOnFailure=True,
53 description=["rm src dir", "llvm"],
54 workdir="."))
55
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000056 # Checkout sources.
Daniel Dunbar235aa412009-07-18 07:16:15 +000057 f.addStep(SVN(name='svn-llvm',
58 mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
59 defaultBranch='trunk',
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000060 workdir=llvm_srcdir))
Daniel Dunbar235aa412009-07-18 07:16:15 +000061 f.addStep(SVN(name='svn-clang',
Daniel Dunbar7e959c82009-09-28 04:01:19 +000062 mode='update', baseURL='http://llvm.org/svn/llvm-project/cfe/',
Daniel Dunbar235aa412009-07-18 07:16:15 +000063 defaultBranch='trunk',
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000064 workdir='%s/tools/clang' % llvm_srcdir))
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000065
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000066 # Clean up llvm (stage 1); unless in-dir.
67 if clean and llvm_srcdir != llvm_1_objdir:
68 f.addStep(ShellCommand(name="rm-llvm.obj.stage1",
69 command=["rm", "-rf", llvm_1_objdir],
70 haltOnFailure=True,
71 description=["rm build dir", "llvm"],
72 workdir="."))
73
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000074 # Force without llvm-gcc so we don't run afoul of Frontend test failures.
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000075 base_configure_args = [WithProperties("%%(builddir)s/%s/configure" % llvm_srcdir),
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000076 '--disable-bindings']
77 base_configure_args += extra_configure_args
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000078 if triple:
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000079 base_configure_args += ['--build=%s' % triple,
80 '--host=%s' % triple,
81 '--target=%s' % triple]
82 args = base_configure_args + ["--without-llvmgcc", "--without-llvmgxx"]
Daniel Dunbar3efb7822010-02-26 19:20:00 +000083 args.append(WithProperties("--prefix=%%(builddir)s/%s" % llvm_1_installdir))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000084 args += getConfigArgs(stage1_config)
85 f.addStep(Configure(command=args,
86 workdir=llvm_1_objdir,
87 description=['configuring',stage1_config],
88 descriptionDone=['configure',stage1_config]))
89
90 # Make clean if using in-dir builds.
91 if clean and llvm_srcdir == llvm_1_objdir:
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000092 f.addStep(WarningCountingShellCommand(name="clean-llvm",
Daniel Dunbard20468a2009-11-24 18:27:23 +000093 command=[make, "clean"],
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000094 haltOnFailure=True,
95 description="cleaning llvm",
96 descriptionDone="clean llvm",
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000097 workdir=llvm_1_objdir))
98
Daniel Dunbar7e959c82009-09-28 04:01:19 +000099 f.addStep(WarningCountingShellCommand(name="compile",
Daniel Dunbard20468a2009-11-24 18:27:23 +0000100 command=['nice', '-n', '10',
101 make, WithProperties("-j%s" % jobs)],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000102 haltOnFailure=True,
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000103 description=["compiling", stage1_config],
104 descriptionDone=["compile", stage1_config],
105 workdir=llvm_1_objdir))
Daniel Dunbar256fed42009-11-25 21:11:08 +0000106
107 if examples:
108 f.addStep(WarningCountingShellCommand(name="compile.examples",
109 command=['nice', '-n', '10',
110 make, WithProperties("-j%s" % jobs),
111 "BUILD_EXAMPLES=1"],
112 haltOnFailure=True,
113 description=["compilinge", stage1_config, "examples"],
114 descriptionDone=["compile", stage1_config, "examples"],
115 workdir=llvm_1_objdir))
116
Daniel Dunbar93f828a2010-06-23 17:42:14 +0000117 clangTestArgs = llvmTestArgs = '-v -j %s' % jobs
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000118 if valgrind:
Daniel Dunbar89184b92010-04-18 19:09:32 +0000119 clangTestArgs += ' --vg'
Daniel Dunbara1bebce2010-03-21 01:24:00 +0000120 if valgrindLeakCheck:
121 clangTestArgs += ' --vg-leak'
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000122 clangTestArgs += ' --vg-arg --suppressions=%(builddir)s/llvm/tools/clang/utils/valgrind/x86_64-pc-linux-gnu_gcc-4.3.3.supp'
123 extraTestDirs = ''
124 if run_cxx_tests:
125 extraTestDirs += '%(builddir)s/llvm/tools/clang/utils/C++Tests'
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000126 if test:
127 f.addStep(ClangTestCommand(name='test-llvm',
Daniel Dunbar93f828a2010-06-23 17:42:14 +0000128 command=[make, "check-lit", "VERBOSE=1",
129 WithProperties("LIT_ARGS=%s" % llvmTestArgs)],
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000130 description=["testing", "llvm"],
131 descriptionDone=["test", "llvm"],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000132 workdir=llvm_1_objdir,
133 usePTY=use_pty_in_tests))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000134 f.addStep(ClangTestCommand(name='test-clang',
Daniel Dunbard20468a2009-11-24 18:27:23 +0000135 command=[make, 'test', WithProperties('TESTARGS=%s' % clangTestArgs),
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000136 WithProperties('EXTRA_TESTDIRS=%s' % extraTestDirs)],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000137 workdir='%s/tools/clang' % llvm_1_objdir,
138 usePTY=use_pty_in_tests))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000139
140 # Install llvm and clang.
141 if llvm_1_installdir:
Daniel Dunbar9870de32010-03-28 22:25:31 +0000142 f.addStep(ShellCommand(name="rm-install.clang.stage1",
143 command=["rm", "-rf", llvm_1_installdir],
144 haltOnFailure=True,
145 description=["rm install dir", "clang"],
146 workdir="."))
147 f.addStep(WarningCountingShellCommand(name="install.clang.stage1",
148 command = ['nice', '-n', '10',
149 make, 'install-clang'],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000150 haltOnFailure=True,
Daniel Dunbar9870de32010-03-28 22:25:31 +0000151 description=["install", "clang",
152 stage1_config],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000153 workdir=llvm_1_objdir))
154
155 if not useTwoStage:
156 return f
157
158 # Clean up llvm (stage 2).
159 if clean:
160 f.addStep(ShellCommand(name="rm-llvm.obj.stage2",
161 command=["rm", "-rf", llvm_2_objdir],
162 haltOnFailure=True,
163 description=["rm build dir", "llvm", "(stage 2)"],
164 workdir="."))
165
166 # Configure llvm (stage 2).
167 args = base_configure_args + ["--without-llvmgcc", "--without-llvmgxx"]
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000168 args.append(WithProperties("--prefix=%(builddir)s/" + llvm_2_installdir))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000169 args += getConfigArgs(stage2_config)
170 f.addStep(Configure(name="configure.llvm.stage2",
171 command=args,
172 env={'CC' : WithProperties("%%(builddir)s/%s/bin/clang" % llvm_1_installdir),
173 'CXX' : WithProperties("%%(builddir)s/%s/bin/clang++" % llvm_1_installdir),},
174 haltOnFailure=True,
175 workdir=llvm_2_objdir,
176 description=["configure", "llvm", "(stage 2)",
177 stage2_config]))
178
179 # Build llvm (stage 2).
180 f.addStep(WarningCountingShellCommand(name="compile.llvm.stage2",
181 command=['nice', '-n', '10',
182 make, WithProperties("-j%s" % jobs)],
183 haltOnFailure=True,
184 description=["compiling", "(stage 2)",
185 stage2_config],
186 descriptionDone=["compile", "(stage 2)",
187 stage2_config],
188 workdir=llvm_2_objdir))
189
190 if test:
191 f.addStep(ClangTestCommand(name='test-llvm',
Daniel Dunbar93f828a2010-06-23 17:42:14 +0000192 command=[make, "check-lit", "VERBOSE=1",
193 WithProperties("LIT_ARGS=%s" % llvmTestArgs)],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000194 description=["testing", "llvm"],
195 descriptionDone=["test", "llvm"],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000196 workdir=llvm_2_objdir,
197 usePTY=use_pty_in_tests))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000198 f.addStep(ClangTestCommand(name='test-clang',
199 command=[make, 'test', WithProperties('TESTARGS=%s' % clangTestArgs),
200 WithProperties('EXTRA_TESTDIRS=%s' % extraTestDirs)],
Daniel Dunbar469e8ca2010-05-19 21:26:48 +0000201 workdir='%s/tools/clang' % llvm_2_objdir,
202 usePTY=use_pty_in_tests))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000203
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000204 # Install clang (stage 2).
Daniel Dunbar9870de32010-03-28 22:25:31 +0000205 f.addStep(ShellCommand(name="rm-install.clang.stage2",
206 command=["rm", "-rf", llvm_2_installdir],
207 haltOnFailure=True,
208 description=["rm install dir", "clang"],
209 workdir="."))
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000210 f.addStep(WarningCountingShellCommand(name="install.clang.stage2",
211 command = ['nice', '-n', '10',
212 make, 'install-clang'],
213 haltOnFailure=True,
214 description=["install", "clang",
215 "(stage 2)"],
216 workdir=llvm_2_objdir))
217
218 if package_dst:
219 name = WithProperties(
220 "%(builddir)s/" + llvm_2_objdir +
221 "/clang-r%(got_revision)s-b%(buildnumber)s.tgz")
222 f.addStep(ShellCommand(name='pkg.tar',
223 description="tar root",
224 command=["tar", "zcvf", name, "./"],
225 workdir=llvm_2_installdir,
226 warnOnFailure=True,
227 flunkOnFailure=False,
228 haltOnFailure=False))
229 f.addStep(ShellCommand(name='pkg.upload',
230 description="upload root",
231 command=["scp", name,
232 WithProperties(
233 package_dst + "/%(buildername)s")],
234 workdir=".",
235 warnOnFailure=True,
236 flunkOnFailure=False,
237 haltOnFailure=False))
238
Daniel Dunbar235aa412009-07-18 07:16:15 +0000239 return f
Daniel Dunbar44abe742009-07-19 01:59:03 +0000240
Daniel Dunbar06b20f12010-04-08 18:29:38 +0000241def getClangMSVCBuildFactory(update=True, clean=True, vcDrive='c', jobs=1,
242 cmake=r"c:\Program Files\CMake 2.6\bin\cmake"):
Daniel Dunbar44abe742009-07-19 01:59:03 +0000243 f = buildbot.process.factory.BuildFactory()
244
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000245 if update:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000246 f.addStep(SVN(name='svn-llvm',
247 mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
248 defaultBranch='trunk',
249 workdir='llvm'))
250
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000251 if update:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000252 f.addStep(SVN(name='svn-clang',
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000253 mode='update', baseURL='http://llvm.org/svn/llvm-project/cfe/',
Daniel Dunbar44abe742009-07-19 01:59:03 +0000254 defaultBranch='trunk',
255 workdir='llvm/tools/clang'))
256
257 # Full & fast clean.
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000258 if clean:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000259 f.addStep(ShellCommand(name='clean-1',
260 command=['del','/s/q','build'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000261 warnOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000262 description='cleaning',
263 descriptionDone='clean',
264 workdir='llvm'))
265 f.addStep(ShellCommand(name='clean-2',
266 command=['rmdir','/s/q','build'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000267 warnOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000268 description='cleaning',
269 descriptionDone='clean',
270 workdir='llvm'))
271
272 # Create the project files.
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000273
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000274 # Use batch files instead of ShellCommand directly, Windows quoting is
275 # borked. FIXME: See buildbot ticket #595 and buildbot ticket #377.
276 f.addStep(BatchFileDownload(name='cmakegen',
Daniel Dunbar06b20f12010-04-08 18:29:38 +0000277 command=[cmake,
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000278 "-DLLVM_TARGETS_TO_BUILD:=X86",
279 "-G",
280 "Visual Studio 9 2008",
281 ".."],
282 workdir="llvm\\build"))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000283 f.addStep(ShellCommand(name='cmake',
284 command=['cmakegen.bat'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000285 haltOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000286 description='cmake gen',
287 workdir='llvm\\build'))
288
289 # Build it.
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000290 f.addStep(BatchFileDownload(name='vcbuild',
291 command=[vcDrive + r""":\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages\vcbuild.exe""",
292 "/M%d" % jobs,
293 "LLVM.sln",
294 "Debug|Win32"],
295 workdir="llvm\\build"))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000296 f.addStep(WarningCountingShellCommand(name='vcbuild',
297 command=['vcbuild.bat'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000298 haltOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000299 description='vcbuild',
300 workdir='llvm\\build',
301 warningPattern=" warning C.*:"))
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000302
303 # Build clang-test project.
304 f.addStep(BatchFileDownload(name='vcbuild_test',
305 command=[vcDrive + r""":\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages\vcbuild.exe""",
306 "clang-test.vcproj",
307 "Debug|Win32"],
308 workdir="llvm\\build\\tools\\clang\\test"))
309 f.addStep(ClangTestCommand(name='test-clang',
310 command=["vcbuild_test.bat"],
311 workdir="llvm\\build\\tools\\clang\\test"))
312
Daniel Dunbar44abe742009-07-19 01:59:03 +0000313 return f