|  | #!/usr/bin/env python | 
|  | # Copyright (c) 2011 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. | 
|  | # based on an almost identical script by: jyrki@google.com (Jyrki Alakuijala) | 
|  |  | 
|  | """Prints out include dependencies in chrome. | 
|  |  | 
|  | Since it ignores defines, it gives just a rough estimation of file size. | 
|  |  | 
|  | Usage: | 
|  | tools/include_tracer.py chrome/browser/ui/browser.h | 
|  | """ | 
|  |  | 
|  | import os | 
|  | import sys | 
|  |  | 
|  | # Created by copying the command line for prerender_browsertest.cc, replacing | 
|  | # spaces with newlines, and dropping everything except -F and -I switches. | 
|  | # TODO(port): Add windows, linux directories. | 
|  | INCLUDE_PATHS = [ | 
|  | '', | 
|  | 'gpu', | 
|  | 'skia/config', | 
|  | 'skia/ext', | 
|  | 'testing/gmock/include', | 
|  | 'testing/gtest/include', | 
|  | 'third_party/WebKit/Source', | 
|  | 'third_party/WebKit/Source/core', | 
|  | 'third_party/WebKit/Source/core/accessibility', | 
|  | 'third_party/WebKit/Source/core/accessibility/chromium', | 
|  | 'third_party/WebKit/Source/core/bindings', | 
|  | 'third_party/WebKit/Source/core/bindings/generic', | 
|  | 'third_party/WebKit/Source/core/bindings/v8', | 
|  | 'third_party/WebKit/Source/core/bindings/v8/custom', | 
|  | 'third_party/WebKit/Source/core/bindings/v8/specialization', | 
|  | 'third_party/WebKit/Source/core/bridge', | 
|  | 'third_party/WebKit/Source/core/bridge/jni', | 
|  | 'third_party/WebKit/Source/core/bridge/jni/v8', | 
|  | 'third_party/WebKit/Source/core/css', | 
|  | 'third_party/WebKit/Source/core/dom', | 
|  | 'third_party/WebKit/Source/core/dom/default', | 
|  | 'third_party/WebKit/Source/core/editing', | 
|  | 'third_party/WebKit/Source/core/fileapi', | 
|  | 'third_party/WebKit/Source/core/history', | 
|  | 'third_party/WebKit/Source/core/html', | 
|  | 'third_party/WebKit/Source/core/html/canvas', | 
|  | 'third_party/WebKit/Source/core/html/parser', | 
|  | 'third_party/WebKit/Source/core/html/shadow', | 
|  | 'third_party/WebKit/Source/core/inspector', | 
|  | 'third_party/WebKit/Source/core/loader', | 
|  | 'third_party/WebKit/Source/core/loader/appcache', | 
|  | 'third_party/WebKit/Source/core/loader/archive', | 
|  | 'third_party/WebKit/Source/core/loader/cache', | 
|  | 'third_party/WebKit/Source/core/loader/icon', | 
|  | 'third_party/WebKit/Source/core/mathml', | 
|  | 'third_party/WebKit/Source/core/notifications', | 
|  | 'third_party/WebKit/Source/core/page', | 
|  | 'third_party/WebKit/Source/core/page/animation', | 
|  | 'third_party/WebKit/Source/core/page/chromium', | 
|  | 'third_party/WebKit/Source/core/platform', | 
|  | 'third_party/WebKit/Source/core/platform/animation', | 
|  | 'third_party/WebKit/Source/core/platform/audio', | 
|  | 'third_party/WebKit/Source/core/platform/audio/chromium', | 
|  | 'third_party/WebKit/Source/core/platform/audio/mac', | 
|  | 'third_party/WebKit/Source/core/platform/chromium', | 
|  | 'third_party/WebKit/Source/core/platform/cocoa', | 
|  | 'third_party/WebKit/Source/core/platform/graphics', | 
|  | 'third_party/WebKit/Source/core/platform/graphics/cg', | 
|  | 'third_party/WebKit/Source/core/platform/graphics/chromium', | 
|  | 'third_party/WebKit/Source/core/platform/graphics/cocoa', | 
|  | 'third_party/WebKit/Source/core/platform/graphics/filters', | 
|  | 'third_party/WebKit/Source/core/platform/graphics/gpu', | 
|  | 'third_party/WebKit/Source/core/platform/graphics/mac', | 
|  | 'third_party/WebKit/Source/core/platform/graphics/opentype', | 
|  | 'third_party/WebKit/Source/core/platform/graphics/skia', | 
|  | 'third_party/WebKit/Source/core/platform/graphics/transforms', | 
|  | 'third_party/WebKit/Source/core/platform/image-decoders', | 
|  | 'third_party/WebKit/Source/core/platform/image-decoders/bmp', | 
|  | 'third_party/WebKit/Source/core/platform/image-decoders/gif', | 
|  | 'third_party/WebKit/Source/core/platform/image-decoders/ico', | 
|  | 'third_party/WebKit/Source/core/platform/image-decoders/jpeg', | 
|  | 'third_party/WebKit/Source/core/platform/image-decoders/png', | 
|  | 'third_party/WebKit/Source/core/platform/image-decoders/skia', | 
|  | 'third_party/WebKit/Source/core/platform/image-decoders/webp', | 
|  | 'third_party/WebKit/Source/core/platform/image-decoders/xbm', | 
|  | 'third_party/WebKit/Source/core/platform/image-encoders/skia', | 
|  | 'third_party/WebKit/Source/core/platform/mac', | 
|  | 'third_party/WebKit/Source/core/platform/mock', | 
|  | 'third_party/WebKit/Source/core/platform/network', | 
|  | 'third_party/WebKit/Source/core/platform/network/chromium', | 
|  | 'third_party/WebKit/Source/core/platform/sql', | 
|  | 'third_party/WebKit/Source/core/platform/text', | 
|  | 'third_party/WebKit/Source/core/platform/text/mac', | 
|  | 'third_party/WebKit/Source/core/platform/text/transcoder', | 
|  | 'third_party/WebKit/Source/core/plugins', | 
|  | 'third_party/WebKit/Source/core/plugins/chromium', | 
|  | 'third_party/WebKit/Source/core/rendering', | 
|  | 'third_party/WebKit/Source/core/rendering/style', | 
|  | 'third_party/WebKit/Source/core/rendering/svg', | 
|  | 'third_party/WebKit/Source/core/storage', | 
|  | 'third_party/WebKit/Source/core/storage/chromium', | 
|  | 'third_party/WebKit/Source/core/svg', | 
|  | 'third_party/WebKit/Source/core/svg/animation', | 
|  | 'third_party/WebKit/Source/core/svg/graphics', | 
|  | 'third_party/WebKit/Source/core/svg/graphics/filters', | 
|  | 'third_party/WebKit/Source/core/svg/properties', | 
|  | 'third_party/WebKit/Source/core/webaudio', | 
|  | 'third_party/WebKit/Source/core/websockets', | 
|  | 'third_party/WebKit/Source/core/workers', | 
|  | 'third_party/WebKit/Source/core/xml', | 
|  | 'third_party/WebKit/Source/public', | 
|  | 'third_party/WebKit/Source/web', | 
|  | 'third_party/WebKit/Source/wtf', | 
|  | 'third_party/cld', | 
|  | 'third_party/google_toolbox_for_mac/src', | 
|  | 'third_party/icu/public/common', | 
|  | 'third_party/icu/public/i18n', | 
|  | 'third_party/npapi', | 
|  | 'third_party/npapi/bindings', | 
|  | 'third_party/protobuf', | 
|  | 'third_party/protobuf/src', | 
|  | 'third_party/skia/gpu/include', | 
|  | 'third_party/skia/include/config', | 
|  | 'third_party/skia/include/core', | 
|  | 'third_party/skia/include/effects', | 
|  | 'third_party/skia/include/gpu', | 
|  | 'third_party/skia/include/pdf', | 
|  | 'third_party/skia/include/ports', | 
|  | 'v8/include', | 
|  | 'xcodebuild/Debug/include', | 
|  | 'xcodebuild/DerivedSources/Debug/chrome', | 
|  | 'xcodebuild/DerivedSources/Debug/policy', | 
|  | 'xcodebuild/DerivedSources/Debug/protoc_out', | 
|  | 'xcodebuild/DerivedSources/Debug/webkit', | 
|  | 'xcodebuild/DerivedSources/Debug/webkit/bindings', | 
|  | ] | 
|  |  | 
|  |  | 
|  | def Walk(seen, filename, parent, indent): | 
|  | """Returns the size of |filename| plus the size of all files included by | 
|  | |filename| and prints the include tree of |filename| to stdout. Every file | 
|  | is visited at most once. | 
|  | """ | 
|  | total_bytes = 0 | 
|  |  | 
|  | # .proto(devel) filename translation | 
|  | if filename.endswith('.pb.h'): | 
|  | basename = filename[:-5] | 
|  | if os.path.exists(basename + '.proto'): | 
|  | filename = basename + '.proto' | 
|  | else: | 
|  | print 'could not find ', filename | 
|  |  | 
|  | # Show and count files only once. | 
|  | if filename in seen: | 
|  | return total_bytes | 
|  | seen.add(filename) | 
|  |  | 
|  | # Display the paths. | 
|  | print ' ' * indent + filename | 
|  |  | 
|  | # Skip system includes. | 
|  | if filename[0] == '<': | 
|  | return total_bytes | 
|  |  | 
|  | # Find file in all include paths. | 
|  | resolved_filename = filename | 
|  | for root in INCLUDE_PATHS + [os.path.dirname(parent)]: | 
|  | if os.path.exists(os.path.join(root, filename)): | 
|  | resolved_filename = os.path.join(root, filename) | 
|  | break | 
|  |  | 
|  | # Recurse. | 
|  | if os.path.exists(resolved_filename): | 
|  | lines = open(resolved_filename).readlines() | 
|  | else: | 
|  | print ' ' * (indent + 2) + "-- not found" | 
|  | lines = [] | 
|  | for line in lines: | 
|  | line = line.strip() | 
|  | if line.startswith('#include "'): | 
|  | total_bytes += Walk( | 
|  | seen, line.split('"')[1], resolved_filename, indent + 2) | 
|  | elif line.startswith('#include '): | 
|  | include = '<' + line.split('<')[1].split('>')[0] + '>' | 
|  | total_bytes += Walk( | 
|  | seen, include, resolved_filename, indent + 2) | 
|  | elif line.startswith('import '): | 
|  | total_bytes += Walk( | 
|  | seen, line.split('"')[1], resolved_filename, indent + 2) | 
|  | return total_bytes + len("".join(lines)) | 
|  |  | 
|  |  | 
|  | def main(): | 
|  | bytes = Walk(set(), sys.argv[1], '', 0) | 
|  | print | 
|  | print float(bytes) / (1 << 20), "megabytes of chrome source" | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | sys.exit(main()) |