diff --git a/zorg/buildbot/builders/ClangBuilder.py b/zorg/buildbot/builders/ClangBuilder.py index 55e6b599..418183f7 100644 --- a/zorg/buildbot/builders/ClangBuilder.py +++ b/zorg/buildbot/builders/ClangBuilder.py @@ -154,7 +154,7 @@ def getClangCMakeBuildFactory( testsuite_flags=None, submitURL=None, testerName=None, - + testWithLNT=True, # Environmental variables for all steps. env=None, extra_cmake_args=None, @@ -176,7 +176,7 @@ def getClangCMakeBuildFactory( vs_target_arch=vs_target_arch, useTwoStage=useTwoStage, testStage1=testStage1, stage1_config=stage1_config, stage2_config=stage2_config, runTestSuite=runTestSuite, - nt_flags=nt_flags, testsuite_flags=testsuite_flags, + nt_flags=nt_flags, testsuite_flags=testsuite_flags, testWithLNT=testWithLNT, submitURL=submitURL, testerName=testerName, env=env, extra_cmake_args=extra_cmake_args, extra_stage2_cmake_args=extra_stage2_cmake_args, @@ -209,6 +209,7 @@ def _getClangCMakeBuildFactory( runTestSuite=False, nt_flags=None, testsuite_flags=None, + testWithLNT=True, submitURL=None, testerName=None, @@ -284,10 +285,12 @@ def _getClangCMakeBuildFactory( # and the test-suite separately. Le's do this first, # so we wouldn't poison got_revision property. if runTestSuite or checkout_test_suite: - f.addGetSourcecodeForProject( - project='lnt', - src_dir='test/lnt', - alwaysUseLatest=True) + if testWithLNT: + f.addGetSourcecodeForProject( + project='lnt', + src_dir='test/lnt', + alwaysUseLatest=True) + f.addGetSourcecodeForProject( project='test-suite', src_dir='test/test-suite', @@ -409,7 +412,6 @@ def _getClangCMakeBuildFactory( cxx = 'clang-cl.exe' fc = 'flang-new.exe' - ############# STAGE 2 if useTwoStage: # We always cleanly build the stage 2. If the compiler has been @@ -479,6 +481,10 @@ def _getClangCMakeBuildFactory( ############# TEST SUITE ## Test-Suite (stage 2 if built, stage 1 otherwise) if runTestSuite: + # Paths + sandbox = util.Interpolate('%(prop:builddir)s/test/sandbox') + test_suite_dir = util.Interpolate('%(prop:builddir)s/test/test-suite') + compiler_path = stage1_install if useTwoStage: compiler_path=stage2_install @@ -494,103 +500,155 @@ def _getClangCMakeBuildFactory( workdir=stage2_build, env=env)) - # Get generated python, lnt - python = util.Interpolate('%(prop:builddir)s/test/sandbox/bin/python') - lnt = util.Interpolate('%(prop:builddir)s/test/sandbox/bin/lnt') - lnt_setup = util.Interpolate('%(prop:builddir)s/test/lnt/setup.py') + if testWithLNT: + # Get generated python, lnt + python = util.Interpolate('%(prop:builddir)s/test/sandbox/bin/python') + lnt = util.Interpolate('%(prop:builddir)s/test/sandbox/bin/lnt') + lnt_setup = util.Interpolate('%(prop:builddir)s/test/lnt/setup.py') + + # Get latest built Clang (stage1 or stage2) + cc = util.Interpolate(f'%(prop:builddir)s/{compiler_path}/bin/{cc}') + cxx = util.Interpolate(f'%(prop:builddir)s/{compiler_path}/bin/{cxx}') + + # LNT Command line (don't pass -jN. Users need to pass both --threads + # and --build-threads in nt_flags/test_suite_flags to get the same effect) + use_runtest_testsuite = len(nt_flags) == 0 + if not use_runtest_testsuite: + test_suite_cmd = [python, lnt, 'runtest', 'nt', + '--no-timestamp', + '--sandbox', sandbox, + '--test-suite', test_suite_dir, + '--cc', cc, + '--cxx', cxx] + # Append any option provided by the user + test_suite_cmd.extend(nt_flags) + else: + lit = util.Interpolate(f'%(prop:builddir)s/{stage1_build}/bin/llvm-lit') + test_suite_cmd = [python, lnt, 'runtest', 'test-suite', + '--no-timestamp', + '--sandbox', sandbox, + '--test-suite', test_suite_dir, + '--cc', cc, + '--cxx', cxx, + '--use-lit', lit] + # Enable fortran if flang is checked out + if checkout_flang: + fortran_flags = [ + '--cmake-define=TEST_SUITE_FORTRAN:STRING=ON', + util.Interpolate( + '--cmake-define=CMAKE_Fortran_COMPILER=' + + f'%(prop:builddir)s/{compiler_path}/bin/{fc}')] + test_suite_cmd.extend(fortran_flags) + # Append any option provided by the user + test_suite_cmd.extend(testsuite_flags) + + # Only submit if a URL has been specified + if submitURL is not None: + if not isinstance(submitURL, list): + submitURL = [submitURL] + for url in submitURL: + test_suite_cmd.extend(['--submit', url]) + # lnt runtest test-suite doesn't understand --no-machdep-info: + if testerName and not use_runtest_testsuite: + test_suite_cmd.extend(['--no-machdep-info', testerName]) + + # CC and CXX are needed as env for build-tools + if vs and vs != "manual": + # VS environment requires some extra care. + f.addStep(SetProperty( + command=builders_util.getVisualStudioEnvironment(vs, vs_target_arch), + extract_fn=builders_util.extractVSEnvironment, + env={'CC' : cc, 'CXX' : cxx})) + test_suite_env = Property('vs_env') + else: + test_suite_env = copy.deepcopy(env) + test_suite_env['CC'] = cc + test_suite_env['CXX'] = cxx + + # Steps to prepare, build and run LNT + f.addStep(ShellCommand(name='clean sandbox', + command=['rm', '-rf', 'sandbox'], + haltOnFailure=True, + description='removing sandbox directory', + workdir='test', + env=env)) + f.addStep(ShellCommand(name='recreate sandbox', + command=['virtualenv', '--python=python3', 'sandbox'], + haltOnFailure=True, + description='recreating sandbox', + workdir='test', + env=env)) + f.addStep(ShellCommand(name='setup lit', + command=[python, lnt_setup, 'develop'], + haltOnFailure=True, + description='setting up LNT in sandbox', + workdir='test/sandbox', + env=env)) + f.addStep(LitTestCommand( + name='test-suite', + command=test_suite_cmd, + haltOnFailure=True, + description=['running the test suite'], + workdir='test/sandbox', + logfiles={'configure.log' : 'build/configure.log', + 'build-tools.log' : 'build/build-tools.log', + 'test.log' : 'build/test.log', + 'report.json' : 'build/report.json'}, + env=test_suite_env)) + else: + tsbuild = 'testsuite.build' - # Paths - sandbox = util.Interpolate('%(prop:builddir)s/test/sandbox') - test_suite_dir = util.Interpolate('%(prop:builddir)s/test/test-suite') + f.addStep(ShellCommand(name='clean testsuite', + command=['rm','-rf',tsbuild], + warnOnFailure=True, + description='cleaning testsuite', + descriptionDone='clean', + workdir='.')) + + # Absolute paths to just built compilers. + testsuite_cc = InterpolateToPosixPath( + f"-DCMAKE_C_COMPILER=%(prop:builddir)s/{compiler_path}/bin/{cc}") + + testsuite_cxx = InterpolateToPosixPath( + f"-DCMAKE_CXX_COMPILER=%(prop:builddir)s/{compiler_path}/bin/{cxx}") + + lit = 'llvm-lit' if not vs else 'llvm-lit.py' + testsuite_lit = InterpolateToPosixPath( + f"-DTEST_SUITE_LIT=%(prop:builddir)s/{stage1_build}/bin/{lit}") + + cmake_testsuite = [cmake, "-G", "Ninja", test_suite_dir, + testsuite_cc, testsuite_cxx, testsuite_lit, + "-DCMAKE_BUILD_TYPE=Release" + ] + testsuite_flags - # Get latest built Clang (stage1 or stage2) - cc = util.Interpolate(f'%(prop:builddir)s/{compiler_path}/bin/{cc}') - cxx = util.Interpolate(f'%(prop:builddir)s/{compiler_path}/bin/{cxx}') - - # LNT Command line (don't pass -jN. Users need to pass both --threads - # and --build-threads in nt_flags/test_suite_flags to get the same effect) - use_runtest_testsuite = len(nt_flags) == 0 - if not use_runtest_testsuite: - test_suite_cmd = [python, lnt, 'runtest', 'nt', - '--no-timestamp', - '--sandbox', sandbox, - '--test-suite', test_suite_dir, - '--cc', cc, - '--cxx', cxx] - # Append any option provided by the user - test_suite_cmd.extend(nt_flags) - else: - lit = util.Interpolate(f'%(prop:builddir)s/{stage1_build}/bin/llvm-lit') - test_suite_cmd = [python, lnt, 'runtest', 'test-suite', - '--no-timestamp', - '--sandbox', sandbox, - '--test-suite', test_suite_dir, - '--cc', cc, - '--cxx', cxx, - '--use-lit', lit] - # Enable fortran if flang is checked out if checkout_flang: - fortran_flags = [ - '--cmake-define=TEST_SUITE_FORTRAN:STRING=ON', - util.Interpolate( - '--cmake-define=CMAKE_Fortran_COMPILER=' + - f'%(prop:builddir)s/{compiler_path}/bin/{fc}')] - test_suite_cmd.extend(fortran_flags) - # Append any option provided by the user - test_suite_cmd.extend(testsuite_flags) - - # Only submit if a URL has been specified - if submitURL is not None: - if not isinstance(submitURL, list): - submitURL = [submitURL] - for url in submitURL: - test_suite_cmd.extend(['--submit', url]) - # lnt runtest test-suite doesn't understand --no-machdep-info: - if testerName and not use_runtest_testsuite: - test_suite_cmd.extend(['--no-machdep-info', testerName]) - - # CC and CXX are needed as env for build-tools - if vs and vs != "manual": - # VS environment requires some extra care. - f.addStep(SetProperty( - command=builders_util.getVisualStudioEnvironment(vs, vs_target_arch), - extract_fn=builders_util.extractVSEnvironment, - env={'CC' : cc, 'CXX' : cxx})) - test_suite_env = Property('vs_env') - else: - test_suite_env = copy.deepcopy(env) - test_suite_env['CC'] = cc - test_suite_env['CXX'] = cxx + testsuite_fc = InterpolateToPosixPath( + f"-DCMAKE_Fortran_COMPILER=%(prop:builddir)s/{compiler_path}/bin/{fc}") + cmake_testsuite += [testsuite_fc, + "-DTEST_SUITE_FORTRAN:STRING=ON"] + + f.addStep(ShellCommand(name='cmake testsuite', + command=cmake_testsuite, + haltOnFailure=True, + description='cmake testsuite', + workdir=tsbuild, + env=env)) - # Steps to prepare, build and run LNT - f.addStep(ShellCommand(name='clean sandbox', - command=['rm', '-rf', 'sandbox'], - haltOnFailure=True, - description='removing sandbox directory', - workdir='test', - env=env)) - f.addStep(ShellCommand(name='recreate sandbox', - command=['virtualenv', '--python=python3', 'sandbox'], - haltOnFailure=True, - description='recreating sandbox', - workdir='test', - env=env)) - f.addStep(ShellCommand(name='setup lit', - command=[python, lnt_setup, 'develop'], - haltOnFailure=True, - description='setting up LNT in sandbox', - workdir='test/sandbox', - env=env)) - f.addStep(LitTestCommand( - name='test-suite', - command=test_suite_cmd, - haltOnFailure=True, - description=['running the test suite'], - workdir='test/sandbox', - logfiles={'configure.log' : 'build/configure.log', - 'build-tools.log' : 'build/build-tools.log', - 'test.log' : 'build/test.log', - 'report.json' : 'build/report.json'}, - env=test_suite_env)) + # Add -k option to ninja command for keep building even if a test fails. + ninja_cmd += ["-k0"] + f.addStep(WarningCountingShellCommand(name='build testsuite', + command=ninja_cmd, + haltOnFailure=False, + description='ninja all', + workdir=tsbuild, + env=env)) + + f.addStep(LitTestCommand(name='ninja check testsuite', + command=['ninja','check'], + haltOnFailure=not runTestSuite, + description=["checking testsuite"], + descriptionDone=["testsuite checked"], + workdir=tsbuild, + env=env)) return f