blob: d9fa39b406a9f0059c8d7fa347b8358903db6a55 [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 Dunbar9870de32010-03-28 22:25:31 +000019 always_install=False, make='make', jobs="%(jobs)s",
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000020 stage1_config='Debug', stage2_config='Release',
21 extra_configure_args=[]):
22 # Don't use in-dir builds with a two stage build process.
Daniel Dunbar3efb7822010-02-26 19:20:00 +000023 inDir = not outOfDir and not useTwoStage
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000024 if inDir:
25 llvm_srcdir = "llvm"
26 llvm_1_objdir = "llvm"
Daniel Dunbar9870de32010-03-28 22:25:31 +000027 if always_install:
28 llvm_1_installdir = "llvm.install"
29 else:
30 llvm_1_installdir = None
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000031 else:
32 llvm_srcdir = "llvm.src"
33 llvm_1_objdir = "llvm.obj"
34 llvm_1_installdir = "llvm.install.1"
35 llvm_2_objdir = "llvm.obj.2"
Daniel Dunbar3efb7822010-02-26 19:20:00 +000036 llvm_2_installdir = "llvm.install.2"
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000037
Daniel Dunbar235aa412009-07-18 07:16:15 +000038 f = buildbot.process.factory.BuildFactory()
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000039
40 # Determine the build directory.
41 f.addStep(buildbot.steps.shell.SetProperty(name="get_builddir",
42 command=["pwd"],
43 property="builddir",
44 description="set build dir",
45 workdir="."))
46
47 # Checkout sources.
Daniel Dunbar235aa412009-07-18 07:16:15 +000048 f.addStep(SVN(name='svn-llvm',
49 mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
50 defaultBranch='trunk',
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000051 workdir=llvm_srcdir))
Daniel Dunbar235aa412009-07-18 07:16:15 +000052 f.addStep(SVN(name='svn-clang',
Daniel Dunbar7e959c82009-09-28 04:01:19 +000053 mode='update', baseURL='http://llvm.org/svn/llvm-project/cfe/',
Daniel Dunbar235aa412009-07-18 07:16:15 +000054 defaultBranch='trunk',
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000055 workdir='%s/tools/clang' % llvm_srcdir))
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000056
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000057 # Clean up llvm (stage 1); unless in-dir.
58 if clean and llvm_srcdir != llvm_1_objdir:
59 f.addStep(ShellCommand(name="rm-llvm.obj.stage1",
60 command=["rm", "-rf", llvm_1_objdir],
61 haltOnFailure=True,
62 description=["rm build dir", "llvm"],
63 workdir="."))
64
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000065 # Force without llvm-gcc so we don't run afoul of Frontend test failures.
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000066 base_configure_args = [WithProperties("%%(builddir)s/%s/configure" % llvm_srcdir),
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000067 '--disable-bindings']
68 base_configure_args += extra_configure_args
Daniel Dunbarfa0e0222009-11-09 06:08:28 +000069 if triple:
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000070 base_configure_args += ['--build=%s' % triple,
71 '--host=%s' % triple,
72 '--target=%s' % triple]
73 args = base_configure_args + ["--without-llvmgcc", "--without-llvmgxx"]
Daniel Dunbar3efb7822010-02-26 19:20:00 +000074 args.append(WithProperties("--prefix=%%(builddir)s/%s" % llvm_1_installdir))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000075 args += getConfigArgs(stage1_config)
76 f.addStep(Configure(command=args,
77 workdir=llvm_1_objdir,
78 description=['configuring',stage1_config],
79 descriptionDone=['configure',stage1_config]))
80
81 # Make clean if using in-dir builds.
82 if clean and llvm_srcdir == llvm_1_objdir:
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000083 f.addStep(WarningCountingShellCommand(name="clean-llvm",
Daniel Dunbard20468a2009-11-24 18:27:23 +000084 command=[make, "clean"],
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +000085 haltOnFailure=True,
86 description="cleaning llvm",
87 descriptionDone="clean llvm",
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000088 workdir=llvm_1_objdir))
89
Daniel Dunbar7e959c82009-09-28 04:01:19 +000090 f.addStep(WarningCountingShellCommand(name="compile",
Daniel Dunbard20468a2009-11-24 18:27:23 +000091 command=['nice', '-n', '10',
92 make, WithProperties("-j%s" % jobs)],
Daniel Dunbar7e959c82009-09-28 04:01:19 +000093 haltOnFailure=True,
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +000094 description=["compiling", stage1_config],
95 descriptionDone=["compile", stage1_config],
96 workdir=llvm_1_objdir))
Daniel Dunbar256fed42009-11-25 21:11:08 +000097
98 if examples:
99 f.addStep(WarningCountingShellCommand(name="compile.examples",
100 command=['nice', '-n', '10',
101 make, WithProperties("-j%s" % jobs),
102 "BUILD_EXAMPLES=1"],
103 haltOnFailure=True,
104 description=["compilinge", stage1_config, "examples"],
105 descriptionDone=["compile", stage1_config, "examples"],
106 workdir=llvm_1_objdir))
107
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000108 clangTestArgs = '-v'
109 if valgrind:
110 clangTestArgs += ' --vg '
Daniel Dunbara1bebce2010-03-21 01:24:00 +0000111 if valgrindLeakCheck:
112 clangTestArgs += ' --vg-leak'
113 else:
114 clangTestArgs += ' --vg-arg --leak-check=no'
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000115 clangTestArgs += ' --vg-arg --suppressions=%(builddir)s/llvm/tools/clang/utils/valgrind/x86_64-pc-linux-gnu_gcc-4.3.3.supp'
116 extraTestDirs = ''
117 if run_cxx_tests:
118 extraTestDirs += '%(builddir)s/llvm/tools/clang/utils/C++Tests'
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000119 if test:
120 f.addStep(ClangTestCommand(name='test-llvm',
Daniel Dunbard20468a2009-11-24 18:27:23 +0000121 command=[make, "check-lit", "VERBOSE=1"],
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000122 description=["testing", "llvm"],
123 descriptionDone=["test", "llvm"],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000124 workdir=llvm_1_objdir))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000125 f.addStep(ClangTestCommand(name='test-clang',
Daniel Dunbard20468a2009-11-24 18:27:23 +0000126 command=[make, 'test', WithProperties('TESTARGS=%s' % clangTestArgs),
Daniel Dunbarfa0e0222009-11-09 06:08:28 +0000127 WithProperties('EXTRA_TESTDIRS=%s' % extraTestDirs)],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000128 workdir='%s/tools/clang' % llvm_1_objdir))
129
130 # Install llvm and clang.
131 if llvm_1_installdir:
Daniel Dunbar9870de32010-03-28 22:25:31 +0000132 f.addStep(ShellCommand(name="rm-install.clang.stage1",
133 command=["rm", "-rf", llvm_1_installdir],
134 haltOnFailure=True,
135 description=["rm install dir", "clang"],
136 workdir="."))
137 f.addStep(WarningCountingShellCommand(name="install.clang.stage1",
138 command = ['nice', '-n', '10',
139 make, 'install-clang'],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000140 haltOnFailure=True,
Daniel Dunbar9870de32010-03-28 22:25:31 +0000141 description=["install", "clang",
142 stage1_config],
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000143 workdir=llvm_1_objdir))
144
145 if not useTwoStage:
146 return f
147
148 # Clean up llvm (stage 2).
149 if clean:
150 f.addStep(ShellCommand(name="rm-llvm.obj.stage2",
151 command=["rm", "-rf", llvm_2_objdir],
152 haltOnFailure=True,
153 description=["rm build dir", "llvm", "(stage 2)"],
154 workdir="."))
155
156 # Configure llvm (stage 2).
157 args = base_configure_args + ["--without-llvmgcc", "--without-llvmgxx"]
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000158 args.append(WithProperties("--prefix=%(builddir)s/" + llvm_2_installdir))
Daniel Dunbar8a89a6f2009-11-25 04:27:32 +0000159 args += getConfigArgs(stage2_config)
160 f.addStep(Configure(name="configure.llvm.stage2",
161 command=args,
162 env={'CC' : WithProperties("%%(builddir)s/%s/bin/clang" % llvm_1_installdir),
163 'CXX' : WithProperties("%%(builddir)s/%s/bin/clang++" % llvm_1_installdir),},
164 haltOnFailure=True,
165 workdir=llvm_2_objdir,
166 description=["configure", "llvm", "(stage 2)",
167 stage2_config]))
168
169 # Build llvm (stage 2).
170 f.addStep(WarningCountingShellCommand(name="compile.llvm.stage2",
171 command=['nice', '-n', '10',
172 make, WithProperties("-j%s" % jobs)],
173 haltOnFailure=True,
174 description=["compiling", "(stage 2)",
175 stage2_config],
176 descriptionDone=["compile", "(stage 2)",
177 stage2_config],
178 workdir=llvm_2_objdir))
179
180 if test:
181 f.addStep(ClangTestCommand(name='test-llvm',
182 command=[make, "check-lit", "VERBOSE=1"],
183 description=["testing", "llvm"],
184 descriptionDone=["test", "llvm"],
185 workdir=llvm_2_objdir))
186 f.addStep(ClangTestCommand(name='test-clang',
187 command=[make, 'test', WithProperties('TESTARGS=%s' % clangTestArgs),
188 WithProperties('EXTRA_TESTDIRS=%s' % extraTestDirs)],
189 workdir='%s/tools/clang' % llvm_2_objdir))
190
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000191 # Install clang (stage 2).
Daniel Dunbar9870de32010-03-28 22:25:31 +0000192 f.addStep(ShellCommand(name="rm-install.clang.stage2",
193 command=["rm", "-rf", llvm_2_installdir],
194 haltOnFailure=True,
195 description=["rm install dir", "clang"],
196 workdir="."))
Daniel Dunbar3efb7822010-02-26 19:20:00 +0000197 f.addStep(WarningCountingShellCommand(name="install.clang.stage2",
198 command = ['nice', '-n', '10',
199 make, 'install-clang'],
200 haltOnFailure=True,
201 description=["install", "clang",
202 "(stage 2)"],
203 workdir=llvm_2_objdir))
204
205 if package_dst:
206 name = WithProperties(
207 "%(builddir)s/" + llvm_2_objdir +
208 "/clang-r%(got_revision)s-b%(buildnumber)s.tgz")
209 f.addStep(ShellCommand(name='pkg.tar',
210 description="tar root",
211 command=["tar", "zcvf", name, "./"],
212 workdir=llvm_2_installdir,
213 warnOnFailure=True,
214 flunkOnFailure=False,
215 haltOnFailure=False))
216 f.addStep(ShellCommand(name='pkg.upload',
217 description="upload root",
218 command=["scp", name,
219 WithProperties(
220 package_dst + "/%(buildername)s")],
221 workdir=".",
222 warnOnFailure=True,
223 flunkOnFailure=False,
224 haltOnFailure=False))
225
Daniel Dunbar235aa412009-07-18 07:16:15 +0000226 return f
Daniel Dunbar44abe742009-07-19 01:59:03 +0000227
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000228def getClangMSVCBuildFactory(update=True, clean=True, vcDrive='c', jobs=1):
Daniel Dunbar44abe742009-07-19 01:59:03 +0000229 f = buildbot.process.factory.BuildFactory()
230
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000231 if update:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000232 f.addStep(SVN(name='svn-llvm',
233 mode='update', baseURL='http://llvm.org/svn/llvm-project/llvm/',
234 defaultBranch='trunk',
235 workdir='llvm'))
236
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000237 if update:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000238 f.addStep(SVN(name='svn-clang',
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000239 mode='update', baseURL='http://llvm.org/svn/llvm-project/cfe/',
Daniel Dunbar44abe742009-07-19 01:59:03 +0000240 defaultBranch='trunk',
241 workdir='llvm/tools/clang'))
242
243 # Full & fast clean.
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000244 if clean:
Daniel Dunbar44abe742009-07-19 01:59:03 +0000245 f.addStep(ShellCommand(name='clean-1',
246 command=['del','/s/q','build'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000247 warnOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000248 description='cleaning',
249 descriptionDone='clean',
250 workdir='llvm'))
251 f.addStep(ShellCommand(name='clean-2',
252 command=['rmdir','/s/q','build'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000253 warnOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000254 description='cleaning',
255 descriptionDone='clean',
256 workdir='llvm'))
257
258 # Create the project files.
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000259
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000260 # Use batch files instead of ShellCommand directly, Windows quoting is
261 # borked. FIXME: See buildbot ticket #595 and buildbot ticket #377.
262 f.addStep(BatchFileDownload(name='cmakegen',
263 command=[r"c:\Program Files\CMake 2.6\bin\cmake",
264 "-DLLVM_TARGETS_TO_BUILD:=X86",
265 "-G",
266 "Visual Studio 9 2008",
267 ".."],
268 workdir="llvm\\build"))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000269 f.addStep(ShellCommand(name='cmake',
270 command=['cmakegen.bat'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000271 haltOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000272 description='cmake gen',
273 workdir='llvm\\build'))
274
275 # Build it.
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000276 f.addStep(BatchFileDownload(name='vcbuild',
277 command=[vcDrive + r""":\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages\vcbuild.exe""",
278 "/M%d" % jobs,
279 "LLVM.sln",
280 "Debug|Win32"],
281 workdir="llvm\\build"))
Daniel Dunbar44abe742009-07-19 01:59:03 +0000282 f.addStep(WarningCountingShellCommand(name='vcbuild',
283 command=['vcbuild.bat'],
Daniel Dunbar7e959c82009-09-28 04:01:19 +0000284 haltOnFailure=True,
Daniel Dunbar44abe742009-07-19 01:59:03 +0000285 description='vcbuild',
286 workdir='llvm\\build',
287 warningPattern=" warning C.*:"))
Daniel Dunbarb51f6ab2009-11-09 03:09:23 +0000288
289 # Build clang-test project.
290 f.addStep(BatchFileDownload(name='vcbuild_test',
291 command=[vcDrive + r""":\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages\vcbuild.exe""",
292 "clang-test.vcproj",
293 "Debug|Win32"],
294 workdir="llvm\\build\\tools\\clang\\test"))
295 f.addStep(ClangTestCommand(name='test-clang',
296 command=["vcbuild_test.bat"],
297 workdir="llvm\\build\\tools\\clang\\test"))
298
Daniel Dunbar44abe742009-07-19 01:59:03 +0000299 return f