#!/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/wtf', '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/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())