| #!/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/GTM', |
| 'third_party/WebKit/Source', |
| 'third_party/WebKit/Source/JavaScriptCore', |
| 'third_party/WebKit/Source/JavaScriptCore/wtf', |
| 'third_party/WebKit/Source/ThirdParty/glu', |
| 'third_party/WebKit/Source/WebCore', |
| 'third_party/WebKit/Source/WebCore/accessibility', |
| 'third_party/WebKit/Source/WebCore/accessibility/chromium', |
| 'third_party/WebKit/Source/WebCore/bindings', |
| 'third_party/WebKit/Source/WebCore/bindings/generic', |
| 'third_party/WebKit/Source/WebCore/bindings/v8', |
| 'third_party/WebKit/Source/WebCore/bindings/v8/custom', |
| 'third_party/WebKit/Source/WebCore/bindings/v8/specialization', |
| 'third_party/WebKit/Source/WebCore/bridge', |
| 'third_party/WebKit/Source/WebCore/bridge/jni', |
| 'third_party/WebKit/Source/WebCore/bridge/jni/v8', |
| 'third_party/WebKit/Source/WebCore/css', |
| 'third_party/WebKit/Source/WebCore/dom', |
| 'third_party/WebKit/Source/WebCore/dom/default', |
| 'third_party/WebKit/Source/WebCore/editing', |
| 'third_party/WebKit/Source/WebCore/fileapi', |
| 'third_party/WebKit/Source/WebCore/history', |
| 'third_party/WebKit/Source/WebCore/html', |
| 'third_party/WebKit/Source/WebCore/html/canvas', |
| 'third_party/WebKit/Source/WebCore/html/parser', |
| 'third_party/WebKit/Source/WebCore/html/shadow', |
| 'third_party/WebKit/Source/WebCore/inspector', |
| 'third_party/WebKit/Source/WebCore/loader', |
| 'third_party/WebKit/Source/WebCore/loader/appcache', |
| 'third_party/WebKit/Source/WebCore/loader/archive', |
| 'third_party/WebKit/Source/WebCore/loader/cache', |
| 'third_party/WebKit/Source/WebCore/loader/icon', |
| 'third_party/WebKit/Source/WebCore/mathml', |
| 'third_party/WebKit/Source/WebCore/notifications', |
| 'third_party/WebKit/Source/WebCore/page', |
| 'third_party/WebKit/Source/WebCore/page/animation', |
| 'third_party/WebKit/Source/WebCore/page/chromium', |
| 'third_party/WebKit/Source/WebCore/platform', |
| 'third_party/WebKit/Source/WebCore/platform/animation', |
| 'third_party/WebKit/Source/WebCore/platform/audio', |
| 'third_party/WebKit/Source/WebCore/platform/audio/chromium', |
| 'third_party/WebKit/Source/WebCore/platform/audio/mac', |
| 'third_party/WebKit/Source/WebCore/platform/chromium', |
| 'third_party/WebKit/Source/WebCore/platform/cocoa', |
| 'third_party/WebKit/Source/WebCore/platform/graphics', |
| 'third_party/WebKit/Source/WebCore/platform/graphics/cg', |
| 'third_party/WebKit/Source/WebCore/platform/graphics/chromium', |
| 'third_party/WebKit/Source/WebCore/platform/graphics/cocoa', |
| 'third_party/WebKit/Source/WebCore/platform/graphics/filters', |
| 'third_party/WebKit/Source/WebCore/platform/graphics/gpu', |
| 'third_party/WebKit/Source/WebCore/platform/graphics/mac', |
| 'third_party/WebKit/Source/WebCore/platform/graphics/opentype', |
| 'third_party/WebKit/Source/WebCore/platform/graphics/skia', |
| 'third_party/WebKit/Source/WebCore/platform/graphics/transforms', |
| 'third_party/WebKit/Source/WebCore/platform/image-decoders', |
| 'third_party/WebKit/Source/WebCore/platform/image-decoders/bmp', |
| 'third_party/WebKit/Source/WebCore/platform/image-decoders/gif', |
| 'third_party/WebKit/Source/WebCore/platform/image-decoders/ico', |
| 'third_party/WebKit/Source/WebCore/platform/image-decoders/jpeg', |
| 'third_party/WebKit/Source/WebCore/platform/image-decoders/png', |
| 'third_party/WebKit/Source/WebCore/platform/image-decoders/skia', |
| 'third_party/WebKit/Source/WebCore/platform/image-decoders/webp', |
| 'third_party/WebKit/Source/WebCore/platform/image-decoders/xbm', |
| 'third_party/WebKit/Source/WebCore/platform/image-encoders/skia', |
| 'third_party/WebKit/Source/WebCore/platform/mac', |
| 'third_party/WebKit/Source/WebCore/platform/mock', |
| 'third_party/WebKit/Source/WebCore/platform/network', |
| 'third_party/WebKit/Source/WebCore/platform/network/chromium', |
| 'third_party/WebKit/Source/WebCore/platform/sql', |
| 'third_party/WebKit/Source/WebCore/platform/text', |
| 'third_party/WebKit/Source/WebCore/platform/text/mac', |
| 'third_party/WebKit/Source/WebCore/platform/text/transcoder', |
| 'third_party/WebKit/Source/WebCore/plugins', |
| 'third_party/WebKit/Source/WebCore/plugins/chromium', |
| 'third_party/WebKit/Source/WebCore/rendering', |
| 'third_party/WebKit/Source/WebCore/rendering/style', |
| 'third_party/WebKit/Source/WebCore/rendering/svg', |
| 'third_party/WebKit/Source/WebCore/storage', |
| 'third_party/WebKit/Source/WebCore/storage/chromium', |
| 'third_party/WebKit/Source/WebCore/svg', |
| 'third_party/WebKit/Source/WebCore/svg/animation', |
| 'third_party/WebKit/Source/WebCore/svg/graphics', |
| 'third_party/WebKit/Source/WebCore/svg/graphics/filters', |
| 'third_party/WebKit/Source/WebCore/svg/properties', |
| 'third_party/WebKit/Source/WebCore/webaudio', |
| 'third_party/WebKit/Source/WebCore/websockets', |
| 'third_party/WebKit/Source/WebCore/workers', |
| 'third_party/WebKit/Source/WebCore/xml', |
| 'third_party/WebKit/Source/WebKit/chromium/public', |
| 'third_party/WebKit/Source/WebKit/chromium/src', |
| 'third_party/WebKit/Source/WebKit/mac/WebCoreSupport', |
| 'third_party/WebKit/WebKitLibraries', |
| 'third_party/cld', |
| '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()) |