2 # Copyright 2011 The Chromium Authors
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
5 # based on an almost identical script by: jyrki@google.com (Jyrki Alakuijala)
7 """Prints out include dependencies in chrome.
9 Since it ignores defines, it gives just a rough estimation of file size.
12 tools/include_tracer.py -Iout/Default/gen chrome/browser/ui/browser.h
15 from __future__ import print_function
22 # Created by copying the command line for prerender_browsertest.cc, replacing
23 # spaces with newlines, and dropping everything except -F and -I switches.
24 # TODO(port): Add windows, linux directories.
30 'testing/gmock/include',
31 'testing/gtest/include',
32 'third_party/google_toolbox_for_mac/src',
33 'third_party/icu/public/common',
34 'third_party/icu/public/i18n',
35 'third_party/protobuf',
36 'third_party/protobuf/src',
37 'third_party/skia/gpu/include',
38 'third_party/skia/include/config',
39 'third_party/skia/include/core',
40 'third_party/skia/include/effects',
41 'third_party/skia/include/gpu',
42 'third_party/skia/include/pdf',
43 'third_party/skia/include/ports',
48 def Walk(include_dirs, seen, filename, parent, indent):
49 """Returns the size of |filename| plus the size of all files included by
50 |filename| and prints the include tree of |filename| to stdout. Every file
51 is visited at most once.
55 # .proto(devel) filename translation
56 if filename.endswith('.pb.h'):
57 basename = filename[:-5]
58 if os.path.exists(basename + '.proto'):
59 filename = basename + '.proto'
61 print('could not find ', filename)
63 # Show and count files only once.
69 print(' ' * indent + filename)
71 # Skip system includes.
72 if filename[0] == '<':
75 # Find file in all include paths.
76 resolved_filename = filename
77 for root in INCLUDE_PATHS + [os.path.dirname(parent)] + include_dirs:
78 if os.path.exists(os.path.join(root, filename)):
79 resolved_filename = os.path.join(root, filename)
83 if os.path.exists(resolved_filename):
84 lines = open(resolved_filename).readlines()
86 print(' ' * (indent + 2) + "-- not found")
90 match = re.match(r'#include\s+(\S+).*', line)
92 include = match.group(1)
93 if include.startswith('"'):
94 include = include[1:-1]
96 include_dirs, seen, include, resolved_filename, indent + 2)
97 elif line.startswith('import '):
99 include_dirs, seen, line.split('"')[1], resolved_filename, indent + 2)
100 return total_bytes + len("".join(lines))
104 parser = argparse.ArgumentParser()
105 parser.add_argument('-I', action='append', dest='include_dirs')
106 parser.add_argument('source_file')
107 options = parser.parse_args(sys.argv[1:])
108 if not options.include_dirs:
109 options.include_dirs = []
111 bytes = Walk(options.include_dirs, set(), options.source_file, '', 0)
113 print(float(bytes) / (1 << 20), "megabytes of chrome source")
116 if __name__ == '__main__':