From 847c1216d0bf2534d5871ca4e47eb40df211d90f Mon Sep 17 00:00:00 2001 From: Zack Galbreath Date: Thu, 19 Apr 2018 15:21:23 -0400 Subject: Generate CDash reports for build/install step --- lib/spack/spack/report.py | 35 +++++++++++++++++++++++++++++++++-- templates/reports/cdash/Build.xml | 27 +++++++++++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 templates/reports/cdash/Build.xml diff --git a/lib/spack/spack/report.py b/lib/spack/spack/report.py index 01d4e25611..049728a2a8 100644 --- a/lib/spack/spack/report.py +++ b/lib/spack/spack/report.py @@ -23,6 +23,7 @@ # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ############################################################################## """Tools to produce reports of spec installations""" +import codecs import collections import functools import itertools @@ -33,6 +34,7 @@ import socket import time import traceback import xml.sax.saxutils +from six import text_type import llnl.util.lang import spack.build_environment @@ -294,7 +296,9 @@ class collect_info(object): 'autoreconf': 'configure', 'cmake': 'configure', 'configure': 'configure', - 'edit': 'configure' + 'edit': 'configure', + 'build': 'build', + 'install': 'build' } # Initialize data structures common to each phase's report. @@ -344,11 +348,38 @@ class collect_info(object): if phase == 'configure' and nerrors > 0: report_data[phase]['status'] = 1 + if phase == 'build': + # Convert log output from ASCII to Unicode and escape for XML. + def clean_log_event(event): + event = vars(event) + event['text'] = xml.sax.saxutils.escape(event['text']) + event['pre_context'] = xml.sax.saxutils.escape( + '\n'.join(event['pre_context'])) + event['post_context'] = xml.sax.saxutils.escape( + '\n'.join(event['post_context'])) + # source_file and source_line_no are either strings or + # the tuple (None,). Distinguish between these two cases. + if event['source_file'][0] is None: + event['source_file'] = '' + event['source_line_no'] = '' + else: + event['source_file'] = xml.sax.saxutils.escape( + event['source_file']) + return event + + report_data[phase]['errors'] = [] + report_data[phase]['warnings'] = [] + for error in errors: + report_data[phase]['errors'].append(clean_log_event(error)) + for warning in warnings: + report_data[phase]['warnings'].append( + clean_log_event(warning)) + # Write the report. report_name = phase.capitalize() + ".xml" phase_report = os.path.join(self.filename, report_name) - with open(phase_report, 'w') as f: + with codecs.open(phase_report, 'w', 'utf-8') as f: env = spack.tengine.make_environment() site_template = os.path.join(templates[self.format_name], 'Site.xml') diff --git a/templates/reports/cdash/Build.xml b/templates/reports/cdash/Build.xml new file mode 100644 index 0000000000..1d184349b3 --- /dev/null +++ b/templates/reports/cdash/Build.xml @@ -0,0 +1,27 @@ + + {{ build.starttime }} + {{ install_command }} +{% for warning in build.warnings %} + + {{ warning.line_no }} + {{ warning.text }} + {{ warning.source_file }} + {{ warning.source_line_no }} + {{ warning.pre_context }} + {{ warning.post_context }} + +{% endfor %} +{% for error in build.errors %} + + {{ error.line_no }} + {{ error.text }} + {{ error.source_file }} + {{ error.source_line_no }} + {{ error.pre_context }} + {{ error.post_context }} + +{% endfor %} + {{ build.endtime }} + 0 + + -- cgit v1.2.3-60-g2f50