OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2015 The Chromium Authors. All rights reserved. | 2 # Copyright 2015 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 import argparse | 6 import argparse |
7 import logging | 7 import logging |
8 import os | 8 import os |
9 import re | |
10 import sys | 9 import sys |
| 10 import subprocess |
11 | 11 |
12 # TODO(eseidel): This should be shared with tools/android_stack_parser/stack | 12 # TODO(eseidel): Share logic with tools/android_stack_parser/stack |
13 # TODO(eseidel): This could be replaced by using build-ids on Android | |
14 # TODO(eseidel): mojo_shell should write out a cache mapping file. | |
15 def main(): | 13 def main(): |
16 logging.basicConfig(level=logging.INFO) | 14 logging.basicConfig(level=logging.INFO) |
17 parser = argparse.ArgumentParser( | 15 parser = argparse.ArgumentParser( |
18 description='Watches mojo_shell logcat output and builds a directory ' | 16 description='Builds a directory of app_id symlinks to symbols' |
19 'of symlinks to symboled binaries for seen cache names.') | 17 ' to match expected dlopen names from mojo_shell\'s NetworkLoader.') |
20 parser.add_argument('links_dir', type=str) | 18 parser.add_argument('links_dir', type=str) |
21 parser.add_argument('symbols_dir', type=str) | 19 parser.add_argument('build_dir', type=str) |
22 parser.add_argument('base_url', type=str) | |
23 args = parser.parse_args() | 20 args = parser.parse_args() |
24 | 21 |
25 regex = re.compile('Caching mojo app (?P<url>\S+) at (?P<path>\S+)') | |
26 | |
27 if not os.path.isdir(args.links_dir): | 22 if not os.path.isdir(args.links_dir): |
28 logging.fatal('links_dir: %s is not a directory' % args.links_dir) | 23 logging.fatal('links_dir: %s is not a directory' % args.links_dir) |
29 sys.exit(1) | 24 sys.exit(1) |
30 | 25 |
31 for line in sys.stdin: | 26 for name in os.listdir(args.build_dir): |
32 result = regex.search(line) | 27 path = os.path.join(args.build_dir, name) |
33 if not result: | 28 if not os.path.isfile(path): |
34 continue | 29 continue |
35 | 30 |
36 url = result.group('url') | 31 # md5sum is slow, so only bother for suffixes we care about: |
37 if not url.startswith(args.base_url): | 32 basename, ext = os.path.splitext(name) |
38 logging.debug('%s does not match base %s' % (url, args.base_url)) | 33 if ext not in ('', '.mojo', '.so'): |
39 continue | |
40 full_name = os.path.basename(url) | |
41 name, ext = os.path.splitext(full_name) | |
42 if ext != '.mojo': | |
43 logging.debug('%s is not a .mojo library' % url) | |
44 continue | 34 continue |
45 | 35 |
46 symboled_name = 'lib%s_library.so' % name | 36 # Ignore ninja's dot-files. |
47 cache_link_path = os.path.join(args.links_dir, | 37 if basename.startswith('.'): |
48 os.path.basename(result.group('path'))) | |
49 symboled_path = os.path.realpath( | |
50 os.path.join(args.symbols_dir, symboled_name)) | |
51 if not os.path.isfile(symboled_path): | |
52 logging.warn('symboled path %s does not exist' % symboled_path) | |
53 continue | 38 continue |
54 | 39 |
55 print "%s -> %s" % (cache_link_path, symboled_path) | 40 # Example output: |
| 41 # f82a3551478a9a0e010adccd675053b9 png_viewer.mojo |
| 42 md5 = subprocess.check_output(['md5sum', path]).strip().split()[0] |
| 43 link_path = os.path.join(args.links_dir, '%s.mojo' % md5) |
56 | 44 |
57 if os.path.lexists(cache_link_path): | 45 lib_path = os.path.realpath(os.path.join(args.build_dir, name)) |
58 logging.debug('link already exists %s, replacing' % symboled_path) | |
59 os.unlink(cache_link_path) | |
60 | 46 |
61 os.symlink(symboled_path, cache_link_path) | 47 # On android foo.mojo is stripped, but libfoo_library.so is not. |
| 48 if ext == '.mojo': |
| 49 symboled_name = 'lib%s_library.so' % basename |
| 50 symboled_path = os.path.realpath( |
| 51 os.path.join(args.build_dir, symboled_name)) |
| 52 if os.path.exists(symboled_path): |
| 53 lib_path = symboled_path |
| 54 |
| 55 print "%s -> %s" % (link_path, lib_path) |
| 56 |
| 57 if os.path.lexists(link_path): |
| 58 logging.debug('link already exists %s, replacing' % lib_path) |
| 59 os.unlink(link_path) |
| 60 |
| 61 os.symlink(lib_path, link_path) |
62 | 62 |
63 if __name__ == '__main__': | 63 if __name__ == '__main__': |
64 main() | 64 main() |
OLD | NEW |