Port breakpad symbol uploading to AMBuild 2 (bug 5997 part 16, r=ds).

This commit is contained in:
David Anderson 2013-12-30 17:51:02 -05:00
parent a55b000273
commit cfad3b26ca
5 changed files with 76 additions and 33 deletions

View File

@ -468,3 +468,6 @@ builder.RunBuildScripts(
'SM': SM 'SM': SM
} }
) )
if builder.options.breakpad_dump:
builder.RunScript('tools/buildbot/BreakpadSymbols', { 'SM': SM })

View File

@ -23,4 +23,6 @@ run.options.add_option('--no-mysql', action='store_false', default=True, dest='h
run.options.add_option('-s', '--sdks', default='all', dest='sdks', run.options.add_option('-s', '--sdks', default='all', dest='sdks',
help='Build against specified SDKs; valid args are "all", "present", or ' help='Build against specified SDKs; valid args are "all", "present", or '
'comma-delimited list of engine names (default: %default)') 'comma-delimited list of engine names (default: %default)')
run.options.add_option('--breakpad-dump', action='store_true', dest='breakpad_dump',
default=False, help='Dump and upload breakpad symbols')
run.Configure() run.Configure()

View File

@ -1,31 +1,35 @@
# vim: set ts=2 sw=2 tw=99 noet ft=python: # vim: set ts=2 sw=2 tw=99 noet ft=python:
import os import os, sys
try:
import urllib.request as urllib
except ImportError:
import urllib2 as urllib
from ambuild.command import Command
from ambuild.command import ShellCommand
class IterateDebugInfoCommand(Command): builder.SetBuildFolder('symbols')
def run(self, master, job):
pdblog = open(os.path.join(AMBuild.outputFolder, 'pdblog.txt'), 'rt') UPLOAD_SCRIPT = os.path.join(builder.sourcePath, 'tools', 'buildbot', 'upload_symbols.py')
for debug_info in pdblog:
debug_info = os.path.join(AMBuild.outputFolder, debug_info.strip()) cxx_tasks = SM.binaries + SM.extensions + [SM.spcomp]
job.AddCommand(SymbolCommand(debug_info, symbolServer)) for cxx_task in cxx_tasks:
pdblog.close() if builder.target_platform in ['windows']:
debug_entry = cxx_task.debug
else:
debug_entry = cxx_task.binary
debug_file = os.path.join(builder.buildPath, debug_entry.path)
if builder.target_platform is 'linux':
argv = ['dump_syms', debug_file, os.path.dirname(debug_file)]
elif builder.target_platform is 'mac':
argv = ['dump_syms', debug_file]
elif builder.target_platform is 'windows':
argv = ['dump_syms.exe', debug_file]
base_file = os.path.splitext(os.path.basename(debug_file))[0]
symbol_file = base_file + '.breakpad'
argv = [sys.executable, UPLOAD_SCRIPT, symbol_file] + argv
builder.AddCommand(
inputs = [UPLOAD_SCRIPT, debug_file],
argv = argv,
outputs = [symbol_file]
)
class SymbolCommand(ShellCommand):
def __init__(self, debugFile, symbolServer):
self.serverResponse = None
self.symbolServer = symbolServer
if AMBuild.target['platform'] == 'linux':
cmdstring = "dump_syms {0} {1}".format(debugFile, os.path.dirname(debugFile))
elif AMBuild.target['platform'] == 'darwin':
cmdstring = "dump_syms {0}".format(debugFile)
elif AMBuild.target['platform'] == 'windows':
cmdstring = "dump_syms.exe {0}".format(debugFile)
ShellCommand.__init__(self, cmdstring)
def run(self, master, job): def run(self, master, job):
ShellCommand.run(self, master, job) ShellCommand.run(self, master, job)
if self.stdout != None and len(self.stdout) > 0: if self.stdout != None and len(self.stdout) > 0:
@ -37,8 +41,3 @@ class SymbolCommand(ShellCommand):
runner.PrintOut(self.stderr) runner.PrintOut(self.stderr)
if self.serverResponse != None and len(self.serverResponse) > 0: if self.serverResponse != None and len(self.serverResponse) > 0:
runner.PrintOut(self.serverResponse) runner.PrintOut(self.serverResponse)
if 'BREAKPAD_SYMBOL_SERVER' in os.environ:
symbolServer = os.environ['BREAKPAD_SYMBOL_SERVER']
job = AMBuild.AddJob('breakpad-symbols')
job.AddCommand(IterateDebugInfoCommand())

View File

@ -26,13 +26,14 @@ if (!(-f 'OUTPUT/.ambuild2/graph') || !(-f 'OUTPUT/.ambuild2/vars')) {
my ($result, $argn); my ($result, $argn);
$argn = $#ARGV + 1; $argn = $#ARGV + 1;
print "Attempting to reconfigure...\n"; print "Attempting to reconfigure...\n";
my $conf_args = '--enable-optimize --breakpad-dump';
if ($argn > 0 && $^O !~ /MSWin/) { if ($argn > 0 && $^O !~ /MSWin/) {
$result = `CC=$ARGV[0] CXX=$ARGV[0] python ../build/configure.py --enable-optimize`; $result = `CC=$ARGV[0] CXX=$ARGV[0] python ../build/configure.py $conf_args`;
} else { } else {
if ($^O =~ /MSWin/) { if ($^O =~ /MSWin/) {
$result = `C:\\Python27\\Python.exe ..\\build\\configure.py --enable-optimize`; $result = `C:\\Python27\\Python.exe ..\\build\\configure.py $conf_args`;
} else { } else {
$result = `CC=clang CXX=clang python ../build/configure.py --enable-optimize`; $result = `CC=clang CXX=clang python ../build/configure.py $conf_args`;
} }
} }
print "$result\n"; print "$result\n";

View File

@ -0,0 +1,38 @@
# vim: ts=8 sts=2 sw=2 tw=99 et ft=python:
import sys
import subprocess
import os
try:
import urllib.request as urllib
except ImportError:
import urllib2 as urllib
if len(sys.argv) < 3:
sys.stderr.write('Usage: <symbol-file> <dump-syms-cmd> <args...>\n')
sys.exit(1)
SYMBOL_SERVER = os.environ['BREAKPAD_SYMBOL_SERVER']
symbol_file = sys.argv[1]
cmd_argv = sys.argv[2:]
sys.stdout.write(' '.join(cmd_argv))
sys.stdout.write('\n')
p = subprocess.Popen(
args = cmd_argv,
stdout = subprocess.PIPE,
stderr = subprocess.PIPE,
shell = False
)
stdout, stderr = p.communicate()
out = stdout.decode('utf8')
err = stdout.decode('utf8')
with open(symbol_file, 'w') as fp:
fp.write(stdout)
fp.write(stderr)
request = urllib.Request(SYMBOL_SERVER, out)
request.add_header('Content-Type', 'text/plain')
server_response = urllib.urlopen(request).read().decode('utf8')
print(server_response)