diff --git a/lib/spack/spack/report.py b/lib/spack/spack/report.py
index 01d4e2561163e9afe31f52d7d87f6894cc3c6832..049728a2a80f928e5074d73d35c5f5838e0c1585 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 time
 import traceback
 import xml.sax.saxutils
+from six import text_type
 
 import llnl.util.lang
 import spack.build_environment
@@ -294,7 +296,9 @@ def cdash_build_report(self, report_data):
             '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 @@ def cdash_build_report(self, report_data):
             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 0000000000000000000000000000000000000000..1d184349b3dbf789472be210aa5ab4a7495e2ac3
--- /dev/null
+++ b/templates/reports/cdash/Build.xml
@@ -0,0 +1,27 @@
+  <Build>
+    <StartBuildTime>{{ build.starttime }}</StartBuildTime>
+    <BuildCommand>{{ install_command }}</BuildCommand>
+{% for warning in build.warnings %}
+    <Warning>
+      <BuildLogLine>{{ warning.line_no }}</BuildLogLine>
+      <Text>{{ warning.text }}</Text>
+      <SourceFile>{{ warning.source_file }}</SourceFile>
+      <SourceLineNumber>{{ warning.source_line_no }}</SourceLineNumber>
+      <PreContext>{{ warning.pre_context }}</PreContext>
+      <PostContext>{{ warning.post_context }}</PostContext>
+    </Warning>
+{% endfor %}
+{% for error in build.errors %}
+    <Error>
+      <BuildLogLine>{{ error.line_no }}</BuildLogLine>
+      <Text>{{ error.text }}</Text>
+      <SourceFile>{{ error.source_file }}</SourceFile>
+      <SourceLineNumber>{{ error.source_line_no }}</SourceLineNumber>
+      <PreContext>{{ error.pre_context }}</PreContext>
+      <PostContext>{{ error.post_context }}</PostContext>
+    </Error>
+{% endfor %}
+    <EndBuildTime>{{ build.endtime }}</EndBuildTime>
+    <ElapsedMinutes>0</ElapsedMinutes>
+  </Build>
+</Site>