OLD | NEW |
| (Empty) |
1 #!/usr/bin/env python | |
2 # Copyright (c) 2013 The Chromium Authors. All rights reserved. | |
3 # Use of this source code is governed by a BSD-style license that can be | |
4 # found in the LICENSE file. | |
5 | |
6 """ Detect static initializers in compiled Skia code. """ | |
7 | |
8 from build_step import BuildStep, BuildStepWarning | |
9 from py.utils import shell_utils | |
10 import os | |
11 import re | |
12 import sys | |
13 import urllib2 | |
14 | |
15 | |
16 DUMP_STATIC_INITIALIZERS_FILENAME = 'dump-static-initializers.py' | |
17 DUMP_STATIC_INITIALIZERS_URL = ('http://src.chromium.org/svn/trunk/src/tools/' | |
18 + 'linux/' + DUMP_STATIC_INITIALIZERS_FILENAME) | |
19 | |
20 | |
21 class DetectStaticInitializers(BuildStep): | |
22 def _Run(self): | |
23 # Build the Skia libraries in Release mode. | |
24 os.environ['GYP_DEFINES'] = 'skia_static_initializers=0' | |
25 shell_utils.run(['python', 'gyp_skia']) | |
26 shell_utils.run(['make', 'skia_lib', 'BUILDTYPE=Release', '--jobs']) | |
27 | |
28 # Obtain the dump-static-initializers script. | |
29 print 'Downloading %s' % DUMP_STATIC_INITIALIZERS_URL | |
30 dl = urllib2.urlopen(DUMP_STATIC_INITIALIZERS_URL) | |
31 with open(DUMP_STATIC_INITIALIZERS_FILENAME, 'wb') as f: | |
32 f.write(dl.read()) | |
33 | |
34 # Run the script over the compiled files. | |
35 results = [] | |
36 for built_file_name in os.listdir(os.path.join('out', 'Release')): | |
37 if built_file_name.endswith('.a') or built_file_name.endswith('.so'): | |
38 output = shell_utils.run(['python', DUMP_STATIC_INITIALIZERS_FILENAME, | |
39 os.path.join('out', 'Release', | |
40 built_file_name)]) | |
41 matches = re.search('Found (\d+) static initializers', output) | |
42 if matches: | |
43 num_found = int(matches.groups()[0]) | |
44 if num_found: | |
45 results.append((built_file_name, num_found)) | |
46 if results: | |
47 print | |
48 print 'Found static initializers:' | |
49 print | |
50 for result in results: | |
51 print ' %s: %d' % result | |
52 print | |
53 # TODO(borenet): Make this an error once we have no static initializers. | |
54 raise BuildStepWarning('Static initializers found!') | |
55 | |
56 | |
57 if '__main__' == __name__: | |
58 sys.exit(BuildStep.RunBuildStep(DetectStaticInitializers)) | |
OLD | NEW |