blob: 4592eba39a476177e66f4b9573a84dd2307639b9 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2015 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import logging
import os
import re
import sys
# TODO(eseidel): This should be shared with tools/android_stack_parser/stack
# TODO(eseidel): This could be replaced by using build-ids on Android
# TODO(eseidel): mojo_shell should write out a cache mapping file.
def main():
logging.basicConfig(level=logging.INFO)
parser = argparse.ArgumentParser(
description='Watches mojo_shell logcat output and builds a directory '
'of symlinks to symboled binaries for seen cache names.')
parser.add_argument('links_dir', type=str)
parser.add_argument('symbols_dir', type=str)
parser.add_argument('base_url', type=str)
args = parser.parse_args()
regex = re.compile('Caching mojo app (?P<url>\S+) at (?P<path>\S+)')
if not os.path.isdir(args.links_dir):
logging.fatal('links_dir: %s is not a directory' % args.links_dir)
sys.exit(1)
for line in sys.stdin:
result = regex.search(line)
if not result:
continue
url = result.group('url')
if not url.startswith(args.base_url):
logging.debug('%s does not match base %s' % (url, args.base_url))
continue
full_name = os.path.basename(url)
name, ext = os.path.splitext(full_name)
if ext != '.mojo':
logging.debug('%s is not a .mojo library' % url)
continue
symboled_name = 'lib%s_library.so' % name
cache_link_path = os.path.join(args.links_dir,
os.path.basename(result.group('path')))
symboled_path = os.path.realpath(
os.path.join(args.symbols_dir, symboled_name))
if not os.path.isfile(symboled_path):
logging.warn('symboled path %s does not exist' % symboled_path)
continue
print "%s -> %s" % (cache_link_path, symboled_path)
if os.path.lexists(cache_link_path):
logging.debug('link already exists %s, replacing' % symboled_path)
os.unlink(cache_link_path)
os.symlink(symboled_path, cache_link_path)
if __name__ == '__main__':
main()