summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xindra/llcrashlogger/llcrashlogger.cpp2
-rw-r--r--indra/newview/CMakeLists.txt40
-rw-r--r--indra/newview/generate_breakpad_symbols.py50
-rwxr-xr-xindra/newview/viewer_manifest.py18
4 files changed, 85 insertions, 25 deletions
diff --git a/indra/llcrashlogger/llcrashlogger.cpp b/indra/llcrashlogger/llcrashlogger.cpp
index 078795f962..51e5f14bfe 100755
--- a/indra/llcrashlogger/llcrashlogger.cpp
+++ b/indra/llcrashlogger/llcrashlogger.cpp
@@ -255,7 +255,7 @@ void LLCrashLogger::gatherFiles()
trimSLLog(crash_info);
}
- mCrashInfo[(*itr).first] = rawstr_to_utf8(crash_info);
+ mCrashInfo[(*itr).first] = LLStringFn::strip_invalid_xml(rawstr_to_utf8(crash_info));
}
// Add minidump as binary.
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index b145fbee1f..228d56001a 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -1695,6 +1695,29 @@ if (LINUX)
add_dependencies(package linux-updater-target)
check_message_template(package)
endif (NOT INSTALL)
+
+ add_custom_command(
+ OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched
+ COMMAND ${PYTHON_EXECUTABLE}
+ ARGS
+ ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ --arch=${ARCH}
+ --actions=copy
+ --artwork=${ARTWORK_DIR}
+ --build=${CMAKE_CURRENT_BINARY_DIR}
+ --buildtype=${CMAKE_BUILD_TYPE}
+ --configuration=${CMAKE_CFG_INTDIR}
+ --dest=${CMAKE_CURRENT_BINARY_DIR}/packaged
+ --grid=${GRID}
+ --source=${CMAKE_CURRENT_SOURCE_DIR}
+ DEPENDS
+ ${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
+ ${COPY_INPUT_DEPENDENCIES}
+ COMMENT "Performing viewer_manifest copy"
+ )
+
+ add_custom_target(copy_l_viewer_manifest ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/.${product}.copy_touched)
+ add_dependencies(copy_l_viewer_manifest "${VIEWER_BINARY_NAME}" linux-crash-logger-target linux-updater-target)
endif (LINUX)
if (DARWIN)
@@ -1785,21 +1808,23 @@ endif (INSTALL)
if (PACKAGE)
if (WINDOWS)
set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}")
- set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-windows.breakpad.bz2")
- set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME} SLPlugin.exe")
+ set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-windows.tar.bz2")
+ set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME}${CMAKE_EXECUTABLE_SUFFIX} slplugin.exe")
set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}")
+ set(VIEWER_COPY_MANIFEST copy_w_viewer_manifest)
endif (WINDOWS)
if (DARWIN)
set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/${product}.app")
- set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-darwin.breakpad.bz2")
- set(VIEWER_EXE_GLOBS "${VIEWER_BINARY_NAME} SLPlugin")
- set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}")
+ set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-darwin.tar.bz2")
+ set(VIEWER_EXE_GLOBS "'Second Life' SLPlugin")
+ set(VIEWER_LIB_GLOB "*.dylib")
endif (DARWIN)
if (LINUX)
set(VIEWER_DIST_DIR "${CMAKE_CURRENT_BINARY_DIR}/packaged")
- set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-linux.breakpad.bz2")
+ set(VIEWER_SYMBOL_FILE "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}/secondlife-symbols-linux.tar.bz2")
set(VIEWER_EXE_GLOBS "do-not-directly-run-secondlife-bin SLPlugin")
set(VIEWER_LIB_GLOB "*${CMAKE_SHARED_MODULE_SUFFIX}*")
+ set(VIEWER_COPY_MANIFEST copy_l_viewer_manifest)
endif (LINUX)
add_custom_command(OUTPUT "${VIEWER_SYMBOL_FILE}"
@@ -1812,9 +1837,10 @@ if (PACKAGE)
"${LIBS_PREBUILT_DIR}/${LL_ARCH_DIR}/bin/dump_syms"
"${VIEWER_SYMBOL_FILE}"
DEPENDS generate_breakpad_symbols.py
+ VERBATIM
)
add_custom_target(generate_breakpad_symbols ALL DEPENDS "${VIEWER_SYMBOL_FILE}")
- add_dependencies(generate_breakpad_symbols viewer)
+ add_dependencies(generate_breakpad_symbols "${VIEWER_BINARY_NAME}" "${VIEWER_COPY_MANIFEST}")
add_dependencies(package generate_breakpad_symbols)
endif (PACKAGE)
diff --git a/indra/newview/generate_breakpad_symbols.py b/indra/newview/generate_breakpad_symbols.py
index f281846918..21db9ce152 100644
--- a/indra/newview/generate_breakpad_symbols.py
+++ b/indra/newview/generate_breakpad_symbols.py
@@ -37,17 +37,35 @@ import fnmatch
import itertools
import os
import sys
+import shlex
import subprocess
-import bz2
+import tarfile
+import StringIO
def usage():
print >>sys.stderr, "usage: %s viewer_dir viewer_exes libs_suffix dump_syms_tool viewer_symbol_file" % sys.argv[0]
+class MissingModuleError(Exception):
+ def __init__(self, modules):
+ Exception.__init__(self, "Failed to find required modules: %r" % modules)
+ self.modules = modules
+
def main(viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file):
# print "generate_breakpad_symbols: %s" % str((viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_file))
+ # split up list of viewer_exes
+ # "'Second Life' SLPlugin" becomes ['Second Life', 'SLPlugin']
+ viewer_exes = shlex.split(viewer_exes)
+
+ found_required = dict()
+ for required in viewer_exes:
+ found_required[required] = False
+
def matches(f):
- return f in viewer_exes or fnmatch.fnmatch(f, libs_suffix)
+ if f in viewer_exes:
+ found_required[f] = True
+ return True
+ return fnmatch.fnmatch(f, libs_suffix)
def list_files():
for (dirname, subdirs, filenames) in os.walk(viewer_dir):
@@ -59,12 +77,32 @@ def main(viewer_dir, viewer_exes, libs_suffix, dump_syms_tool, viewer_symbol_fil
print "dumping module '%s' with '%s'..." % (m, dump_syms_tool)
child = subprocess.Popen([dump_syms_tool, m] , stdout=subprocess.PIPE)
out, err = child.communicate()
- return out
+ return (m,child.returncode, out, err)
+
+ out = tarfile.open(viewer_symbol_file, 'w:bz2')
- out = bz2.BZ2File(viewer_symbol_file, 'w')
+ for (filename,status,symbols,err) in itertools.imap(dump_module, list_files()):
+ if status == 0:
+ module_line = symbols[:symbols.index('\n')]
+ module_line = module_line.split()
+ hash_id = module_line[3]
+ module = ' '.join(module_line[4:])
+ if sys.platform in ['win32', 'cygwin']:
+ mod_name = module[:module.rindex('.pdb')]
+ else:
+ mod_name = module
+ symbolfile = StringIO.StringIO(symbols)
+ info = tarfile.TarInfo("%(module)s/%(hash_id)s/%(mod_name)s.sym" % dict(module=module, hash_id=hash_id, mod_name=mod_name))
+ info.size = symbolfile.len
+ out.addfile(info, symbolfile)
+ else:
+ print >>sys.stderr, "warning: failed to dump symbols for '%s': %s" % (filename, err)
- for symbols in map(dump_module, list_files()):
- out.writelines(symbols)
+ missing_modules = [m for (m,_) in
+ itertools.ifilter(lambda (k,v): not v, found_required.iteritems())
+ ]
+ if missing_modules:
+ raise MissingModuleError(missing_modules)
out.close()
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index dac1409aee..7639fcbe9b 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -41,9 +41,12 @@ from llmanifest import LLManifest, main, proper_windows_path, path_ancestors
class ViewerManifest(LLManifest):
def is_packaging_viewer(self):
- # This is overridden by the WindowsManifest sub-class,
- # which has different behavior if it is not packaging the viewer.
- return True
+ # Some commands, files will only be included
+ # if we are packaging the viewer on windows.
+ # This manifest is also used to copy
+ # files during the build (see copy_w_viewer_manifest
+ # and copy_l_viewer_manifest targets)
+ return 'package' in self.args['actions']
def construct(self):
super(ViewerManifest, self).construct()
@@ -169,13 +172,6 @@ class WindowsManifest(ViewerManifest):
else:
return ''.join(self.channel().split()) + '.exe'
- def is_packaging_viewer(self):
- # Some commands, files will only be included
- # if we are packaging the viewer on windows.
- # This manifest is also used to copy
- # files during the build.
- return 'package' in self.args['actions']
-
def test_msvcrt_and_copy_action(self, src, dst):
# This is used to test a dll manifest.
# It is used as a temporary override during the construct method
@@ -930,7 +926,7 @@ class Linux_i686Manifest(LinuxManifest):
self.path("libvivoxplatform.so")
self.end_prefix("lib")
- if self.args['buildtype'].lower() == 'release':
+ if self.args['buildtype'].lower() == 'release' and self.is_packaging_viewer():
print "* Going strip-crazy on the packaged binaries, since this is a RELEASE build"
self.run_command("find %(d)r/bin %(d)r/lib -type f | xargs --no-run-if-empty strip -S" % {'d': self.get_dst_prefix()} ) # makes some small assumptions about our packaged dir structure