blob: a1ed6fd0d3fbe089d60aba2e93d16b542f6b2492 [file] [log] [blame]
Galina Kistanova0035b5d2016-10-07 20:47:51 +00001from buildbot.steps.slave import RemoveDirectory
Galina Kistanova8358cdd2017-03-10 01:06:35 +00002from buildbot.process.properties import WithProperties, Property
3from buildbot.steps.shell import SetProperty
Galina Kistanova0035b5d2016-10-07 20:47:51 +00004
5from zorg.buildbot.commands.CmakeCommand import CmakeCommand
6from zorg.buildbot.commands.NinjaCommand import NinjaCommand
Galina Kistanova0035b5d2016-10-07 20:47:51 +00007
8from zorg.buildbot.conditions.FileConditions import FileDoesNotExist
9from zorg.buildbot.process.factory import LLVMBuildFactory
10
Galina Kistanova8358cdd2017-03-10 01:06:35 +000011import zorg.buildbot.builders.Util as builders_util
12
Galina Kistanova05083572019-10-14 18:54:37 +000013def getLLVMBuildFactoryAndPrepareForSourcecodeSteps(
Galina Kistanova0035b5d2016-10-07 20:47:51 +000014 depends_on_projects = None,
15 llvm_srcdir = None,
16 obj_dir = None,
17 install_dir = None,
Galina Kistanova9124b832016-12-22 00:46:41 +000018 cleanBuildRequested = None,
Galina Kistanova0035b5d2016-10-07 20:47:51 +000019 env = None,
20 **kwargs):
21
Galina Kistanova53f05f32017-05-03 20:22:21 +000022 def cleanBuildRequestedByProperty(step):
Galina Kistanova44ffc0a2019-10-13 03:30:02 +000023 return step.build.getProperty("clean")
Galina Kistanova0035b5d2016-10-07 20:47:51 +000024
Galina Kistanova9124b832016-12-22 00:46:41 +000025 if cleanBuildRequested is None:
Galina Kistanova44ffc0a2019-10-13 03:30:02 +000026 # We want a clean checkout only if requested by the property.
27 cleanBuildRequested = cleanBuildRequestedByProperty
Galina Kistanova0035b5d2016-10-07 20:47:51 +000028
29 f = LLVMBuildFactory(
30 depends_on_projects=depends_on_projects,
Galina Kistanova44ffc0a2019-10-13 03:30:02 +000031 llvm_srcdir=llvm_srcdir,
32 obj_dir=obj_dir,
Galina Kistanova0035b5d2016-10-07 20:47:51 +000033 install_dir=install_dir,
34 cleanBuildRequested=cleanBuildRequested,
Galina Kistanova9124b832016-12-22 00:46:41 +000035 **kwargs) # Pass through all the extra arguments.
Galina Kistanova0035b5d2016-10-07 20:47:51 +000036
Galina Kistanova44ffc0a2019-10-13 03:30:02 +000037 # Remove the source code for a clean checkout if requested by property.
Galina Kistanova9124b832016-12-22 00:46:41 +000038 # TODO: Some Windows slaves do not handle RemoveDirectory command well.
39 # So, consider running "rmdir /S /Q <dir>" if the build runs on Windows.
Galina Kistanova0035b5d2016-10-07 20:47:51 +000040 f.addStep(RemoveDirectory(name='clean-src-dir',
Galina Kistanova56ae66e2019-10-17 17:32:48 +000041 dir=f.llvm_srcdir,
Galina Kistanova0035b5d2016-10-07 20:47:51 +000042 haltOnFailure=False,
43 flunkOnFailure=False,
Galina Kistanova53f05f32017-05-03 20:22:21 +000044 doStepIf=cleanBuildRequestedByProperty,
Galina Kistanova0035b5d2016-10-07 20:47:51 +000045 ))
46
Galina Kistanova05083572019-10-14 18:54:37 +000047 return f
48
Galina Kistanova5049f322019-10-14 22:12:28 +000049def getLLVMBuildFactoryAndSourcecodeSteps(
Galina Kistanova05083572019-10-14 18:54:37 +000050 depends_on_projects = None,
51 llvm_srcdir = None,
52 obj_dir = None,
53 install_dir = None,
54 cleanBuildRequested = None,
Galina Kistanova56ae66e2019-10-17 17:32:48 +000055 env = None,
Galina Kistanova05083572019-10-14 18:54:37 +000056 **kwargs):
57
58 f = getLLVMBuildFactoryAndPrepareForSourcecodeSteps(
59 depends_on_projects=depends_on_projects,
60 llvm_srcdir=llvm_srcdir,
61 obj_dir=obj_dir,
62 install_dir=install_dir,
63 cleanBuildRequested=cleanBuildRequested,
64 **kwargs) # Pass through all the extra arguments.
65
Galina Kistanova0035b5d2016-10-07 20:47:51 +000066 # Get the source code.
Galina Kistanova5049f322019-10-14 22:12:28 +000067 f.addGetSourcecodeSteps(**kwargs)
Galina Kistanova0035b5d2016-10-07 20:47:51 +000068
Galina Kistanova9124b832016-12-22 00:46:41 +000069 return f
Galina Kistanova0035b5d2016-10-07 20:47:51 +000070
Galina Kistanova5049f322019-10-14 22:12:28 +000071# NOTE: getLLVMBuildFactoryAndSVNSteps is deprecated and will be removed.
72# Please use getLLVMBuildFactoryAndSourcecodeSteps instead.
73def getLLVMBuildFactoryAndSVNSteps(**kwargs):
74 f = getgetLLVMBuildFactoryAndSourcecodeSteps(**kwargs) # Pass through all the extra arguments.
75 return f
76
Galina Kistanova9124b832016-12-22 00:46:41 +000077def addCmakeSteps(
78 f,
79 cleanBuildRequested,
80 obj_dir,
81 install_dir = None,
82 extra_configure_args = None,
83 env = None,
84 stage_name = None,
85 **kwargs):
Galina Kistanova0035b5d2016-10-07 20:47:51 +000086
87 # Make a local copy of the configure args, as we are going to modify that.
88 if extra_configure_args:
89 cmake_args = extra_configure_args[:]
90 else:
91 cmake_args = list()
92
Galina Kistanova920a6092019-10-13 21:39:00 +000093 if obj_dir is None:
94 obj_dir = f.obj_dir
95
Galina Kistanova9124b832016-12-22 00:46:41 +000096 # This is an incremental build, unless otherwise has been requested.
97 # Remove obj and install dirs for a clean build.
98 # TODO: Some Windows slaves do not handle RemoveDirectory command well.
99 # So, consider running "rmdir /S /Q <dir>" if the build runs on Windows.
100 f.addStep(RemoveDirectory(name='clean-%s-dir' % obj_dir,
101 dir=obj_dir,
102 haltOnFailure=False,
103 flunkOnFailure=False,
104 doStepIf=cleanBuildRequested,
105 ))
106
107 if install_dir:
108 install_dir_rel = LLVMBuildFactory.pathRelativeToBuild(
109 install_dir,
110 obj_dir)
111 CmakeCommand.applyRequiredOptions(cmake_args, [
112 ('-DCMAKE_INSTALL_PREFIX=', install_dir_rel),
113 ])
114
115 f.addStep(RemoveDirectory(name='clean-%s-dir' % install_dir,
116 dir=install_dir,
117 haltOnFailure=False,
118 flunkOnFailure=False,
119 doStepIf=cleanBuildRequested,
120 ))
121
122 # Reconcile the cmake options for this build.
123
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000124 # Set proper defaults.
125 CmakeCommand.applyDefaultOptions(cmake_args, [
126 ('-DCMAKE_BUILD_TYPE=', 'Release'),
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000127 ('-DLLVM_ENABLE_ASSERTIONS=', 'ON'),
Galina Kistanova958820f2017-04-29 02:38:35 +0000128 ('-DLLVM_LIT_ARGS=', '"-v"'),
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000129 ])
130
131 # Create configuration files with cmake, unless this has been already done
132 # for an incremental build.
Galina Kistanova9124b832016-12-22 00:46:41 +0000133 if stage_name:
134 step_name = "cmake-configure-%s" % stage_name
135 else:
Galina Kistanova40b9ed52017-03-10 07:56:38 +0000136 stage_name = ""
Galina Kistanova9124b832016-12-22 00:46:41 +0000137 step_name = "cmake-configure"
138
139 src_dir = LLVMBuildFactory.pathRelativeToBuild(f.llvm_srcdir, obj_dir)
140
141 f.addStep(CmakeCommand(name=step_name,
142 description=["Cmake", "configure", stage_name],
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000143 options=cmake_args,
144 path=src_dir,
145 env=env,
146 workdir=obj_dir,
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000147 **kwargs # Pass through all the extra arguments.
148 ))
149
Galina Kistanova9124b832016-12-22 00:46:41 +0000150def addNinjaSteps(
151 f,
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000152 obj_dir = None,
Galina Kistanova106e6cd2018-02-23 20:23:24 +0000153 targets = None,
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000154 checks = None,
Galina Kistanova182583b2017-05-08 22:55:34 +0000155 install_dir = None,
Galina Kistanova9124b832016-12-22 00:46:41 +0000156 env = None,
157 stage_name = None,
158 **kwargs):
159
160 # Build the unified tree.
161 if stage_name:
162 step_name = "%s-" % stage_name
163 else:
Galina Kistanova40b9ed52017-03-10 07:56:38 +0000164 stage_name = ""
Galina Kistanova9124b832016-12-22 00:46:41 +0000165 step_name = ""
166
167 if obj_dir is None:
168 obj_dir = f.obj_dir
169
170 f.addStep(NinjaCommand(name="build-%sunified-tree" % step_name,
Galina Kistanova106e6cd2018-02-23 20:23:24 +0000171 targets=targets,
Galina Kistanova9124b832016-12-22 00:46:41 +0000172 description=["Build", stage_name, "unified", "tree"],
173 env=env,
174 workdir=obj_dir,
175 **kwargs # Pass through all the extra arguments.
176 ))
177
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000178 # Test just built components if requested.
179 if checks:
Galina Kistanova0545e242019-05-07 04:27:19 +0000180 f.addStep(NinjaCommand(name="test-%s%s" % (step_name,"-".join(checks)),
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000181 targets=checks,
182 description=["Test", "just", "built", "components"],
183 env=env,
184 workdir=obj_dir,
185 **kwargs # Pass through all the extra arguments.
186 ))
Galina Kistanova9124b832016-12-22 00:46:41 +0000187
188 # Install just built components
Galina Kistanova182583b2017-05-08 22:55:34 +0000189 if install_dir:
190 f.addStep(NinjaCommand(name="install-%sall" % step_name,
191 targets=["install"],
Galina Kistanova182583b2017-05-08 22:55:34 +0000192 description=["Install", "just", "built", "components"],
193 env=env,
194 workdir=obj_dir,
195 **kwargs # Pass through all the extra arguments.
196 ))
Galina Kistanova9124b832016-12-22 00:46:41 +0000197
198def getCmakeBuildFactory(
199 depends_on_projects = None,
200 llvm_srcdir = None,
201 obj_dir = None,
202 install_dir = None,
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000203 clean = False,
204 extra_configure_args = None,
205 env = None,
206 **kwargs):
207
Galina Kistanova9124b832016-12-22 00:46:41 +0000208 # Prepare environmental variables. Set here all env we want everywhere.
209 merged_env = {
210 'TERM' : 'dumb' # Be cautious and disable color output from all tools.
211 }
212 if env is not None:
213 # Overwrite pre-set items with the given ones, so user can set anything.
214 merged_env.update(env)
215
Galina Kistanova000e2532019-10-14 22:57:48 +0000216 f = getLLVMBuildFactoryAndSourcecodeSteps(
Galina Kistanova9124b832016-12-22 00:46:41 +0000217 depends_on_projects=depends_on_projects,
218 llvm_srcdir=llvm_srcdir,
219 obj_dir=obj_dir,
220 install_dir=install_dir,
Galina Kistanova9124b832016-12-22 00:46:41 +0000221 **kwargs) # Pass through all the extra arguments.
222
Galina Kistanova928ff1f2017-10-03 03:18:06 +0000223 cleanBuildRequested = lambda step: step.build.getProperty("clean", default=step.build.getProperty("clean_obj")) or clean
Galina Kistanova9124b832016-12-22 00:46:41 +0000224 addCmakeSteps(
225 f,
226 cleanBuildRequested=cleanBuildRequested,
227 obj_dir=f.obj_dir,
228 install_dir=f.install_dir,
229 extra_configure_args=extra_configure_args,
230 env=env,
231 **kwargs)
232
233 return f
234
Galina Kistanova8358cdd2017-03-10 01:06:35 +0000235
Galina Kistanova9124b832016-12-22 00:46:41 +0000236def getCmakeWithNinjaBuildFactory(
237 depends_on_projects = None,
238 llvm_srcdir = None,
239 obj_dir = None,
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000240 checks = None,
Galina Kistanova9124b832016-12-22 00:46:41 +0000241 install_dir = None,
242 clean = False,
243 extra_configure_args = None,
244 env = None,
245 **kwargs):
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000246
247 # Make a local copy of the configure args, as we are going to modify that.
248 if extra_configure_args:
249 cmake_args = extra_configure_args[:]
250 else:
251 cmake_args = list()
252
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000253 if checks is None:
254 checks = ['check-all']
255
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000256 # Some options are required for this build no matter what.
257 CmakeCommand.applyRequiredOptions(cmake_args, [
258 ('-G', 'Ninja'),
259 ])
260
261 f = getCmakeBuildFactory(
262 depends_on_projects=depends_on_projects,
263 llvm_srcdir=llvm_srcdir,
264 obj_dir=obj_dir,
Galina Kistanova9124b832016-12-22 00:46:41 +0000265 install_dir=install_dir,
266 clean=clean,
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000267 extra_configure_args=cmake_args,
268 env=env,
Galina Kistanova9124b832016-12-22 00:46:41 +0000269 **kwargs) # Pass through all the extra arguments.
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000270
Galina Kistanova9124b832016-12-22 00:46:41 +0000271 addNinjaSteps(
272 f,
Galina Kistanova920a6092019-10-13 21:39:00 +0000273 obj_dir=f.obj_dir,
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000274 checks=checks,
Galina Kistanova182583b2017-05-08 22:55:34 +0000275 install_dir=f.install_dir,
Galina Kistanova9124b832016-12-22 00:46:41 +0000276 env=env,
277 **kwargs)
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000278
279 return f
280
Galina Kistanova8358cdd2017-03-10 01:06:35 +0000281def getCmakeWithNinjaWithMSVCBuildFactory(
282 depends_on_projects = None,
283 llvm_srcdir = None,
284 obj_dir = None,
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000285 checks = None,
Galina Kistanova8358cdd2017-03-10 01:06:35 +0000286 install_dir = None,
287 clean = False,
288 extra_configure_args = None,
289 # VS tools environment variable if using MSVC. For example,
290 # %VS140COMNTOOLS% selects the 2015 toolchain.
291 vs=None,
292 target_arch=None,
293 env = None,
294 **kwargs):
295
296 assert not env, "Can't have custom builder env vars with MSVC build"
297
298 # Make a local copy of the configure args, as we are going to modify that.
299 if extra_configure_args:
300 cmake_args = extra_configure_args[:]
301 else:
302 cmake_args = list()
303
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000304 if checks is None:
305 checks = ['check-all']
306
Galina Kistanova8358cdd2017-03-10 01:06:35 +0000307 # Set up VS environment, if appropriate.
308 if not vs:
309 # We build by Visual Studio 2015, unless otherwise is requested.
310 vs=r"""%VS140COMNTOOLS%"""
311
Galina Kistanova5049f322019-10-14 22:12:28 +0000312 f = getLLVMBuildFactoryAndSourcecodeSteps(
Galina Kistanova8358cdd2017-03-10 01:06:35 +0000313 depends_on_projects=depends_on_projects,
314 llvm_srcdir=llvm_srcdir,
315 obj_dir=obj_dir,
316 install_dir=install_dir,
Galina Kistanova8358cdd2017-03-10 01:06:35 +0000317 **kwargs) # Pass through all the extra arguments.
318
319 f.addStep(SetProperty(
Stella Stamenovae9bbc272018-10-26 18:17:50 +0000320 command=builders_util.getVisualStudioEnvironment(vs, target_arch),
Galina Kistanova8358cdd2017-03-10 01:06:35 +0000321 extract_fn=builders_util.extractSlaveEnvironment))
322 env = Property('slave_env')
323
324 # Some options are required for this build no matter what.
325 CmakeCommand.applyRequiredOptions(cmake_args, [
326 ('-G', 'Ninja'),
327 ])
328
Galina Kistanova928ff1f2017-10-03 03:18:06 +0000329 cleanBuildRequested = lambda step: step.build.getProperty("clean", default=step.build.getProperty("clean_obj")) or clean
330
Galina Kistanova8358cdd2017-03-10 01:06:35 +0000331 addCmakeSteps(
332 f,
Galina Kistanova928ff1f2017-10-03 03:18:06 +0000333 cleanBuildRequested=cleanBuildRequested,
Galina Kistanova8358cdd2017-03-10 01:06:35 +0000334 obj_dir=f.obj_dir,
335 install_dir=f.install_dir,
336 extra_configure_args=cmake_args,
337 env=env,
338 **kwargs)
339
340 addNinjaSteps(
341 f,
342 obj_dir=obj_dir,
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000343 checks=checks,
Galina Kistanova182583b2017-05-08 22:55:34 +0000344 install_dir=f.install_dir,
Galina Kistanova8358cdd2017-03-10 01:06:35 +0000345 env=env,
346 **kwargs)
347
348 return f
349
Galina Kistanova9124b832016-12-22 00:46:41 +0000350def getCmakeWithNinjaMultistageBuildFactory(
351 depends_on_projects = None,
352 llvm_srcdir = None,
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000353 obj_dir = None,
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000354 checks = None,
Galina Kistanova9124b832016-12-22 00:46:41 +0000355 install_dir = None,
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000356 clean = False,
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000357 extra_configure_args = None,
358 env = None,
Galina Kistanova9124b832016-12-22 00:46:41 +0000359 stages=2,
360 stage_names=None,
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000361 **kwargs):
362
Galina Kistanova9124b832016-12-22 00:46:41 +0000363 # Prepare environmental variables. Set here all env we want everywhere.
364 merged_env = {
365 'TERM' : 'dumb' # Be cautious and disable color output from all tools.
366 }
367 if env is not None:
368 # Overwrite pre-set items with the given ones, so user can set anything.
369 merged_env.update(env)
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000370
371 # Make a local copy of the configure args, as we are going to modify that.
372 if extra_configure_args:
373 cmake_args = extra_configure_args[:]
374 else:
375 cmake_args = list()
376
Galina Kistanova9124b832016-12-22 00:46:41 +0000377 assert stages > 1, "It should be at least 2 stages in a multistage build."
378 if stage_names is None:
379 stage_names = list()
380 for i in range(1, stages + 1):
381 stage_names.append("stage%s" % i)
382 else:
383 assert len(stage_names) == stages, "Please specify names for none or all of the requested stages."
384
385 if obj_dir is None:
386 obj_dir = "build"
387 if install_dir is None:
388 install_dir = "install"
389
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000390 if checks is None:
391 checks = ['check-all']
392
Galina Kistanova9124b832016-12-22 00:46:41 +0000393 stage_objdirs = list()
394 stage_installdirs = list()
395 for s in stage_names:
396 stage_objdirs.append("%s/%s" % (obj_dir, s))
397 stage_installdirs.append("%s/%s" % (install_dir, s))
398
Galina Kistanova000e2532019-10-14 22:57:48 +0000399 f = getLLVMBuildFactoryAndPrepareForSourcecodeSteps(
Galina Kistanova9124b832016-12-22 00:46:41 +0000400 depends_on_projects=depends_on_projects,
401 llvm_srcdir=llvm_srcdir,
402 obj_dir=obj_dir,
403 install_dir=install_dir,
Galina Kistanova9124b832016-12-22 00:46:41 +0000404 env=env,
405 stage_objdirs=stage_objdirs,
406 stage_installdirs=stage_installdirs,
407 stage_names=stage_names,
408 **kwargs) # Pass through all the extra arguments.
409
Galina Kistanova000e2532019-10-14 22:57:48 +0000410 # Get the source code.
411 # We have consumed kwargs specific to this factory, so
412 # it is safe to pass all the remaining kwargs down.
413 f.addGetSourcecodeSteps(**kwargs)
414
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000415 # Set proper defaults.
416 CmakeCommand.applyDefaultOptions(cmake_args, [
Galina Kistanova9124b832016-12-22 00:46:41 +0000417 ('-DCMAKE_BUILD_TYPE=', 'Release'),
Galina Kistanova9124b832016-12-22 00:46:41 +0000418 ('-DLLVM_BUILD_TESTS=', 'ON'),
419 ('-DLLVM_ENABLE_ASSERTIONS=', 'OFF'),
420 ('-DLLVM_OPTIMIZED_TABLEGEN=', 'ON'),
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000421 ])
422
Galina Kistanova19bb1832018-02-12 18:03:32 +0000423 if 'clang' in depends_on_projects:
424 CmakeCommand.applyDefaultOptions(cmake_args, [
425 ('-DCLANG_BUILD_EXAMPLES=', 'OFF'),
426 ])
427
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000428 # Some options are required for this build no matter what.
429 CmakeCommand.applyRequiredOptions(cmake_args, [
Galina Kistanova9124b832016-12-22 00:46:41 +0000430 ('-G', 'Ninja'),
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000431 ])
432
Galina Kistanova9124b832016-12-22 00:46:41 +0000433 # The stage 1 is special, though. We use the system compiler and
Galina Kistanova9975c382017-01-03 04:10:02 +0000434 # do incremental build, unless a clean one has been requested.
Galina Kistanova9124b832016-12-22 00:46:41 +0000435 cmake_args_stage1 = cmake_args[:]
436 CmakeCommand.applyDefaultOptions(cmake_args_stage1, [
437 # Do not expect warning free build by the system toolchain.
438 ('-DLLVM_ENABLE_WERROR=', 'OFF'),
439 ])
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000440
Galina Kistanova928ff1f2017-10-03 03:18:06 +0000441 cleanBuildRequested = lambda step: step.build.getProperty("clean", default=step.build.getProperty("clean_obj")) or clean
442
Galina Kistanova9124b832016-12-22 00:46:41 +0000443 addCmakeSteps(
444 f,
Galina Kistanova928ff1f2017-10-03 03:18:06 +0000445 cleanBuildRequested=cleanBuildRequested,
Galina Kistanova9124b832016-12-22 00:46:41 +0000446 obj_dir=stage_objdirs[0],
447 install_dir=stage_installdirs[0],
448 extra_configure_args=cmake_args_stage1,
449 env=env,
450 stage_name=stage_names[0],
451 **kwargs)
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000452
Galina Kistanova9124b832016-12-22 00:46:41 +0000453 addNinjaSteps(
454 f,
455 obj_dir=stage_objdirs[0],
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000456 checks=checks,
Galina Kistanova182583b2017-05-08 22:55:34 +0000457 install_dir=stage_installdirs[0],
Galina Kistanova9124b832016-12-22 00:46:41 +0000458 env=env,
459 stage_name=stage_names[0],
460 **kwargs)
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000461
Galina Kistanova9124b832016-12-22 00:46:41 +0000462 # Build the rest stage by stage, using just built compiler to compile
463 # the next stage.
464 CmakeCommand.applyDefaultOptions(cmake_args, [
Galina Kistanova9975c382017-01-03 04:10:02 +0000465 # We should be warnings free when use just built compiler.
Galina Kistanova9124b832016-12-22 00:46:41 +0000466 ('-DLLVM_ENABLE_WERROR=', 'ON'),
467 ])
468 # If we build LLD, we would link with LLD.
469 # Otherwise we link with a system linker.
470 if 'lld' in f.depends_on_projects:
471 CmakeCommand.applyDefaultOptions(cmake_args, [
472 ('-DLLVM_ENABLE_LLD=', 'ON'),
473 ])
474
475 for stage_idx in range(1, stages):
476
Galina Kistanova9975c382017-01-03 04:10:02 +0000477 # Directories to use in this stage.
Galina Kistanova9124b832016-12-22 00:46:41 +0000478 obj_dir = f.stage_objdirs[stage_idx]
479 src_dir = LLVMBuildFactory.pathRelativeToBuild(f.llvm_srcdir, obj_dir)
480 install_dir = LLVMBuildFactory.pathRelativeToBuild(f.stage_installdirs[stage_idx], obj_dir)
481 staged_install = f.stage_installdirs[stage_idx - 1]
482
Galina Kistanova9975c382017-01-03 04:10:02 +0000483 # Configure the compiler to use in this stage.
Galina Kistanova9124b832016-12-22 00:46:41 +0000484 cmake_args_stageN = cmake_args[:]
485 CmakeCommand.applyRequiredOptions(cmake_args_stageN, [
486 ('-DCMAKE_INSTALL_PREFIX=', install_dir),
487 ])
488 cmake_args_stageN.append(
489 WithProperties(
490 "-DCMAKE_CXX_COMPILER=%(workdir)s/" + staged_install + "/bin/clang++"
491 ))
492 cmake_args_stageN.append(
493 WithProperties(
494 "-DCMAKE_C_COMPILER=%(workdir)s/" + staged_install + "/bin/clang"
495 ))
496
497 addCmakeSteps(
498 f,
499 True, # We always do a clean build for the staged builds.
500 obj_dir=stage_objdirs[stage_idx],
501 install_dir=stage_installdirs[stage_idx],
502 extra_configure_args=cmake_args_stageN,
503 env=env,
504 stage_name=stage_names[stage_idx],
505 **kwargs)
506
507 addNinjaSteps(
508 f,
509 obj_dir=stage_objdirs[stage_idx],
Galina Kistanova1eeb2f12017-06-17 01:18:12 +0000510 checks=checks,
Galina Kistanova182583b2017-05-08 22:55:34 +0000511 install_dir=stage_installdirs[stage_idx],
Galina Kistanova9124b832016-12-22 00:46:41 +0000512 env=env,
513 stage_name=stage_names[stage_idx],
514 **kwargs)
Galina Kistanova0035b5d2016-10-07 20:47:51 +0000515
516 return f