diff --git a/build.sh b/build.sh
index 1275f41fe11f1330c49d8e6f9a492b53bc75b196..a78f368e475aa9a52c1aa42ade842ff093fa29c4 100755
--- a/build.sh
+++ b/build.sh
@@ -357,7 +357,7 @@ then
     else
       upload_item installer "$package" binary/octet-stream
       upload_item quicklink "$package" binary/octet-stream
-      [ -f summary.json ] && upload_item installer summary.json text/plain
+      [ -f $build_dir/summary.json ] && upload_item installer $build_dir/summary.json text/plain
 
       case "$last_built_variant" in
       Release)
diff --git a/indra/cmake/BuildVersion.cmake b/indra/cmake/BuildVersion.cmake
index c49435574655ec9cde505439ad18084b8993d302..0094e313c7916d72c6d844ad62f852f842debaf0 100755
--- a/indra/cmake/BuildVersion.cmake
+++ b/indra/cmake/BuildVersion.cmake
@@ -22,12 +22,12 @@ if (NOT DEFINED VIEWER_SHORT_VERSION) # will be true in indra/, false in indra/n
                  OUTPUT_VARIABLE VIEWER_VERSION_REVISION
                  OUTPUT_STRIP_TRAILING_WHITESPACE
                  )
-              if (DEFINED VIEWER_VERSION_REVISION)
+              if ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")
                  message("Revision (from hg) ${VIEWER_VERSION_REVISION}")
-              else (DEFINED VIEWER_VERSION_REVISION)
+              else ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")
                  set(VIEWER_VERSION_REVISION 0 )
                  message("Revision not set, repository not found, using ${VIEWER_VERSION_REVISION}")
-              endif (DEFINED VIEWER_VERSION_REVISION)
+              endif ("${VIEWER_VERSION_REVISION}" MATCHES "^[0-9]+$")
            else (DEFINED MERCURIAL)
               set(VIEWER_VERSION_REVISION 0)
               message("Revision not set, 'hg' not found (${MERCURIAL}), using ${VIEWER_VERSION_REVISION}")
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 6e0bb161af7126cb18331cc1e8ef85a76bdd472f..227644f14f08322388c7eed0a92e8dbc45426f4e 100755
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1247,8 +1247,12 @@ set(viewer_HEADER_FILES
 
 source_group("CMake Rules" FILES ViewerInstall.cmake)
 
+# the viewer_version.txt file created here is for passing to viewer_manifest
+# the summary.json file is created for the benefit of the TeamCity builds, where
+#   it is used to provide descriptive information to the build results page
 add_custom_target(generate_viewer_version ALL
-                  COMMAND echo "${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}" > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
+                  COMMAND printf '${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}' > ${CMAKE_CURRENT_BINARY_DIR}/viewer_version.txt
+                  COMMAND printf '{"Type":"viewer","Version":"${VIEWER_SHORT_VERSION}.${VIEWER_VERSION_REVISION}"}' > ${CMAKE_BINARY_DIR}/summary.json
                   COMMENT Generating viewer_version.txt for manifest processing
                   )
 
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index bc473f6d6234f636465370f6b19bbc6ee6ddc15d..2578c81224ad648f3b7b247a78f0f9a25f75df72 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -154,10 +154,8 @@ class ViewerManifest(LLManifest):
 
             # Files in the newview/ directory
             self.path("gpu_table.txt")
-
-            # The summary.json file gets left in the base checkout dir by
-            # build.sh. It's only created for a build.sh build.
-            if not self.path2basename(os.path.join(os.pardir, os.pardir), "summary.json"):
+            # The summary.json file gets left in the build directory by newview/CMakeLists.txt.
+            if not self.path2basename(os.pardir, "summary.json"):
                 print "No summary.json file"
 
     def grid(self):