Index: zorg/buildbot/builders/ClangBuilder.py =================================================================== --- zorg/buildbot/builders/ClangBuilder.py +++ zorg/buildbot/builders/ClangBuilder.py @@ -41,7 +41,12 @@ run_gdb=False, run_modern_gdb=False, run_gcc=False, - merge_functions=False): + merge_functions=False, + cmake=None, + modules=False): + assert not modules or (cmake and useTwoStage), \ + "modules build requires 2 stage cmake build for now" + # Prepare environmental variables. Set here all env we want everywhere. merged_env = { 'TERM' : 'dumb' # Make sure Clang doesn't use color escape sequences. @@ -168,28 +173,50 @@ workdir=".", env=merged_env)) - # Force without llvm-gcc so we don't run afoul of Frontend test failures. - base_configure_args = [WithProperties("%%(builddir)s/%s/configure" % llvm_srcdir), - '--disable-bindings'] - base_configure_args += extra_configure_args - if triple: - base_configure_args += ['--build=%s' % triple, - '--host=%s' % triple] - args = base_configure_args + [WithProperties("--prefix=%%(builddir)s/%s" % llvm_1_installdir)] - args += builders_util.getConfigArgs(stage1_config) if not clean: + if cmake: + expected_makefile = 'Makefile' + else: + expected_makefile = 'Makefile.config' f.addStep(SetProperty(name="Makefile_isready", workdir=llvm_1_objdir, command=["sh", "-c", - "test -e Makefile.config && echo OK || echo Missing"], + "test -e %s && echo OK || echo Missing" % expected_makefile], flunkOnFailure=False, property="exists_Makefile")) - f.addStep(Configure(command=args, - workdir=llvm_1_objdir, - description=['configuring',stage1_config], - descriptionDone=['configure',stage1_config], - env=merged_env, - doStepIf=lambda step: step.build.getProperty("exists_Makefile") != "OK")) + + if not cmake: + # Force without llvm-gcc so we don't run afoul of Frontend test failures. + base_configure_args = [WithProperties("%%(builddir)s/%s/configure" % llvm_srcdir), + '--disable-bindings'] + base_configure_args += extra_configure_args + if triple: + base_configure_args += ['--build=%s' % triple, + '--host=%s' % triple] + args = base_configure_args + [WithProperties("--prefix=%%(builddir)s/%s" % llvm_1_installdir)] + args += builders_util.getConfigArgs(stage1_config) + + f.addStep(Configure(command=args, + workdir=llvm_1_objdir, + description=['configuring',stage1_config], + descriptionDone=['configure',stage1_config], + env=merged_env, + doStepIf=lambda step: step.build.getProperty("exists_Makefile") != "OK")) + else: + cmake_triple_arg = [] + if triple: + cmake_triple_arg = ['-DLLVM_HOST_TRIPLE=%s' % triple] + f.addStep(ShellCommand(name='cmake', + command=[cmake, + '-DLLVM_BUILD_TESTS=ON', + '-DCMAKE_BUILD_TYPE=%s' % stage1_config] + + cmake_triple_arg + + extra_configure_args + + ["../" + llvm_srcdir], + description='cmake stage1', + workdir=llvm_1_objdir, + env=merged_env, + doStepIf=lambda step: step.build.getProperty("exists_Makefile") != "OK")) # Make clean if using in-dir builds. if clean and llvm_srcdir == llvm_1_objdir: @@ -248,7 +275,7 @@ env=merged_env)) # Install llvm and clang. - if llvm_1_installdir: + if llvm_1_installdir and not cmake: # FIXME: install for cmake build f.addStep(ShellCommand(name="rm-install.clang.stage1", command=["rm", "-rf", llvm_1_installdir], haltOnFailure=True, @@ -301,7 +328,10 @@ return f # Clean up llvm (stage 2). - if clean: + # + # It does not make sense to skip this for a bootstrap builder, + # and we don't support doing so for cmake builds. + if clean or cmake: f.addStep(ShellCommand(name="rm-llvm.obj.stage2", command=["rm", "-rf", llvm_2_objdir], haltOnFailure=True, @@ -310,20 +340,46 @@ env=merged_env)) # Configure llvm (stage 2). - args = base_configure_args + [WithProperties("--prefix=%(builddir)s/" + llvm_2_installdir)] - args += builders_util.getConfigArgs(stage2_config) - local_env = dict(merged_env) - local_env.update({ - 'CC' : WithProperties("%%(builddir)s/%s/bin/clang" % llvm_1_installdir), - 'CXX' : WithProperties("%%(builddir)s/%s/bin/clang++" % llvm_1_installdir)}) - - f.addStep(Configure(name="configure.llvm.stage2", - command=args, - haltOnFailure=True, - workdir=llvm_2_objdir, - description=["configure", "llvm", "(stage 2)", - stage2_config], - env=local_env)) + if not cmake: + args = base_configure_args + [WithProperties("--prefix=%(builddir)s/" + llvm_2_installdir)] + args += builders_util.getConfigArgs(stage2_config) + local_env = dict(merged_env) + local_env.update({ + 'CC' : WithProperties("%%(builddir)s/%s/bin/clang" % llvm_1_installdir), + 'CXX' : WithProperties("%%(builddir)s/%s/bin/clang++" % llvm_1_installdir)}) + + f.addStep(Configure(name="configure.llvm.stage2", + command=args, + haltOnFailure=True, + workdir=llvm_2_objdir, + description=["configure", "llvm", "(stage 2)", + stage2_config], + env=local_env)) + else: + c_flags = '' + cxx_flags = '' + if modules: + c_flags += '-fmodules -fmodule-map-file=/usr/include/module.modulemap -fmodules-cache-path=%%(builddir)s/%s/module-cache' % llvm_2_objdir + # Ignore *_EXPORTS macros; they generate additional pointless module variants. + ignored_exports_macros = [ + 'BugpointPasses', 'LLVMHello', 'bugpoint', 'llvm_stress', + 'opt', 'llc', 'JITTests', 'lli', 'LTO'] + c_flags += ''.join(' -fmodules-ignore-macro=%s_EXPORTS' % ignored_exports_macro + for ignored_exports_macro in ignored_exports_macros) + cxx_flags += '-fcxx-modules -stdlib=libc++' + + f.addStep(ShellCommand(name='cmake', + command=[cmake, + '-DLLVM_BUILD_TESTS=ON', + WithProperties('-DCMAKE_C_COMPILER=%%(builddir)s/%s/bin/clang' % llvm_1_objdir), # FIXME use installdir + WithProperties('-DCMAKE_CXX_COMPILER=%%(builddir)s/%s/bin/clang++' % llvm_1_objdir), + '-DCMAKE_BUILD_TYPE=%s' % stage2_config, + WithProperties('-DCMAKE_C_FLAGS=%s' % c_flags), + WithProperties('-DCMAKE_CXX_FLAGS=%s %s' % (c_flags, cxx_flags)), + "../" + llvm_srcdir], + description='cmake stage2', + workdir=llvm_2_objdir, + env=merged_env)) # Build llvm (stage 2). f.addStep(WarningCountingShellCommand(name="compile.llvm.stage2", @@ -348,21 +404,22 @@ usePTY=use_pty_in_tests, env=merged_env)) - # Install clang (stage 2). - f.addStep(ShellCommand(name="rm-install.clang.stage2", - command=["rm", "-rf", llvm_2_installdir], - haltOnFailure=True, - description=["rm install dir", "clang"], - workdir=".", - env=merged_env)) - f.addStep(WarningCountingShellCommand(name="install.clang.stage2", - command = ['nice', '-n', '10', - make, 'install-clang'], - haltOnFailure=True, - description=["install", "clang", - "(stage 2)"], - workdir=llvm_2_objdir, - env=merged_env)) + if llvm_2_installdir and not cmake: # FIXME: install for cmake build + # Install clang (stage 2). + f.addStep(ShellCommand(name="rm-install.clang.stage2", + command=["rm", "-rf", llvm_2_installdir], + haltOnFailure=True, + description=["rm install dir", "clang"], + workdir=".", + env=merged_env)) + f.addStep(WarningCountingShellCommand(name="install.clang.stage2", + command = ['nice', '-n', '10', + make, 'install-clang'], + haltOnFailure=True, + description=["install", "clang", + "(stage 2)"], + workdir=llvm_2_objdir, + env=merged_env)) if package_dst: name = WithProperties(